[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 4 of 4] Support new xl command cpupool-numa-split


  • To: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
  • From: Juergen Gross <juergen.gross@xxxxxxxxxxxxxx>
  • Date: Wed, 08 Dec 2010 13:20:34 +0100
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Wed, 08 Dec 2010 04:21:30 -0800
  • Domainkey-signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns; h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV: Received:Received:Message-ID:Date:From:Organization: User-Agent:MIME-Version:To:CC:Subject:References: In-Reply-To:Content-Type:Content-Transfer-Encoding; b=TPJOuXC7Woq6hazmJFJ8/w938OP8nRy2EXMsxVXZoMPQ8QEGpnNCyRml 8fcDIbMZJ9nz5UkUib16K9fEAG+pkGPPXjYGENxkZo7jwFsWXn5LMOKIC sKLDkk9QkwNXEscVetDwJZV0cV6o3jNzoGImrgszcJmHlg6tyQPH/x0/d yodR7Vur6yYGzgboJTrA2hwlp2Ju3YmqR07I3RixFMZxKwS9NOZkYEmkw E4AzdFQDxzraviz4nhcmJcSZwn5GT;
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

On 12/08/10 12:16, Ian Campbell wrote:
On Fri, 2010-11-26 at 07:10 +0000, Juergen Gross wrote:
+
+    if (libxl_cpumap_alloc(&ctx,&cpumap)) {
+        fprintf(stderr, "Failed to allocate cpumap\n");
+        return -ERROR_FAIL;
+    }
+
+    poolinfo = libxl_list_cpupool(&ctx,&n_pools);
+    if (!poolinfo) {
+        fprintf(stderr, "error getting cpupool info\n");
+        return -ERROR_NOMEM;
+    }
+    poolid = poolinfo[0].poolid;
+    schedid = poolinfo[0].sched_id;
+    libxl_for_each_cpu(c, poolinfo[0].cpumap)
+        if (libxl_cpumap_test(&poolinfo[0].cpumap, c))
+            libxl_cpumap_set(&cpumap, c);

Can the libxl_cpumap_alloc and this loop be deferred until after the
check and bail for n_pools>  1?

Sure.


There seems to be no way to find out the number of pools without also
getting all the info about them, which is a shame.

Taking a quick look I couldn't spot any way how to find out the number
of domains without also getting all the info about them, too...


+    /* Reset Pool-0 to 1st node */
+    node = topology->nodemap.array[0];
+    libxl_for_each_cpu(c, cpumap) {
+        if (!libxl_cpumap_test(&cpumap, c)&&  (c<  topology->nodemap.entries)&&
+            (topology->nodemap.array[c] == node)) {
+            ret = -libxl_cpupool_cpuadd(&ctx, poolid, c);
+            if (ret) {
+                fprintf(stderr, "error on adding cpu to Pool-0\n");
+                goto out;
+            }
+            libxl_cpumap_reset(&freemap, c);

(nt really related to this series but I wish this was called
libxl_cpumap_clear, I had to go check it wasn't resetting the whole map
or something...)

Hmm, do you really think so?
It would make me to check whether it is clearing the whole map :-)
I think the second parameter is a strong hint :-)


+        }
+    }
+    libxl_for_each_cpu(c, cpumap) {
+        if (libxl_cpumap_test(&cpumap, c)&&  (c<  topology->nodemap.entries)&&
+            (topology->nodemap.array[c] != node)) {
+            ret = -libxl_cpupool_cpuremove(&ctx, poolid, c);
+            if (ret) {
+                fprintf(stderr, "error on removing cpu from Pool-0\n");
+                goto out;
+            }
+            libxl_cpumap_set(&freemap, c);
+        }
+    }

Can this loop be merged with the preceding loop, with the body being the
else case of the if?

No. I have to add new cpus first to avoid a cpupool without cpus in between.


+    for (;;) {
+        node = -1;
+        libxl_for_each_cpu(c, freemap) {
+            if (libxl_cpumap_test(&freemap, c)&&  (node == -1)) {
+                node = topology->nodemap.array[c];
+            }
+            libxl_cpumap_reset(&cpumap, c);
+            if ((node>= 0)&&  libxl_cpumap_test(&freemap, c)&&
+                (c<  topology->nodemap.entries)&&  (topology->nodemap.array[c] 
== node)) {
+                libxl_cpumap_reset(&freemap, c);
+                libxl_cpumap_set(&cpumap, c);
+            }
+        }
+        if (node == -1)
+            break;
+
+        snprintf(name, 15, "Pool-node%d", node);

Do we want to rename Pool-0 at some point too or do we rely on that name
elsewhere?

Good question. There is a hard coded "Pool-0" reference in libxl, but this
could easily be changed.
I'm not sure about implications in xm/xend. I'll check this.


Juergen

--
Juergen Gross                 Principal Developer Operating Systems
TSP ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@xxxxxxxxxxxxxx
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.