diff mbox

libxl: remove the xl list limit of 1024 domains

Message ID 1450449265-2633-1-git-send-email-jgross@suse.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jürgen Groß Dec. 18, 2015, 2:34 p.m. UTC
xl list is currently limited to 1024 domains. Remove the limit.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 tools/libxl/libxl.c | 37 ++++++++++++++++++-------------------
 1 file changed, 18 insertions(+), 19 deletions(-)

Comments

Andrew Cooper Dec. 18, 2015, 2:47 p.m. UTC | #1
On 18/12/15 14:34, Juergen Gross wrote:
> xl list is currently limited to 1024 domains. Remove the limit.
>
> Signed-off-by: Juergen Gross <jgross@suse.com>

libxl_list_vm() needs similar treatment.  In fact, it looks as if it
should be implemented in terms of libxl_list_domain(), rather than
opencoding similar same logic.

~Andrew
Jürgen Groß Dec. 18, 2015, 3:07 p.m. UTC | #2
On 18/12/15 15:47, Andrew Cooper wrote:
> On 18/12/15 14:34, Juergen Gross wrote:
>> xl list is currently limited to 1024 domains. Remove the limit.
>>
>> Signed-off-by: Juergen Gross <jgross@suse.com>
> 
> libxl_list_vm() needs similar treatment.  In fact, it looks as if it
> should be implemented in terms of libxl_list_domain(), rather than
> opencoding similar same logic.

Yeah, and get_domain_ids() in tools/xenstat/libxenstat/src/xenstat_qmp.c
has the same problem.

I won't be able to the patches today and I'll be back from holidays only
next year. I'll do the patches in case no one else is stepping up.


Juergen
Jürgen Groß Jan. 4, 2016, 2:35 p.m. UTC | #3
On 18/12/15 15:34, Juergen Gross wrote:
> xl list is currently limited to 1024 domains. Remove the limit.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>

Found a bug, will send V2 soon (together with two other patches
addressing a similar limitation in xl vm-list and tools/xenstat.


Juergen

> ---
>  tools/libxl/libxl.c | 37 ++++++++++++++++++-------------------
>  1 file changed, 18 insertions(+), 19 deletions(-)
> 
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index 9207621..83e37a9 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -649,31 +649,30 @@ static void xcinfo2xlinfo(libxl_ctx *ctx,
>  
>  libxl_dominfo * libxl_list_domain(libxl_ctx *ctx, int *nb_domain_out)
>  {
> -    libxl_dominfo *ptr;
> +    libxl_dominfo *ptr = NULL;
>      int i, ret;
>      xc_domaininfo_t info[1024];
> -    int size = 1024;
> +    int size = 0;
> +    uint32_t domid = 0;
>      GC_INIT(ctx);
>  
> -    ptr = calloc(size, sizeof(libxl_dominfo));
> -    if (!ptr) {
> -        LOGE(ERROR, "allocating domain info");
> -        GC_FREE;
> -        return NULL;
> -    }
> -
> -    ret = xc_domain_getinfolist(ctx->xch, 0, 1024, info);
> -    if (ret<0) {
> -        LOGE(ERROR, "getting domain info list");
> -        free(ptr);
> -        GC_FREE;
> -        return NULL;
> +    for (ret = 1; ret;) {
> +        ret = xc_domain_getinfolist(ctx->xch, domid, 1024, info);
> +        if (ret < 0) {
> +            LOGE(ERROR, "getting domain info list");
> +            free(ptr);
> +            GC_FREE;
> +            return NULL;
> +        }
> +        ptr = libxl__realloc(NOGC, ptr, (size + ret) * sizeof(libxl_dominfo));
> +        for (i = 0; i < ret; i++) {
> +            xcinfo2xlinfo(ctx, &info[i], &ptr[size + i]);
> +        }
> +        domid = info[ret - 1].domain + 1;
> +        size += ret;
>      }
>  
> -    for (i = 0; i < ret; i++) {
> -        xcinfo2xlinfo(ctx, &info[i], &ptr[i]);
> -    }
> -    *nb_domain_out = ret;
> +    *nb_domain_out = size;
>      GC_FREE;
>      return ptr;
>  }
>
diff mbox

Patch

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 9207621..83e37a9 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -649,31 +649,30 @@  static void xcinfo2xlinfo(libxl_ctx *ctx,
 
 libxl_dominfo * libxl_list_domain(libxl_ctx *ctx, int *nb_domain_out)
 {
-    libxl_dominfo *ptr;
+    libxl_dominfo *ptr = NULL;
     int i, ret;
     xc_domaininfo_t info[1024];
-    int size = 1024;
+    int size = 0;
+    uint32_t domid = 0;
     GC_INIT(ctx);
 
-    ptr = calloc(size, sizeof(libxl_dominfo));
-    if (!ptr) {
-        LOGE(ERROR, "allocating domain info");
-        GC_FREE;
-        return NULL;
-    }
-
-    ret = xc_domain_getinfolist(ctx->xch, 0, 1024, info);
-    if (ret<0) {
-        LOGE(ERROR, "getting domain info list");
-        free(ptr);
-        GC_FREE;
-        return NULL;
+    for (ret = 1; ret;) {
+        ret = xc_domain_getinfolist(ctx->xch, domid, 1024, info);
+        if (ret < 0) {
+            LOGE(ERROR, "getting domain info list");
+            free(ptr);
+            GC_FREE;
+            return NULL;
+        }
+        ptr = libxl__realloc(NOGC, ptr, (size + ret) * sizeof(libxl_dominfo));
+        for (i = 0; i < ret; i++) {
+            xcinfo2xlinfo(ctx, &info[i], &ptr[size + i]);
+        }
+        domid = info[ret - 1].domain + 1;
+        size += ret;
     }
 
-    for (i = 0; i < ret; i++) {
-        xcinfo2xlinfo(ctx, &info[i], &ptr[i]);
-    }
-    *nb_domain_out = ret;
+    *nb_domain_out = size;
     GC_FREE;
     return ptr;
 }