|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v1 12/12] tmem: Batch and squash XEN_SYSCTL_TMEM_OP_SAVE_GET_POOL_[FLAGS, NPAGES, UUID] in one sub-call: XEN_SYSCTL_TMEM_OP_GET_POOLS.
>>> On 28.09.16 at 11:42, <konrad.wilk@xxxxxxxxxx> wrote:
> @@ -1592,6 +1594,7 @@ static int do_tmem_new_pool(domid_t this_cli_id,
>
> out:
> tmem_client_info("pool_id=%d\n", d_poolid);
> + client->info.nr_pools ++;
Stray blank?
> --- a/xen/common/tmem_control.c
> +++ b/xen/common/tmem_control.c
> @@ -276,6 +276,8 @@ static int __tmemc_set_var(struct client *client,
> if ( info.maxpools > MAX_POOLS_PER_DOMAIN )
> return -ERANGE;
>
> + /* Ignore info.nr_pools. */
> +
> if ( info.weight != client->info.weight )
> {
> old_weight = client->info.weight;
> @@ -342,46 +344,63 @@ static int tmemc_get_client_info(int cli_id,
> return 0;
> }
>
> -static int tmemc_save_subop(int cli_id, uint32_t pool_id, uint32_t subop,
> - XEN_GUEST_HANDLE_PARAM(void) buf, uint32_t arg)
> +static int tmemc_get_pool(int cli_id,
> +
> XEN_GUEST_HANDLE_PARAM(xen_sysctl_tmem_pool_info_t) pools,
> + uint32_t len)
> {
> struct client *client = tmem_client_from_cli_id(cli_id);
> - struct tmem_pool *pool = (client == NULL || pool_id >=
> MAX_POOLS_PER_DOMAIN)
> - ? NULL : client->pools[pool_id];
> - int rc = -1;
> + unsigned int i, idx;
> + int rc = 0;
> + unsigned int nr = len / sizeof(xen_sysctl_tmem_pool_info_t);
> +
> + if ( len % sizeof(xen_sysctl_tmem_pool_info_t) )
> + return -EINVAL;
> +
> + if ( nr >= MAX_POOLS_PER_DOMAIN )
> + return -E2BIG;
>= seems one off here.
> + if ( !guest_handle_okay(pools, nr) )
> + return -EINVAL;
>
> - switch(subop)
> + if ( !client )
> + return -EINVAL;
> +
> + for ( idx = 0, i = 0; i < MAX_POOLS_PER_DOMAIN; i++ )
> {
> - case XEN_SYSCTL_TMEM_OP_SAVE_GET_POOL_FLAGS:
> - if ( pool == NULL )
> - break;
> - rc = (pool->persistent ? TMEM_POOL_PERSIST : 0) |
> + struct tmem_pool *pool = client->pools[i];
> + xen_sysctl_tmem_pool_info_t out;
> +
> + if ( pool == NULL )
> + continue;
> +
> + out.flags.raw = (pool->persistent ? TMEM_POOL_PERSIST : 0) |
> (pool->shared ? TMEM_POOL_SHARED : 0) |
> (POOL_PAGESHIFT << TMEM_POOL_PAGESIZE_SHIFT) |
> (TMEM_SPEC_VERSION << TMEM_POOL_VERSION_SHIFT);
> - break;
> - case XEN_SYSCTL_TMEM_OP_SAVE_GET_POOL_NPAGES:
> - if ( pool == NULL )
> - break;
> - rc = _atomic_read(pool->pgp_count);
> - break;
> - case XEN_SYSCTL_TMEM_OP_SAVE_GET_POOL_UUID:
> - if ( pool == NULL )
> - break;
> - rc = 0;
> - if ( copy_to_guest(guest_handle_cast(buf, void), pool->uuid, 2) )
> + out.n_pages = _atomic_read(pool->pgp_count);
> + out.uuid[0] = pool->uuid[0];
> + out.uuid[1] = pool->uuid[1];
> + out.id = i;
> +
> + /* N.B. 'idx' != 'i'. */
> + if ( __copy_to_guest_offset(pools, idx, &out, 1) )
> + {
> rc = -EFAULT;
> - break;
> - default:
> - rc = -1;
> + break;
> + }
> + idx ++;
Stray blank again.
> --- a/xen/include/public/sysctl.h
> +++ b/xen/include/public/sysctl.h
> @@ -760,9 +760,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_sysctl_psr_cat_op_t);
> #define XEN_SYSCTL_TMEM_OP_SAVE_BEGIN 10
> #define XEN_SYSCTL_TMEM_OP_GET_CLIENT_INFO 11
> #define XEN_SYSCTL_TMEM_OP_SET_CLIENT_INFO 12
> -#define XEN_SYSCTL_TMEM_OP_SAVE_GET_POOL_FLAGS 16
> -#define XEN_SYSCTL_TMEM_OP_SAVE_GET_POOL_NPAGES 17
> -#define XEN_SYSCTL_TMEM_OP_SAVE_GET_POOL_UUID 18
> +#define XEN_SYSCTL_TMEM_OP_GET_POOLS 16
The latest here - when you re-assign meaning - bumping
XEN_SYSCTL_INTERFACE_VERSION becomes unavoidable.
> @@ -803,6 +802,31 @@ struct tmem_client {
> typedef struct tmem_client xen_sysctl_tmem_client_t;
> DEFINE_XEN_GUEST_HANDLE(xen_sysctl_tmem_client_t);
>
> +/*
> + * XEN_SYSCTL_TMEM_OP_GET_POOLS uses the 'pool' array in
> + * xen_sysctl_tmem_op with this structure. The hypercall will
> + * return the number of entries in 'pool' or a negative value
> + * if an error was encountered.
> + */
> +struct tmem_pool_info {
> + union {
> + uint32_t raw;
> + struct {
> + uint32_t persist:1, /* See TMEM_POOL_PERSIST. */
> + shared:1, /* See TMEM_POOL_SHARED. */
> + rsv:2,
> + pagebits:8, /* TMEM_POOL_PAGESIZE_[SHIFT,MASK]. */
> + rsv2:12,
> + version:8; /* TMEM_POOL_VERSION_[SHIFT,MASK]. */
> + } u;
> + } flags;
> + uint32_t id; /* Less than tmem_client.maxpools. */
> + uint64_t n_pages;
> + uint64_t uuid[2];
uint64_aligned_t
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |