[ovs-dev] [PATCH] ovs-numa: Add support for cpu-mask configuration.

Alex Wang alexw at nicira.com
Mon Sep 15 20:59:57 UTC 2014


sorry, will resend the whole series.

On Mon, Sep 15, 2014 at 1:01 PM, Pravin Shelar <pshelar at nicira.com> wrote:

> On Mon, Sep 15, 2014 at 12:33 PM, Alex Wang <alexw at nicira.com> wrote:
> > This commit adds support in ovs-numa module for reading a user
> > specified cpu mask, which configures the availability of the cores.
> >
> > The cpu mask has the format of a hex string similar to the EAL '-c
> > COREMASK' option input or the 'taskset' mask input.  The lowest order
> > bit corresponds to the first CPU core.  Bit value '1' means the
> > corresponding core is available.
> >
> > An upcoming patch will allow user to configure the mask via OVSDB.
>
> I am not sure if the mask should be stored in ovs-numa module but in
> any case if you send entire series it will be easier to understand the
> use-case.
>
>
> >
> > Signed-off-by: Alex Wang <alexw at nicira.com>
> > ---
> >  lib/ovs-numa.c |   92
> +++++++++++++++++++++++++++++++++++++++++++++++---------
> >  lib/ovs-numa.h |    7 +++++
> >  2 files changed, 85 insertions(+), 14 deletions(-)
> >
> > diff --git a/lib/ovs-numa.c b/lib/ovs-numa.c
> > index 7da1407..dabc955 100644
> > --- a/lib/ovs-numa.c
> > +++ b/lib/ovs-numa.c
> > @@ -69,6 +69,7 @@ struct cpu_core {
> >      struct list list_node;     /* In 'numa_node->cores' list. */
> >      struct numa_node *numa;    /* numa node containing the core. */
> >      int core_id;               /* Core id. */
> > +    bool available;            /* If the core can be pinned. */
> >      bool pinned;               /* If a thread has been pinned to the
> core. */
> >  };
> >
> > @@ -123,6 +124,7 @@ discover_numa_and_core(void)
> >                      list_insert(&n->cores, &c->list_node);
> >                      c->core_id = core_id;
> >                      c->numa = n;
> > +                    c->available = true;
> >                      n_cpus++;
> >                  }
> >              }
> > @@ -222,8 +224,8 @@ ovs_numa_get_n_cores_on_numa(int numa_id)
> >      return OVS_CORE_UNSPEC;
> >  }
> >
> > -/* Returns the number of unpinned cpu cores on numa node.  Returns
> > - * OVS_CORE_UNSPEC if 'numa_id' is invalid. */
> > +/* Returns the number of cpu cores that are available and unpinned
> > + * on numa node.  Returns OVS_CORE_UNSPEC if 'numa_id' is invalid. */
> >  int
> >  ovs_numa_get_n_unpinned_cores_on_numa(int numa_id)
> >  {
> > @@ -236,7 +238,7 @@ ovs_numa_get_n_unpinned_cores_on_numa(int numa_id)
> >                                                   hash_int(numa_id, 0)),
> >                              struct numa_node, hmap_node);
> >          LIST_FOR_EACH(core, list_node, &numa->cores) {
> > -            if (!core->pinned) {
> > +            if (core->available && !core->pinned) {
> >                  count++;
> >              }
> >          }
> > @@ -248,7 +250,8 @@ ovs_numa_get_n_unpinned_cores_on_numa(int numa_id)
> >  }
> >
> >  /* Given 'core_id', tries to pin that core.  Returns true, if succeeds.
> > - * False, if the core has already been pinned or if 'core_id' is
> invalid. */
> > + * False, if the core has already been pinned, or if it is invalid or
> > + * not available. */
> >  bool
> >  ovs_numa_try_pin_core_specific(int core_id)
> >  {
> > @@ -258,7 +261,7 @@ ovs_numa_try_pin_core_specific(int core_id)
> >          core = CONTAINER_OF(hmap_first_with_hash(&all_cpu_cores,
> >                                                   hash_int(core_id, 0)),
> >                              struct cpu_core, hmap_node);
> > -        if (!core->pinned) {
> > +        if (core->available && !core->pinned) {
> >              core->pinned = true;
> >              return true;
> >          }
> > @@ -267,16 +270,16 @@ ovs_numa_try_pin_core_specific(int core_id)
> >      return false;
> >  }
> >
> > -/* Searches through all cores for an unpinned core.  Returns the core_id
> > - * if found and set the 'core->pinned' to true.  Otherwise, returns
> > - * OVS_CORE_UNSPEC. */
> > +/* Searches through all cores for an unpinned and available core.
> Returns
> > + * the 'core_id' if found and sets the 'core->pinned' to true.
> Otherwise,
> > + * returns OVS_CORE_UNSPEC. */
> >  int
> >  ovs_numa_get_unpinned_core_any(void)
> >  {
> >      struct cpu_core *core;
> >
> >      HMAP_FOR_EACH(core, hmap_node, &all_cpu_cores) {
> > -        if (!core->pinned) {
> > +        if (core->available && !core->pinned) {
> >              core->pinned = true;
> >              return core->core_id;
> >          }
> > @@ -285,9 +288,9 @@ ovs_numa_get_unpinned_core_any(void)
> >      return OVS_CORE_UNSPEC;
> >  }
> >
> > -/* Searches through all cores on numa node with 'numa_id' for an
> unpinned
> > - * core.  Returns the core_id if found and sets the 'core->pinned' to
> true.
> > - * Otherwise, returns OVS_CORE_UNSPEC. */
> > +/* Searches through all cores on numa node with 'numa_id' for an
> > + * unpinned and available core.  Returns the core_id if found and
> > + * sets the 'core->pinned' to true.  Otherwise, returns
> OVS_CORE_UNSPEC. */
> >  int
> >  ovs_numa_get_unpinned_core_on_numa(int numa_id)
> >  {
> > @@ -299,7 +302,7 @@ ovs_numa_get_unpinned_core_on_numa(int numa_id)
> >                                                   hash_int(numa_id, 0)),
> >                              struct numa_node, hmap_node);
> >          LIST_FOR_EACH(core, list_node, &numa->cores) {
> > -            if (!core->pinned) {
> > +            if (core->available && !core->pinned) {
> >                  core->pinned = true;
> >                  return core->core_id;
> >              }
> > @@ -309,7 +312,7 @@ ovs_numa_get_unpinned_core_on_numa(int numa_id)
> >      return OVS_CORE_UNSPEC;
> >  }
> >
> > -/* Resets the 'core->pinned' for the core with 'core_id'. */
> > +/* Unpins the core with 'core_id'. */
> >  void
> >  ovs_numa_unpin_core(int core_id)
> >  {
> > @@ -323,4 +326,65 @@ ovs_numa_unpin_core(int core_id)
> >      }
> >  }
> >
> > +/* Reads the cpu mask configuration from 'cmask' and sets the
> > + * 'available' of corresponding cores.  For unspecified cores,
> > + * sets 'available' to true. */
> > +void
> > +ovs_numa_set_cpu_mask(const char *cmask)
> > +{
> > +    int core_id = 0;
> > +    int i;
> > +
> > +    if (!found_numa_and_core) {
> > +        return;
> > +    }
> > +
> > +    /* If no mask specified, resets the 'available' to true for all
> cores. */
> > +    if (!cmask) {
> > +        struct cpu_core *core;
> > +
> > +        HMAP_FOR_EACH(core, hmap_node, &all_cpu_cores) {
> > +            core->available = true;
> > +        }
> > +
> > +        return;
> > +    }
> > +
> > +    for (i = strlen(cmask) - 1; i >= 0; i--) {
> > +        char hex = toupper(cmask[i]);
> > +        int bin, j;
> > +
> > +        if (hex >= '0' && hex <= '9') {
> > +            bin = hex - '0';
> > +        } else if (hex >= 'A' && hex <= 'F') {
> > +            bin = hex - 'A' + 10;
> > +        } else {
> > +            bin = 0;
> > +        }
> > +
> > +        for (j = 0; j < 4; j++) {
> > +            struct cpu_core *core;
> > +
> > +            core = CONTAINER_OF(hmap_first_with_hash(&all_cpu_cores,
> > +
>  hash_int(core_id++, 0)),
> > +                                struct cpu_core, hmap_node);
> > +            core->available = (bin >> j) & 0x1;
> > +       }
> > +
> > +        if (core_id >= hmap_count(&all_cpu_cores)) {
> > +            return;
> > +        }
> > +    }
> > +
> > +    /* For unspecified cores, sets 'available' to false.  */
> > +    while (core_id < hmap_count(&all_cpu_cores)) {
> > +        struct cpu_core *core;
> > +
> > +        core = CONTAINER_OF(hmap_first_with_hash(&all_cpu_cores,
> > +                                                 hash_int(core_id++,
> 0)),
> > +                            struct cpu_core, hmap_node);
> > +        core->available = false;
> > +    }
> > +}
> > +
> >  #endif /* __linux__ */
> > diff --git a/lib/ovs-numa.h b/lib/ovs-numa.h
> > index 83732fc..fab2546 100644
> > --- a/lib/ovs-numa.h
> > +++ b/lib/ovs-numa.h
> > @@ -31,6 +31,7 @@ void ovs_numa_init(void);
> >  bool ovs_numa_numa_id_is_valid(int numa_id);
> >  bool ovs_numa_core_id_is_valid(int core_id);
> >  int ovs_numa_get_n_numas(void);
> > +void ovs_numa_set_cpu_mask(const char *cmask);
> >  int ovs_numa_get_n_cores(void);
> >  int ovs_numa_get_numa_id(int core_id);
> >  int ovs_numa_get_n_cores_on_numa(int numa_id);
> > @@ -60,6 +61,12 @@ ovs_numa_core_id_is_valid(int core_id OVS_UNUSED)
> >      return false;
> >  }
> >
> > +static inline void
> > +ovs_numa_set_cpu_mask(const char *cmask OVS_UNUSED)
> > +{
> > +    /* Nothing */
> > +}
> > +
> >  static inline int
> >  ovs_numa_get_n_numas(void)
> >  {
> > --
> > 1.7.9.5
> >
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
>



More information about the dev mailing list