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

Re: [Xen-devel] [PATCH RFC 1/2] x86/mem_access: Make the mem_access ops generic



>> -int mem_access_memop(struct domain *d, xen_mem_event_op_t *meo)
>> +int mem_access_memop(XEN_GUEST_HANDLE_PARAM(void) arg)
>>  {
>>      int rc;
>> +    xen_mem_access_op_t mao;
>> +    struct domain *d;
>> +
>> +    if ( copy_from_guest(&mao, arg, 1) )
>> +        return -EFAULT;
>> +
>> +    rc = rcu_lock_live_remote_domain_by_id(mao.domid, &d);
>> +    if ( rc )
>> +        return rc;
>> +
>> +    if ( !is_hvm_domain(d) )
>> +        return -EINVAL;
>> +
>> +    rc = xsm_mem_event_op(XSM_TARGET, d, XENMEM_access_op);
>> +    if ( rc )
>> +        goto out;
>>
>>      if ( unlikely(!d->mem_event->access.ring_page) )
>>          return -ENODEV;
>>
>> -    switch( meo->op )
>> +    switch ( mao.op )
>>      {
>>      case XENMEM_access_op_resume:
>>      {
>>          p2m_mem_access_resume(d);
>>          rc = 0;
>> +        break;
>> +    }
>> +
>> +    case XENMEM_access_op_set_access:
>> +    {
>
>Please no pointless braces.

Sorry, I will get rid of them.
 
>> +        rc = -EINVAL;
>> +
>> +        if ( (mao.pfn != ~0ull) &&
>> +             (((mao.pfn + mao.nr - 1) < mao.pfn) ||
>> +              ((mao.pfn + mao.nr - 1) > domain_get_maximum_gpfn(d))) )
>> +            break;
>> +
>> +        rc = p2m_set_mem_access(d, mao.pfn, mao.nr,
>mao.xenmem_access);
>> +        if ( rc > 0 )
>> +        {
>> +            mao.pfn += mao.nr - rc;
>> +            mao.nr = rc;
>> +            if ( __copy_to_guest(arg, &mao, 1) )
>> +                rc = -EFAULT;
>> +            else
>> +                rc = hypercall_create_continuation(__HYPERVISOR_memory_op,
>"lh",
>> +                                                   XENMEM_access_op,
>> + arg);
>
>As already said - this should be done without playing with the interface
>structure. All you need for this is to pass down the upper "cmd" bits from
>do_memory_op().

OK, I will give that a shot. 

>> @@ -162,36 +163,31 @@
>DEFINE_XEN_GUEST_HANDLE(xen_hvm_xentrace_t);
>>  /* Following tools-only interfaces may change in future. */  #if
>> defined(__XEN__) || defined(__XEN_TOOLS__)
>>
>> +/* Deprecated by XENMEM_access_op_set_access */
>>  #define HVMOP_set_mem_access        12
>>  typedef enum {
>> -    HVMMEM_access_n,
>> -    HVMMEM_access_r,
>> -    HVMMEM_access_w,
>> -    HVMMEM_access_rw,
>> -    HVMMEM_access_x,
>> -    HVMMEM_access_rx,
>> -    HVMMEM_access_wx,
>> -    HVMMEM_access_rwx,
>> -    HVMMEM_access_rx2rw,       /* Page starts off as r-x, but automatically
>> -                                * change to r-w on a write */
>> -    HVMMEM_access_n2rwx,       /* Log access: starts off as n, automatically
>>
>> -                                * goes to rwx, generating an event without
>> -                                * pausing the vcpu */
>> -    HVMMEM_access_default      /* Take the domain default */
>> +    HVMMEM_access_n = XENMEM_access_n,
>> +    HVMMEM_access_r = XENMEM_access_r,
>> +    HVMMEM_access_w = XENMEM_access_w,
>> +    HVMMEM_access_rw = XENMEM_access_rw,
>> +    HVMMEM_access_x = XENMEM_access_x,
>> +    HVMMEM_access_rx = XENMEM_access_rx,
>> +    HVMMEM_access_wx = XENMEM_access_wx,
>> +    HVMMEM_access_rwx = XENMEM_access_rwx,
>> +    /*
>> +     * Page starts off as r-x, but automatically
>> +     * change to r-w on a write
>> +     */
>> +    HVMMEM_access_rx2rw = XENMEM_access_rx2rw,
>> +    /*
>> +     * Log access: starts off as n, automatically
>> +     * goes to rwx, generating an event without
>> +     * pausing the vcpu
>> +     */
>> +    HVMMEM_access_n2rwx = XENMEM_access_n2rwx,
>> +    /* Take the domain default */
>> +    HVMMEM_access_default = XENMEM_access_default
>>  } hvmmem_access_t;
>
>So what is the reason for you to keep this while deleting the interface
>structures?

I was keeping to maintain backward compatibility as I thought I need to retain 
xc_hvm_[sg]et_mem_access(). But after IanC's asking me to nuke them, there is 
no reason for the struct and enum to hang around.

>> @@ -379,6 +376,56 @@ struct xen_mem_event_op {  typedef struct
>> xen_mem_event_op xen_mem_event_op_t;
>> DEFINE_XEN_GUEST_HANDLE(xen_mem_event_op_t);
>>
>> +#define XENMEM_access_op                    21
>> +#define XENMEM_access_op_resume             0
>> +#define XENMEM_access_op_set_access         1
>> +#define XENMEM_access_op_get_access         2
>> +
>> +typedef enum {
>> +    XENMEM_access_n,
>> +    XENMEM_access_r,
>> +    XENMEM_access_w,
>> +    XENMEM_access_rw,
>> +    XENMEM_access_x,
>> +    XENMEM_access_rx,
>> +    XENMEM_access_wx,
>> +    XENMEM_access_rwx,
>> +    /*
>> +     * Page starts off as r-x, but automatically
>> +     * change to r-w on a write
>> +     */
>> +    XENMEM_access_rx2rw,
>> +    /*
>> +     * Log access: starts off as n, automatically
>> +     * goes to rwx, generating an event without
>> +     * pausing the vcpu
>> +     */
>> +    XENMEM_access_n2rwx,
>> +    /* Take the domain default */
>> +    XENMEM_access_default
>> +} xenmem_access_t;
>> +
>> +struct xen_mem_access_op {
>> +    /* XENMEM_access_op_* */
>> +    uint8_t     op;
>> +    domid_t     domid;
>> +    /* xenmem_access_t */
>> +    uint16_t xenmem_access;
>
>If you limited this to 8 bits and put it above domid, you'd get away without 
>any
>implicit padding (which I would otherwise ask you to make explicit).

OK I will make it a uint8_t and move it above domid.

>Also I don't see the need for the xenmem_ prefix.

I will get rid of the prefix. What about the enum? Should I call it 
mem_access_t and MEM_access_*?

Thanks,
Aravindh


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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