|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |