Whamcloud - gitweb
LU-6325 libcfs: shortcut to create CPT from NUMA topology 49/14049/5
authorLiang Zhen <liang.zhen@intel.com>
Thu, 12 Mar 2015 04:16:10 +0000 (12:16 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Sat, 28 Mar 2015 03:13:12 +0000 (03:13 +0000)
If user wants to create CPT table that can match numa topology,
she has to query cpu & numa topology, then provide a pattern
string to describe the topology, this is inconvenient.

To improve it, this patch can support shortcut expression "N" or "n"
to create CPT table from NUMA & CPU topology

Signed-off-by: Liang Zhen <liang.zhen@intel.com>
Change-Id: I608f47ad6856ded5bf2f5f223b77b02906ebc8cc
Reviewed-on: http://review.whamcloud.com/14049
Tested-by: Jenkins
Reviewed-by: Olaf Weber <olaf@sgi.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
libcfs/libcfs/linux/linux-cpu.c

index ea0b087..e55678e 100644 (file)
@@ -59,6 +59,8 @@ CFS_MODULE_PARM(cpu_npartitions, "i", int, 0444, "# of CPU partitions");
  * i.e: "N 0[0,1] 1[2,3]" the first character 'N' means numbers in bracket
  *       are NUMA node ID, number before bracket is CPU partition ID.
  *
  * i.e: "N 0[0,1] 1[2,3]" the first character 'N' means numbers in bracket
  *       are NUMA node ID, number before bracket is CPU partition ID.
  *
+ * i.e: "N", shortcut expression to create CPT from NUMA & CPU topology
+ *
  * NB: If user specified cpu_pattern, cpu_npartitions will be ignored
  */
 static char    *cpu_pattern = "";
  * NB: If user specified cpu_pattern, cpu_npartitions will be ignored
  */
 static char    *cpu_pattern = "";
@@ -873,23 +875,33 @@ static struct cfs_cpt_table *
 cfs_cpt_table_create_pattern(char *pattern)
 {
        struct cfs_cpt_table    *cptab;
 cfs_cpt_table_create_pattern(char *pattern)
 {
        struct cfs_cpt_table    *cptab;
-       char                    *str    = pattern;
+       char                    *str;
        int                     node    = 0;
        int                     node    = 0;
+       int                     ncpt    = 0;
        int                     high;
        int                     high;
-       int                     ncpt;
+       int                     cpt;
+       int                     rc;
        int                     c;
        int                     c;
-
-       for (ncpt = 0;; ncpt++) { /* quick scan bracket */
-               str = strchr(str, '[');
-               if (str == NULL)
-                       break;
-               str++;
-       }
+       int                     i;
 
        str = cfs_trimwhite(pattern);
        if (*str == 'n' || *str == 'N') {
                pattern = str + 1;
 
        str = cfs_trimwhite(pattern);
        if (*str == 'n' || *str == 'N') {
                pattern = str + 1;
-               node = 1;
+               if (*pattern != '\0') {
+                       node = 1; /* numa pattern */
+
+               } else { /* shortcut to create CPT from NUMA & CPU topology */
+                       node = -1;
+                       ncpt = num_online_nodes();
+               }
+       }
+
+       if (ncpt == 0) { /* scanning bracket which is mark of partition */
+               for (str = pattern;; str++, ncpt++) {
+                       str = strchr(str, '[');
+                       if (str == NULL)
+                               break;
+               }
        }
 
        if (ncpt == 0 ||
        }
 
        if (ncpt == 0 ||
@@ -900,21 +912,34 @@ cfs_cpt_table_create_pattern(char *pattern)
                return NULL;
        }
 
                return NULL;
        }
 
-       high = node ? MAX_NUMNODES - 1 : NR_CPUS - 1;
-
        cptab = cfs_cpt_table_alloc(ncpt);
        if (cptab == NULL) {
                CERROR("Failed to allocate cpu partition table\n");
                return NULL;
        }
 
        cptab = cfs_cpt_table_alloc(ncpt);
        if (cptab == NULL) {
                CERROR("Failed to allocate cpu partition table\n");
                return NULL;
        }
 
+       if (node < 0) { /* shortcut to create CPT from NUMA & CPU topology */
+               cpt = 0;
+               for_each_online_node(i) {
+                       if (cpt >= ncpt) {
+                               CERROR("CPU changed while setting CPU "
+                                      "partition table, %d/%d\n", cpt, ncpt);
+                               goto failed;
+                       }
+
+                       rc = cfs_cpt_set_node(cptab, cpt++, i);
+                       if (!rc)
+                               goto failed;
+               }
+               return cptab;
+       }
+
+       high = node ? MAX_NUMNODES - 1 : nr_cpu_ids - 1;
+
        for (str = cfs_trimwhite(pattern), c = 0;; c++) {
                struct cfs_range_expr   *range;
                struct cfs_expr_list    *el;
                char                    *bracket = strchr(str, '[');
        for (str = cfs_trimwhite(pattern), c = 0;; c++) {
                struct cfs_range_expr   *range;
                struct cfs_expr_list    *el;
                char                    *bracket = strchr(str, '[');
-               int                     cpt;
-               int                     rc;
-               int                     i;
                int                     n;
 
                if (bracket == NULL) {
                int                     n;
 
                if (bracket == NULL) {