xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Julien Grall <julien.grall@arm.com>
To: Pawel Wieczorkiewicz <wipawel@amazon.de>, xen-devel@lists.xen.org
Cc: Stefano Stabellini <sstabellini@kernel.org>, Wei Liu <wl@xen.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>,
	mpohlack@amazon.de, Ross Lagerwall <ross.lagerwall@citrix.com>,
	Jan Beulich <jbeulich@suse.com>,
	xen-devel@lists.xenproject.org
Subject: Re: [Xen-devel] [PATCH lp-metadata 2/3] livepatch: Handle arbitrary size names with the list operation
Date: Thu, 15 Aug 2019 12:38:48 +0100	[thread overview]
Message-ID: <8d5350af-2ca8-a651-c43c-07372779322d@arm.com> (raw)
In-Reply-To: <20190815112708.11474-1-wipawel@amazon.de>

Hi,

I am not going to answer on the patch itself but the process.

Any series (i.e more than one patch) should contain a cover letter with a rough 
summary of the goal of the series.

Furthermore, this 3 patches series has been received as 3 separate threads (i.e 
in-reply-to is missing). This is making difficult to know that all the patches 
belongs to the same series. In general, all patches are send as in-reply-to the 
cover letter. So all the patches sticks together in one thread.

The cover letter can be generated via git format-patch --cover-letter. Threading 
is done automatically with git-send-email when all the patches as passed in 
arguments.

For more details how to do it, you can read:

https://wiki.xenproject.org/wiki/Submitting_Xen_Project_Patches#Sending_a_Patch_Series

Cheers,

