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

Re: [Xen-devel] [PATCH] mem_access: Use monitor_traps instead of mem_access_send_req



On Thu, Jul 28, 2016 at 2:38 PM, Julien Grall <julien.grall@xxxxxxx> wrote:
> Hello Tamas,
>
>
> On 28/07/2016 20:35, Tamas K Lengyel wrote:
>>
>> The two functions monitor_traps and mem_access_send_req duplicate
>> some of the same functionality. The mem_access_send_req however leaves a
>> lot of the standard vm_event fields to be filled by other functions.
>>
>> Since mem_access events go on the monitor ring in this patch we
>> consolidate
>> all paths to use monitor_traps to place events on the ring and to fill in
>> the common parts of the requests.
>>
>> Signed-off-by: Tamas K Lengyel <tamas.lengyel@xxxxxxxxxxxx>
>> ---
>> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
>> Cc: Julien Grall <julien.grall@xxxxxxx>
>> Cc: Jan Beulich <jbeulich@xxxxxxxx>
>> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
>> Cc: Razvan Cojocaru <rcojocaru@xxxxxxxxxxxxxxx>
>> Cc: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
>> ---
>>  xen/arch/arm/p2m.c                | 69
>> +++++++++++++++++++--------------------
>>  xen/arch/x86/hvm/hvm.c            | 16 ++++++---
>>  xen/arch/x86/hvm/monitor.c        |  6 ++++
>>  xen/arch/x86/mm/p2m.c             | 24 ++------------
>>  xen/common/mem_access.c           | 11 -------
>>  xen/include/asm-x86/hvm/monitor.h |  2 ++
>>  xen/include/asm-x86/p2m.h         | 13 +++++---
>>  xen/include/xen/mem_access.h      |  7 ----
>>  8 files changed, 63 insertions(+), 85 deletions(-)
>>
>> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
>> index d82349c..df898a3 100644
>> --- a/xen/arch/arm/p2m.c
>> +++ b/xen/arch/arm/p2m.c
>> @@ -5,7 +5,7 @@
>>  #include <xen/domain_page.h>
>>  #include <xen/bitops.h>
>>  #include <xen/vm_event.h>
>> -#include <xen/mem_access.h>
>> +#include <xen/monitor.h>
>>  #include <xen/iocap.h>
>>  #include <public/vm_event.h>
>>  #include <asm/flushtlb.h>
>> @@ -1642,12 +1642,41 @@ void __init setup_virt_paging(void)
>>      smp_call_function(setup_virt_paging_one, (void *)val, 1);
>>  }
>>
>> +static int
>> +__p2m_mem_access_send_req(paddr_t gpa, vaddr_t gla, const struct npfec
>> npfec,
>> +                          xenmem_access_t xma)
>> +{
>> +    struct vcpu *v = current;
>> +    vm_event_request_t req = {};
>> +    bool_t sync = (xma == XENMEM_access_n2rwx) ? 0 : 1;
>> +
>> +    req.reason = VM_EVENT_REASON_MEM_ACCESS;
>> +
>> +    /* Send request to mem access subscriber */
>> +    req.u.mem_access.gfn = gpa >> PAGE_SHIFT;
>> +    req.u.mem_access.offset = gpa & ((1 << PAGE_SHIFT) - 1);
>> +    if ( npfec.gla_valid )
>> +    {
>> +        req.u.mem_access.flags |= MEM_ACCESS_GLA_VALID;
>> +        req.u.mem_access.gla = gla;
>> +
>> +        if ( npfec.kind == npfec_kind_with_gla )
>> +            req.u.mem_access.flags |= MEM_ACCESS_FAULT_WITH_GLA;
>> +        else if ( npfec.kind == npfec_kind_in_gpt )
>> +            req.u.mem_access.flags |= MEM_ACCESS_FAULT_IN_GPT;
>> +    }
>> +    req.u.mem_access.flags |= npfec.read_access    ? MEM_ACCESS_R : 0;
>> +    req.u.mem_access.flags |= npfec.write_access   ? MEM_ACCESS_W : 0;
>> +    req.u.mem_access.flags |= npfec.insn_fetch     ? MEM_ACCESS_X : 0;
>> +
>> +    return monitor_traps(v, sync, &req);
>> +}
>> +
>>  bool_t p2m_mem_access_check(paddr_t gpa, vaddr_t gla, const struct npfec
>> npfec)
>>  {
>>      int rc;
>>      bool_t violation;
>>      xenmem_access_t xma;
>> -    vm_event_request_t *req;
>>      struct vcpu *v = current;
>>      struct p2m_domain *p2m = p2m_get_hostp2m(v->domain);
>>
>> @@ -1734,40 +1763,8 @@ bool_t p2m_mem_access_check(paddr_t gpa, vaddr_t
>> gla, const struct npfec npfec)
>>          return false;
>>      }
>>
>> -    req = xzalloc(vm_event_request_t);
>> -    if ( req )
>> -    {
>> -        req->reason = VM_EVENT_REASON_MEM_ACCESS;
>> -
>> -        /* Pause the current VCPU */
>> -        if ( xma != XENMEM_access_n2rwx )
>> -            req->flags |= VM_EVENT_FLAG_VCPU_PAUSED;
>> -
>> -        /* Send request to mem access subscriber */
>> -        req->u.mem_access.gfn = gpa >> PAGE_SHIFT;
>> -        req->u.mem_access.offset =  gpa & ((1 << PAGE_SHIFT) - 1);
>> -        if ( npfec.gla_valid )
>> -        {
>> -            req->u.mem_access.flags |= MEM_ACCESS_GLA_VALID;
>> -            req->u.mem_access.gla = gla;
>> -
>> -            if ( npfec.kind == npfec_kind_with_gla )
>> -                req->u.mem_access.flags |= MEM_ACCESS_FAULT_WITH_GLA;
>> -            else if ( npfec.kind == npfec_kind_in_gpt )
>> -                req->u.mem_access.flags |= MEM_ACCESS_FAULT_IN_GPT;
>> -        }
>> -        req->u.mem_access.flags |= npfec.read_access    ? MEM_ACCESS_R :
>> 0;
>> -        req->u.mem_access.flags |= npfec.write_access   ? MEM_ACCESS_W :
>> 0;
>> -        req->u.mem_access.flags |= npfec.insn_fetch     ? MEM_ACCESS_X :
>> 0;
>> -        req->vcpu_id = v->vcpu_id;
>> -
>> -        mem_access_send_req(v->domain, req);
>> -        xfree(req);
>> -    }
>> -
>> -    /* Pause the current VCPU */
>> -    if ( xma != XENMEM_access_n2rwx )
>> -        vm_event_vcpu_pause(v);
>> +    if ( __p2m_mem_access_send_req(gpa, gla, npfec, xma) < 0 )
>> +        domain_crash(v->domain);
>
>
> This patch is doing more than it is claimed in the commit message.
>
> In general, moving the code and introducing changes within the same patch
> should really be avoided. So please split it in 2 patches.

Well, the changes are largely cosmetic so doing a whole separate patch
IMHO is an overkill. How about adjusting the commit message to
something like "sanitize code surrounding sending mem_access
vm_events" to better describe the adjustments made in this patch?

Tamas

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

 


Rackspace

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