|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v9 04/27] xen/xsplice: Hypervisor implementation of XEN_XSPLICE_op
>>> On 25.04.16 at 17:34, <konrad.wilk@xxxxxxxxxx> wrote:
> The implementation does not actually do any patching.
>
> It just adds the framework for doing the hypercalls,
> keeping track of ELF payloads, and the basic operations:
> - query which payloads exist,
> - query for specific payloads,
> - check*1, apply*1, replace*1, and unload payloads.
>
> *1: Which of course in this patch are nops.
>
> The functionality is disabled on ARM until all arch
> components are implemented.
>
> Also by default it is disabled until the implementation
> is in place.
>
> We also use recursive spinlocks to so that the find_payload
> function does not need to have a 'lock' and 'non-lock' variant.
>
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> Signed-off-by: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> Acked-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
I'm hesitant to say that, but with all of this:
> v9:
> s/find_name/get_name/, drop locks when allocating data.
> Drop conditional expression on copyback
> Move the allocation on upload outside the spinlock.
> Add (TECH PREVIEW) to the Kconfig help
> Return -EINVAL if the CHECK or UNLOAD action is to be performed and the
> payload
> state is not in expected state.
> Print 'c' not 'u' when invoking the keyhandler.
... I'm not sure the earlier R-b can still be considered valid. Andrew?
> +static int get_name(const xen_xsplice_name_t *name, char *n)
> +{
> + if ( !name->size || name->size > XEN_XSPLICE_NAME_SIZE )
> + return -EINVAL;
> +
> + if ( name->pad[0] || name->pad[1] || name->pad[2] )
> + return -EINVAL;
> +
> + if ( !guest_handle_okay(name->name, name->size) )
> + return -EINVAL;
> +
> + if ( __copy_from_guest(n, name->name, name->size) )
> + return -EFAULT;
Quoting part of my v8.1 reply:
"Is there a particular reason why you open code copy_from_guest() here?"
> +static int xsplice_upload(xen_sysctl_xsplice_upload_t *upload)
> +{
> + struct payload *data, *found;
> + char n[XEN_XSPLICE_NAME_SIZE];
> + int rc;
> +
> + rc = verify_payload(upload, n);
> + if ( rc )
> + return rc;
> +
> + data = xzalloc(struct payload);
> +
> + spin_lock(&payload_lock);
> +
> + found = find_payload(n);
> + if ( IS_ERR(found) )
> + {
> + rc = PTR_ERR(found);
> + goto out;
> + }
> + else if ( found )
> + {
> + rc = -EEXIST;
> + goto out;
> + }
> +
> + if ( !data )
> + {
> + rc = -ENOMEM;
> + goto out;
> + }
> +
> + rc = 0;
rc is already zero by the time we get here.
I also wonder whether the code wouldn't be easier to read if you
used just a sequence of if()/else if() here, without any goto-s.
> +static int xsplice_action(xen_sysctl_xsplice_action_t *action)
> +{
> + struct payload *data;
> + char n[XEN_XSPLICE_NAME_SIZE];
> + int rc;
> +
> + rc = get_name(&action->name, n);
> + if ( rc )
> + return rc;
> +
> + spin_lock(&payload_lock);
> +
> + data = find_payload(n);
> + if ( IS_ERR_OR_NULL(data) )
> + {
> + spin_unlock(&payload_lock);
> +
> + if ( !data )
> + return -ENOENT;
> +
> + return PTR_ERR(data);
> + }
> +
> + switch ( action->cmd )
> + {
> + case XSPLICE_ACTION_CHECK:
> + if ( data->state == XSPLICE_STATE_CHECKED )
> + {
> + /* No implementation yet. */
> + data->state = XSPLICE_STATE_CHECKED;
> + data->rc = 0;
> + } else
> + rc = -EINVAL;
> + break;
While according to Ross it looks like this is going to go away anyway,
...
> + case XSPLICE_ACTION_UNLOAD:
> + if ( data->state == XSPLICE_STATE_CHECKED )
> + {
> + free_payload(data);
> + /* No touching 'data' from here on! */
> + data = NULL;
> + } else
... there's a coding style issue here (and also above if that code is
to stay).
> +static const char *state2str(uint32_t state)
Preferably "unsigned int".
> +{
> +#define STATE(x) [XSPLICE_STATE_##x] = #x
> + static const char *const names[] = {
> + STATE(CHECKED),
> + STATE(APPLIED),
> + };
> +#undef STATE
> +
> + if (state >= ARRAY_SIZE(names) || !names[state])
Missing blanks.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |