[Resending, stupidly forgot to reply-all)

On Sat, Jan 26, 2019 at 9:01 AM Dhaval Giani <dhaval.gi...@gmail.com> wrote:
>
> On Thu, Jan 24, 2019 at 4:53 AM Tom Hromatka <tom.hroma...@oracle.com> wrote:
> >
> > This commit adds cgroup v2 support to cgget, cgset, and
> > cgroup_init().
> >
> > Signed-off-by: Tom Hromatka <tom.hroma...@oracle.com>
> > ---
> >  src/api.c                | 134 
> > +++++++++++++++++++++++++++++++++++++++++------
> >  src/libcgroup-internal.h |   6 +++
> >  2 files changed, 125 insertions(+), 15 deletions(-)
> >
> > diff --git a/src/api.c b/src/api.c
> > index 5003c32..18ace6e 100644
> > --- a/src/api.c
> > +++ b/src/api.c
> > @@ -63,6 +63,12 @@ static __thread char errtext[MAXLEN];
> >  /* Task command name length */
> >  #define TASK_COMM_LEN 16
> >
> > +/* cgroup v2 controllers file */
> > +#define CGV2_CONTROLLERS_FILE "cgroup.controllers"
> > +
>
> CGROUP_V2_CONTROLLERS_FILE please
>
> > +/* maximum line length when reading the cgroup.controllers file */
> > +#define LL_MAX                 100
> > +
>
> CGROUP_LL_MAX please
>
> >  /* Check if cgroup_init has been called or not. */
> >  static int cgroup_initialized;
> >
> > @@ -1021,6 +1027,7 @@ static int process_v1_mnt(char *controllers[], struct 
> > mntent *ent,
> >                 cg_mount_table[*found_mnt].mount.path[FILENAME_MAX-1] =
> >                         '\0';
> >                 cg_mount_table[*found_mnt].mount.next = NULL;
> > +               cg_mount_table[*found_mnt].version = CGROUP_V1;
> >                 cgroup_dbg("Found cgroup option %s, count %d\n",
> >                         ent->mnt_opts, *found_mnt);
> >                 (*found_mnt)++;
> > @@ -1083,6 +1090,96 @@ out:
> >  }
> >
> >  /**
> > + * Process a cgroup v2 mount and add it to cg_mount_table if it's not a
> > + * duplicate.
> > + *
> > + *     @param ent File system description of cgroup mount being processed
> > + *     @param found_mnt cg_mount_table index
> > + */
> > +static int process_v2_mnt(struct mntent *ent, int *found_mnt)
> > +{
> > +       char cgroup_controllers_path[FILENAME_MAX];
> > +       char *ret_c = NULL, line[LL_MAX], *stok_buff = NULL;
> > +       int ret, i, duplicate;
> > +       FILE *fp = NULL;
> > +
> > +       /* determine what v2 controllers are available on this mount */
> > +       snprintf(cgroup_controllers_path, FILENAME_MAX, "%s/%s", 
> > ent->mnt_dir,
> > +                CGV2_CONTROLLERS_FILE);
> > +
> > +       fp = fopen(cgroup_controllers_path, "re");
> > +       if (!fp) {
> > +               ret = ECGOTHER;
> > +               goto out;
> > +       }
> > +
> > +       ret_c = fgets(line, LL_MAX, fp);
> > +       if (ret_c == NULL) {
> > +               ret = ECGEOF;
> > +               goto out;
> > +       }
> > +
> > +       /* remove the trailing newline */
> > +       ret_c[strlen(ret_c) - 1] = '\0';
> > +
> > +       /*
> > +        * cgroup.controllers returns a list of available controllers in
> > +        * the following format:
> > +        *      cpuset cpu io memory pids rdma
> > +        */
> > +       stok_buff = strtok(ret_c, " ");
> > +       while (stok_buff) {
> > +               /* do not have duplicates in mount table */
> > +               duplicate = 0;
> > +
> > +               for  (i = 0; i < *found_mnt; i++) {
> > +                       if (strncmp(cg_mount_table[i].name, stok_buff,
> > +                                       FILENAME_MAX) == 0) {
> > +                               duplicate = 1;
> > +                               break;
> > +                       }
> > +               }
> > +
> > +               if (duplicate) {
> > +                       cgroup_dbg("controller %s is already mounted on 
> > %s\n",
> > +                               stok_buff, cg_mount_table[i].mount.path);
> > +
> > +                       ret = cg_add_duplicate_mount(&cg_mount_table[i],
> > +                                       ent->mnt_dir);
> > +                       if (ret)
> > +                               goto out;
> > +
> > +                       /* advance to the next controller */
> > +                       stok_buff = strtok(NULL, " ");
> > +                       continue;
> > +               }
> > +
> > +               /* this controller is not in the mount table.  add it */
> > +               strncpy(cg_mount_table[*found_mnt].name,
> > +                       stok_buff, FILENAME_MAX);
> > +               cg_mount_table[*found_mnt].name[FILENAME_MAX-1] = '\0';
> > +               strncpy(cg_mount_table[*found_mnt].mount.path,
> > +                       ent->mnt_dir, FILENAME_MAX);
> > +               cg_mount_table[*found_mnt].mount.path[FILENAME_MAX-1] =
> > +                       '\0';
> > +               cg_mount_table[*found_mnt].mount.next = NULL;
> > +               cg_mount_table[*found_mnt].version = CGROUP_V2;
> > +               cgroup_dbg("Found cgroup option %s, count %d\n",
> > +                       stok_buff, *found_mnt);
> > +               (*found_mnt)++;
> > +
> > +               /* advance to the next controller */
> > +               stok_buff = strtok(NULL, " ");
> > +       }
> > +
> > +out:
> > +       if (fp)
> > +               fclose(fp);
> > +
> > +       return ret;
> > +}
> > +
> > +/**
> >   * cgroup_init(), initializes the MOUNT_POINT.
> >   *
> >   * This code is theoretically thread safe now. Its not really tested
> > @@ -1189,6 +1286,11 @@ int cgroup_init(void)
> >                         if (ret)
> >                                 goto unlock_exit;
> >                 }
> > +               else if (strcmp(ent->mnt_type, "cgroup2") == 0) {
> > +                       ret = process_v2_mnt(ent, &found_mnt);
> > +                       if (ret)
> > +                               goto unlock_exit;
> > +               }
> >         }
> >
> >         free(temp_ent);
> > @@ -2616,25 +2718,27 @@ int cgroup_get_cgroup(struct cgroup *cgroup)
> >                  * Get the uid and gid information
> >                  */
> >
> > -               ret = asprintf(&control_path, "%s/tasks", path);
> > +               if (cg_mount_table[i].version == CGROUP_V1) {
> > +                       ret = asprintf(&control_path, "%s/tasks", path);
> >
> > -               if (ret < 0) {
> > -                       last_errno = errno;
> > -                       error = ECGOTHER;
> > -                       goto unlock_error;
> > -               }
> > +                       if (ret < 0) {
> > +                               last_errno = errno;
> > +                               error = ECGOTHER;
> > +                               goto unlock_error;
> > +                       }
> >
> > -               if (stat(control_path, &stat_buffer)) {
> > -                       last_errno = errno;
> > -                       free(control_path);
> > -                       error = ECGOTHER;
> > -                       goto unlock_error;
> > -               }
> > +                       if (stat(control_path, &stat_buffer)) {
> > +                               last_errno = errno;
> > +                               free(control_path);
> > +                               error = ECGOTHER;
> > +                               goto unlock_error;
> > +                       }
> >
> > -               cgroup->tasks_uid = stat_buffer.st_uid;
> > -               cgroup->tasks_gid = stat_buffer.st_gid;
> > +                       cgroup->tasks_uid = stat_buffer.st_uid;
> > +                       cgroup->tasks_gid = stat_buffer.st_gid;
> >
> > -               free(control_path);
> > +                       free(control_path);
> > +               }
> >
> >                 cgc = cgroup_add_controller(cgroup,
> >                                 cg_mount_table[i].name);
> > diff --git a/src/libcgroup-internal.h b/src/libcgroup-internal.h
> > index 9875dd9..1611ca6 100644
> > --- a/src/libcgroup-internal.h
> > +++ b/src/libcgroup-internal.h
> > @@ -106,6 +106,11 @@ struct cg_mount_point {
> >         struct cg_mount_point *next;
> >  };
> >
> > +enum cg_version_t {
> > +       CGROUP_V1,
> > +       CGROUP_V2,
> > +};
> > +
> >  struct cg_mount_table_s {
> >         /** Controller name. */
> >         char name[FILENAME_MAX];
> > @@ -114,6 +119,7 @@ struct cg_mount_table_s {
> >          */
> >         struct cg_mount_point mount;
> >         int index;
> > +       enum cg_version_t version;
>
> Does this break ABI?
>
> Dhaval
>
> >  };
> >
> >  struct cgroup_rules_data {
> > --
> > 1.8.3.1
> >
> >
> >
> > _______________________________________________
> > Libcg-devel mailing list
> > Libcg-devel@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/libcg-devel


_______________________________________________
Libcg-devel mailing list
Libcg-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to