On 15/08/2019 12:27, Pawel Wieczorkiewicz wrote:
> The payloads' name strings can be of arbitrary size (typically small
> with an upper bound of XEN_LIVEPATCH_NAME_SIZE).
> Current implementation of the list operation interface allows to copy
> names in the XEN_LIVEPATCH_NAME_SIZE chunks regardless of its actual
> size and enforces space allocation requirements on userland tools.
> 
> To unify and simplify the interface, handle the name strings of
> arbitrary size by copying them in adhering chunks to the userland.
> In order to let the userland allocate enough space for the incoming
> data add an auxiliary interface xc_livepatch_list_get_sizes() that
> provides the current number of payload entries and the total size of
> all name strings. This is achieved by extending the sysctl list
> interface with an extra fields: name_total_size.
> 
> The xc_livepatch_list_get_sizes() issues the livepatch sysctl list
> operation with the nr field set to 0. In this mode the operation
> returns the number of payload entries and calculates the total sizes
> for all payloads' names.
> When the sysctl operation is issued with a non-zero nr field (for
> instance with a value obtained earlier with the prior call to the
> xc_livepatch_list_get_sizes()) the new field name_total_size provides
> the total size of actually copied data.
> 
> Extend the libxc to handle the name back-to-back data transfers.
> 
> The xen-livepatch tool is modified to start the list operation with a
> call to the xc_livepatch_list_get_sizes() to obtain the actual number
> of payloads as well as the necessary space for names.
> The tool now always requests the actual number of entries and leaves
> the preemption handling to the libxc routine. The libxc still returns
> 'done' and 'left' parameters with the same semantic allowing the tool
> to detect anomalies and react to them. At the moment it is expected
> that the tool receives the exact number of entires as requested.
> The xen-livepatch tool has been also modified to handle the name
> back-to-back transfers correctly.
> 
> Signed-off-by: Pawel Wieczorkiewicz <wipawel@amazon.de>
> Reviewed-by: Andra-Irina Paraschiv <andraprs@amazon.com>
> Reviewed-by: Bjoern Doebel <doebel@amazon.de>
> Reviewed-by: Martin Pohlack <mpohlack@amazon.de>
> ---
>   tools/libxc/include/xenctrl.h |  49 ++++++++++++------
>   tools/libxc/xc_misc.c         | 100 ++++++++++++++++++++++++++++---------
>   tools/misc/xen-livepatch.c    | 112 ++++++++++++++++++++++--------------------
>   xen/common/livepatch.c        |  31 +++++++++---
>   xen/include/public/sysctl.h   |  15 +++---
>   5 files changed, 204 insertions(+), 103 deletions(-)
> 
> diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
> index 725697c132..e0ebb586b6 100644
> --- a/tools/libxc/include/xenctrl.h
> +++ b/tools/libxc/include/xenctrl.h
> @@ -2560,7 +2560,25 @@ int xc_livepatch_get(xc_interface *xch,
>                        xen_livepatch_status_t *status);
>   
>   /*
> - * The heart of this function is to get an array of xen_livepatch_status_t.
> + * Get a number of available payloads and get actual total size of
> + * the payloads' name array.
> + *
> + * This functions is typically executed first before the xc_livepatch_list()
> + * to obtain the sizes and correctly allocate all necessary data resources.
> + *
> + * The return value is zero if the hypercall completed successfully.
> + *
> + * If there was an error performing the sysctl operation, the return value
> + * will contain the hypercall error code value.
> + */
> +int xc_livepatch_list_get_sizes(xc_interface *xch, unsigned int *nr,
> +                                uint64_t *name_total_size);
> +
> +/*

git-send-email can do that for you.


     1) Any series (i.e more than one patch) should contain a cover letter
     2)

> + * The heart of this function is to get an array of the following objects:
> + *   - xen_livepatch_status_t: states and return codes of payloads
> + *   - name: names of payloads
> + *   - len: lengths of corresponding payloads' names
>    *
>    * However it is complex because it has to deal with the hypervisor
>    * returning some of the requested data or data being stale
> @@ -2571,21 +2589,20 @@ int xc_livepatch_get(xc_interface *xch,
>    * 'left' are also updated with the number of entries filled out
>    * and respectively the number of entries left to get from hypervisor.
>    *
> - * It is expected that the caller of this function will take the
> - * 'left' and use the value for 'start'. This way we have an
> - * cursor in the array. Note that the 'info','name', and 'len' will
> - * be updated at the subsequent calls.
> + * It is expected that the caller of this function will first issue the
> + * xc_livepatch_list_get_sizes() in order to obtain total sizes of names
> + * as well as the current number of payload entries.
> + * The total sizes are required and supplied via the 'name_total_size'
> + * parameter.
>    *
> - * The 'max' is to be provided by the caller with the maximum
> - * number of entries that 'info', 'name', and 'len' arrays can
> - * be filled up with.
> - *
> - * Each entry in the 'name' array is expected to be of XEN_LIVEPATCH_NAME_SIZE
> - * length.
> + * The 'max' is to be provided by the caller with the maximum number of
> + * entries that 'info', 'name', 'len' arrays can be filled up with.
>    *
>    * Each entry in the 'info' array is expected to be of xen_livepatch_status_t
>    * structure size.
>    *
> + * Each entry in the 'name' array may have an arbitrary size.
> + *
>    * Each entry in the 'len' array is expected to be of uint32_t size.
>    *
>    * The return value is zero if the hypercall completed successfully.
> @@ -2597,10 +2614,12 @@ int xc_livepatch_get(xc_interface *xch,
>    * will contain the number of entries that had been succesfully
>    * retrieved (if any).
>    */
> -int xc_livepatch_list(xc_interface *xch, unsigned int max, unsigned int start,
> -                      xen_livepatch_status_t *info, char *name,
> -                      uint32_t *len, unsigned int *done,
> -                      unsigned int *left);
> +int xc_livepatch_list(xc_interface *xch, const unsigned int max,
> +                      const unsigned int start,
> +                      struct xen_livepatch_status *info,
> +                      char *name, uint32_t *len,
> +                      const uint64_t name_total_size,
> +                      unsigned int *done, unsigned int *left);
>   
>   /*
>    * The operations are asynchronous and the hypervisor may take a while
> diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c
> index a8e9e7d1e2..d787f3f29f 100644
> --- a/tools/libxc/xc_misc.c
> +++ b/tools/libxc/xc_misc.c
> @@ -662,7 +662,48 @@ int xc_livepatch_get(xc_interface *xch,
>   }
>   
>   /*
> - * The heart of this function is to get an array of xen_livepatch_status_t.
> + * Get a number of available payloads and get actual total size of
> + * the payloads' name array.
> + *
> + * This functions is typically executed first before the xc_livepatch_list()
> + * to obtain the sizes and correctly allocate all necessary data resources.
> + *
> + * The return value is zero if the hypercall completed successfully.
> + *
> + * If there was an error performing the sysctl operation, the return value
> + * will contain the hypercall error code value.
> + */
> +int xc_livepatch_list_get_sizes(xc_interface *xch, unsigned int *nr,
> +                                uint64_t *name_total_size)
> +{
> +    DECLARE_SYSCTL;
> +    int rc;
> +
> +    if ( !nr || !name_total_size )
> +    {
> +        errno = EINVAL;
> +        return -1;
> +    }
> +
> +    memset(&sysctl, 0, sizeof(sysctl));
> +    sysctl.cmd = XEN_SYSCTL_livepatch_op;
> +    sysctl.u.livepatch.cmd = XEN_SYSCTL_LIVEPATCH_LIST;
> +
> +    rc = do_sysctl(xch, &sysctl);
> +    if ( rc )
> +        return rc;
> +
> +    *nr = sysctl.u.livepatch.u.list.nr;
> +    *name_total_size = sysctl.u.livepatch.u.list.name_total_size;
> +
> +    return 0;
> +}
> +
> +/*
> + * The heart of this function is to get an array of the following objects:
> + *   - xen_livepatch_status_t: states and return codes of payloads
> + *   - name: names of payloads
> + *   - len: lengths of corresponding payloads' names
>    *
>    * However it is complex because it has to deal with the hypervisor
>    * returning some of the requested data or data being stale
> @@ -673,21 +714,20 @@ int xc_livepatch_get(xc_interface *xch,
>    * 'left' are also updated with the number of entries filled out
>    * and respectively the number of entries left to get from hypervisor.
>    *
> - * It is expected that the caller of this function will take the
> - * 'left' and use the value for 'start'. This way we have an
> - * cursor in the array. Note that the 'info','name', and 'len' will
> - * be updated at the subsequent calls.
> + * It is expected that the caller of this function will first issue the
> + * xc_livepatch_list_get_sizes() in order to obtain total sizes of names
> + * as well as the current number of payload entries.
> + * The total sizes are required and supplied via the 'name_total_size'
> + * parameter.
>    *
> - * The 'max' is to be provided by the caller with the maximum
> - * number of entries that 'info', 'name', and 'len' arrays can
> - * be filled up with.
> - *
> - * Each entry in the 'name' array is expected to be of XEN_LIVEPATCH_NAME_SIZE
> - * length.
> + * The 'max' is to be provided by the caller with the maximum number of
> + * entries that 'info', 'name', 'len' arrays can be filled up with.
>    *
>    * Each entry in the 'info' array is expected to be of xen_livepatch_status_t
>    * structure size.
>    *
> + * Each entry in the 'name' array may have an arbitrary size.
> + *
>    * Each entry in the 'len' array is expected to be of uint32_t size.
>    *
>    * The return value is zero if the hypercall completed successfully.
> @@ -699,11 +739,12 @@ int xc_livepatch_get(xc_interface *xch,
>    * will contain the number of entries that had been succesfully
>    * retrieved (if any).
>    */
> -int xc_livepatch_list(xc_interface *xch, unsigned int max, unsigned int start,
> +int xc_livepatch_list(xc_interface *xch, const unsigned int max,
> +                      const unsigned int start,
>                         struct xen_livepatch_status *info,
>                         char *name, uint32_t *len,
> -                      unsigned int *done,
> -                      unsigned int *left)
> +                      const uint64_t name_total_size,
> +                      unsigned int *done, unsigned int *left)
>   {
>       int rc;
>       DECLARE_SYSCTL;
> @@ -714,27 +755,33 @@ int xc_livepatch_list(xc_interface *xch, unsigned int max, unsigned int start,
>       uint32_t max_batch_sz, nr;
>       uint32_t version = 0, retries = 0;
>       uint32_t adjust = 0;
> -    ssize_t sz;
> +    off_t name_off = 0;
> +    uint64_t name_sz;
>   
> -    if ( !max || !info || !name || !len )
> +    if ( !max || !info || !name || !len || !done || !left )
>       {
>           errno = EINVAL;
>           return -1;
>       }
>   
> +    if ( name_total_size == 0 )
> +    {
> +        errno = ENOENT;
> +        return -1;
> +    }
> +
> +    memset(&sysctl, 0, sizeof(sysctl));
>       sysctl.cmd = XEN_SYSCTL_livepatch_op;
>       sysctl.u.livepatch.cmd = XEN_SYSCTL_LIVEPATCH_LIST;
> -    sysctl.u.livepatch.pad = 0;
> -    sysctl.u.livepatch.u.list.version = 0;
>       sysctl.u.livepatch.u.list.idx = start;
> -    sysctl.u.livepatch.u.list.pad = 0;
>   
>       max_batch_sz = max;
> -    /* Convience value. */
> -    sz = sizeof(*name) * XEN_LIVEPATCH_NAME_SIZE;
> +    name_sz = name_total_size;
>       *done = 0;
>       *left = 0;
>       do {
> +        uint64_t _name_sz;
> +
>           /*
>            * The first time we go in this loop our 'max' may be bigger
>            * than what the hypervisor is comfortable with - hence the first
> @@ -754,11 +801,11 @@ int xc_livepatch_list(xc_interface *xch, unsigned int max, unsigned int start,
>           sysctl.u.livepatch.u.list.nr = nr;
>           /* Fix the size (may vary between hypercalls). */
>           HYPERCALL_BOUNCE_SET_SIZE(info, nr * sizeof(*info));
> -        HYPERCALL_BOUNCE_SET_SIZE(name, nr * nr);
> +        HYPERCALL_BOUNCE_SET_SIZE(name, name_sz);
>           HYPERCALL_BOUNCE_SET_SIZE(len, nr * sizeof(*len));
>           /* Move the pointer to proper offset into 'info'. */
>           (HYPERCALL_BUFFER(info))->ubuf = info + *done;
> -        (HYPERCALL_BUFFER(name))->ubuf = name + (sz * *done);
> +        (HYPERCALL_BUFFER(name))->ubuf = name + name_off;
>           (HYPERCALL_BUFFER(len))->ubuf = len + *done;
>           /* Allocate memory. */
>           rc = xc_hypercall_bounce_pre(xch, info);
> @@ -827,14 +874,19 @@ int xc_livepatch_list(xc_interface *xch, unsigned int max, unsigned int start,
>               break;
>           }
>           *left = sysctl.u.livepatch.u.list.nr; /* Total remaining count. */
> +        _name_sz = sysctl.u.livepatch.u.list.name_total_size; /* Total received name size. */
>           /* Copy only up 'rc' of data' - we could add 'min(rc,nr) if desired. */
>           HYPERCALL_BOUNCE_SET_SIZE(info, (rc * sizeof(*info)));
> -        HYPERCALL_BOUNCE_SET_SIZE(name, (rc * sz));
> +        HYPERCALL_BOUNCE_SET_SIZE(name, _name_sz);
>           HYPERCALL_BOUNCE_SET_SIZE(len, (rc * sizeof(*len)));
>           /* Bounce the data and free the bounce buffer. */
>           xc_hypercall_bounce_post(xch, info);
>           xc_hypercall_bounce_post(xch, name);
>           xc_hypercall_bounce_post(xch, len);
> +
> +        name_sz -= _name_sz;
> +        name_off += _name_sz;
> +
>           /* And update how many elements of info we have copied into. */
>           *done += rc;
>           /* Update idx. */
> diff --git a/tools/misc/xen-livepatch.c b/tools/misc/xen-livepatch.c
> index a37b2457ff..8ac3d567fc 100644
> --- a/tools/misc/xen-livepatch.c
> +++ b/tools/misc/xen-livepatch.c
> @@ -64,14 +64,14 @@ static const char *state2str(unsigned int state)
>       return names[state];
>   }
>   
> -/* This value was choosen adhoc. It could be 42 too. */
> -#define MAX_LEN 11
>   static int list_func(int argc, char *argv[])
>   {
> -    unsigned int idx, done, left, i;
> +    unsigned int nr, done, left, i;
>       xen_livepatch_status_t *info = NULL;
>       char *name = NULL;
>       uint32_t *len = NULL;
> +    uint64_t name_total_size;
> +    off_t name_off;
>       int rc = ENOMEM;
>   
>       if ( argc )
> @@ -79,65 +79,73 @@ static int list_func(int argc, char *argv[])
>           show_help();
>           return -1;
>       }
> -    idx = left = 0;
> -    info = malloc(sizeof(*info) * MAX_LEN);
> -    if ( !info )
> -        return rc;
> -    name = malloc(sizeof(*name) * XEN_LIVEPATCH_NAME_SIZE * MAX_LEN);
> -    if ( !name )
> +    done = left = 0;
> +
> +    rc = xc_livepatch_list_get_sizes(xch, &nr, &name_total_size);
> +    if ( rc )
>       {
> -        free(info);
> +        rc = errno;
> +        fprintf(stderr, "Failed to get list sizes.\n"
> +                "Error %d: %s\n",
> +                rc, strerror(rc));
>           return rc;
>       }
> -    len = malloc(sizeof(*len) * MAX_LEN);
> -    if ( !len ) {
> -        free(name);
> -        free(info);
> +
> +    if ( nr == 0 )
> +    {
> +        fprintf(stdout, "Nothing to list\n");
> +        return 0;
> +    }
> +
> +    info = malloc(nr * sizeof(*info));
> +    if ( !info )
>           return rc;
> +
> +    name = malloc(name_total_size * sizeof(*name));
> +    if ( !name )
> +        goto error_name;
> +
> +    len = malloc(nr * sizeof(*len));
> +    if ( !len )
> +        goto error_len;
> +
> +    memset(info, 'A', nr * sizeof(*info));
> +    memset(name, 'B', name_total_size * sizeof(*name));
> +    memset(len, 'C', nr * sizeof(*len));
> +    name_off = 0;
> +
> +    rc = xc_livepatch_list(xch, nr, 0, info, name, len, name_total_size, &done, &left);
> +    if ( rc || done != nr || left > 0)
> +    {
> +        rc = errno;
> +        fprintf(stderr, "Failed to list %d/%d.\n"
> +                "Error %d: %s\n",
> +                left, nr, rc, strerror(rc));
> +        goto error;
>       }
>   
> -    do {
> -        done = 0;
> -        /* The memset is done to catch errors. */
> -        memset(info, 'A', sizeof(*info) * MAX_LEN);
> -        memset(name, 'B', sizeof(*name) * MAX_LEN * XEN_LIVEPATCH_NAME_SIZE);
> -        memset(len, 'C', sizeof(*len) * MAX_LEN);
> -        rc = xc_livepatch_list(xch, MAX_LEN, idx, info, name, len, &done, &left);
> -        if ( rc )
> -        {
> -            rc = errno;
> -            fprintf(stderr, "Failed to list %d/%d.\n"
> -                            "Error %d: %s\n",
> -                    idx, left, rc, strerror(rc));
> -            break;
> -        }
> -        if ( !idx )
> -            fprintf(stdout," ID                                     | status\n"
> -                           "----------------------------------------+------------\n");
> +    fprintf(stdout," ID                                     | status\n"
> +                   "----------------------------------------+------------\n");
>   
> -        for ( i = 0; i < done; i++ )
> -        {
> -            unsigned int j;
> -            uint32_t sz;
> -            char *str;
> -
> -            sz = len[i];
> -            str = name + (i * XEN_LIVEPATCH_NAME_SIZE);
> -            for ( j = sz; j < XEN_LIVEPATCH_NAME_SIZE; j++ )
> -                str[j] = '\0';
> -
> -            printf("%-40s| %s", str, state2str(info[i].state));
> -            if ( info[i].rc )
> -                printf(" (%d, %s)\n", -info[i].rc, strerror(-info[i].rc));
> -            else
> -                puts("");
> -        }
> -        idx += done;
> -    } while ( left );
> +    for ( i = 0; i < done; i++ )
> +    {
> +        char *name_str = name + name_off;
> +
> +        printf("%-40.*s| %s", len[i], name_str, state2str(info[i].state));
> +        if ( info[i].rc )
> +            printf(" (%d, %s)\n", -info[i].rc, strerror(-info[i].rc));
> +        else
> +            puts("");
> +
> +        name_off += len[i];
> +    }
>   
> +error:
> +    free(len);
> +error_len:
>       free(name);
> +error_name:
>       free(info);
> -    free(len);
>       return rc;
>   }
>   #undef MAX_LEN
> diff --git a/xen/common/livepatch.c b/xen/common/livepatch.c
> index f88cf3bc73..f486cb3021 100644
> --- a/xen/common/livepatch.c
> +++ b/xen/common/livepatch.c
> @@ -1163,7 +1163,6 @@ static int livepatch_list(struct xen_sysctl_livepatch_list *list)
>   
>       if ( list->nr &&
>            (!guest_handle_okay(list->status, list->nr) ||
> -          !guest_handle_okay(list->name, XEN_LIVEPATCH_NAME_SIZE * list->nr) ||
>             !guest_handle_okay(list->len, list->nr)) )
>           return -EINVAL;
>   
> @@ -1174,23 +1173,35 @@ static int livepatch_list(struct xen_sysctl_livepatch_list *list)
>           return -EINVAL;
>       }
>   
> +    list->name_total_size = 0;
>       if ( list->nr )
>       {
> +        uint64_t name_offset = 0;
> +
>           list_for_each_entry( data, &payload_list, list )
>           {
> -            uint32_t len;
> +            uint32_t name_len;
>   
>               if ( list->idx > i++ )
>                   continue;
>   
>               status.state = data->state;
>               status.rc = data->rc;
> -            len = strlen(data->name) + 1;
> +
> +            name_len = strlen(data->name) + 1;
> +            list->name_total_size += name_len;
> +
> +            if ( !guest_handle_subrange_okay(list->name, name_offset,
> +                                             name_offset + name_len - 1) )
> +            {
> +                rc = -EINVAL;
> +                break;
> +            }
>   
>               /* N.B. 'idx' != 'i'. */
> -            if ( __copy_to_guest_offset(list->name, idx * XEN_LIVEPATCH_NAME_SIZE,
> -                                        data->name, len) ||
> -                __copy_to_guest_offset(list->len, idx, &len, 1) ||
> +            if ( __copy_to_guest_offset(list->name, name_offset,
> +                                        data->name, name_len) ||
> +                __copy_to_guest_offset(list->len, idx, &name_len, 1) ||
>                   __copy_to_guest_offset(list->status, idx, &status, 1) )
>               {
>                   rc = -EFAULT;
> @@ -1198,11 +1209,19 @@ static int livepatch_list(struct xen_sysctl_livepatch_list *list)
>               }
>   
>               idx++;
> +            name_offset += name_len;
>   
>               if ( (idx >= list->nr) || hypercall_preempt_check() )
>                   break;
>           }
>       }
> +    else
> +    {
> +        list_for_each_entry( data, &payload_list, list )
> +        {
> +            list->name_total_size += strlen(data->name) + 1;
> +        }
> +    }
>       list->nr = payload_cnt - i; /* Remaining amount. */
>       list->version = payload_version;
>       spin_unlock(&payload_lock);
> diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h
> index 335e193712..b86804b7a6 100644
> --- a/xen/include/public/sysctl.h
> +++ b/xen/include/public/sysctl.h
> @@ -926,10 +926,11 @@ struct xen_sysctl_livepatch_get {
>    *
>    * If the hypercall returns an positive number, it is the number (up to `nr`)
>    * of the payloads returned, along with `nr` updated with the number of remaining
> - * payloads, `version` updated (it may be the same across hypercalls. If it
> - * varies the data is stale and further calls could fail). The `status`,
> - * `name`, and `len`' are updated at their designed index value (`idx`) with
> - * the returned value of data.
> + * payloads, `version` updated (it may be the same across hypercalls. If it varies
> + * the data is stale and further calls could fail) and the name_total_size
> + * containing total size of transfered data for the array.
> + * The `status`, `name`, `len` are updated at their designed index value (`idx`)
> + * with the returned value of data.
>    *
>    * If the hypercall returns E2BIG the `nr` is too big and should be
>    * lowered. The upper limit of `nr` is left to the implemention.
> @@ -952,11 +953,13 @@ struct xen_sysctl_livepatch_list {
>                                                  amount of payloads and version.
>                                                  OUT: How many payloads left. */
>       uint32_t pad;                           /* IN: Must be zero. */
> +    uint64_t name_total_size;               /* OUT: Total size of all transfer names */
>       XEN_GUEST_HANDLE_64(xen_livepatch_status_t) status;  /* OUT. Must have enough
>                                                  space allocate for nr of them. */
>       XEN_GUEST_HANDLE_64(char) name;         /* OUT: Array of names. Each member
> -                                               MUST XEN_LIVEPATCH_NAME_SIZE in size.
> -                                               Must have nr of them. */
> +                                               may have an arbitrary length up to
> +                                               XEN_LIVEPATCH_NAME_SIZE bytes. Must have
> +                                               nr of them. */
>       XEN_GUEST_HANDLE_64(uint32) len;        /* OUT: Array of lengths of name's.
>                                                  Must have nr of them. */
>   };
> 

-- 
Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  reply	other threads:[~2019-08-15 11:39 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-15 11:27 [Xen-devel] [PATCH lp-metadata 2/3] livepatch: Handle arbitrary size names with the list operation Pawel Wieczorkiewicz
2019-08-15 11:38 ` Julien Grall [this message]
2019-08-15 14:58   ` Lars Kurth
2019-08-15 15:19     ` Wieczorkiewicz, Pawel
2019-08-15 15:29       ` Julien Grall
2019-08-15 15:32         ` George Dunlap
2019-08-15 15:36           ` Julien Grall
2019-08-15 15:48             ` George Dunlap
2019-08-15 16:00               ` Julien Grall
2019-08-15 16:23                 ` George Dunlap
2019-08-15 15:42         ` Wieczorkiewicz, Pawel
2019-08-15 16:29           ` Andrew Cooper
2019-08-15 18:59             ` Lars Kurth
2019-08-21 18:38             ` Konrad Rzeszutek Wilk
2019-08-15 15:33       ` Lars Kurth
2019-08-15 15:46         ` Lars Kurth
2019-08-15 15:58           ` Julien Grall
2019-08-15 16:17             ` Lars Kurth

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8d5350af-2ca8-a651-c43c-07372779322d@arm.com \
    --to=julien.grall@arm.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=konrad.wilk@oracle.com \
    --cc=mpohlack@amazon.de \
    --cc=ross.lagerwall@citrix.com \
    --cc=sstabellini@kernel.org \
    --cc=tim@xen.org \
    --cc=wipawel@amazon.de \
    --cc=wl@xen.org \
    --cc=xen-devel@lists.xen.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).