[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 5 of 5] Ignore memory events with an obviously invalid gfn
> At 10:12 -0500 on 05 Dec (1323079924), Andres Lagar-Cavilla wrote: >> xen/arch/x86/mm/mem_sharing.c | 2 ++ >> xen/arch/x86/mm/p2m.c | 4 ++++ >> xen/include/public/mem_event.h | 7 +++++++ >> 3 files changed, 13 insertions(+), 0 deletions(-) >> >> >> Ring semantics require that for every request, a response be put. This >> allows consumer to place a dummy response if need be. >> >> diff -r c71f4c5b42f0 -r 790cd814bee8 xen/include/public/mem_event.h >> --- a/xen/include/public/mem_event.h >> +++ b/xen/include/public/mem_event.h >> @@ -76,6 +76,13 @@ typedef struct mem_event_st { >> >> DEFINE_RING_TYPES(mem_event, mem_event_request_t, >> mem_event_response_t); >> >> +#define INVALID_RSP_GFN -1UL >> + > > On a 32-bit system this doesn't do what you want. > > Actually, can you use a flag for this, please? Wedging it into the gfn > field seems a bit of a hack, and we have plenty of flag bits left. > > Tim. Good point, here it is: # HG changeset patch # Parent c71f4c5b42f0c7cc04e4ae758c8ab775305f2c6a Ignore memory events with an obviously invalid gfn. Ring semantics require that for every request, a response be put. This allows consumer to place a dummy response if need be. Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> diff -r c71f4c5b42f0 xen/arch/x86/mm/mem_sharing.c --- a/xen/arch/x86/mm/mem_sharing.c +++ b/xen/arch/x86/mm/mem_sharing.c @@ -303,6 +303,8 @@ int mem_sharing_sharing_resume(struct do /* Get all requests off the ring */ while ( mem_event_get_response(&d->mem_event->share, &rsp) ) { + if ( DUMMY_MEM_EVENT_RSP(&rsp) ) + continue; /* Unpause domain/vcpu */ if ( rsp.flags & MEM_EVENT_FLAG_VCPU_PAUSED ) vcpu_unpause(d->vcpu[rsp.vcpu_id]); diff -r c71f4c5b42f0 xen/arch/x86/mm/p2m.c --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -1069,6 +1069,8 @@ void p2m_mem_paging_resume(struct domain /* Pull all responses off the ring */ while( mem_event_get_response(&d->mem_event->paging, &rsp) ) { + if ( DUMMY_MEM_EVENT_RSP(&rsp) ) + continue; /* Fix p2m entry if the page was not dropped */ if ( !(rsp.flags & MEM_EVENT_FLAG_DROP_PAGE) ) { @@ -1177,6 +1179,8 @@ void p2m_mem_access_resume(struct domain /* Pull all responses off the ring */ while( mem_event_get_response(&d->mem_event->access, &rsp) ) { + if ( DUMMY_MEM_EVENT_RSP(&rsp) ) + continue; /* Unpause domain */ if ( rsp.flags & MEM_EVENT_FLAG_VCPU_PAUSED ) vcpu_unpause(d->vcpu[rsp.vcpu_id]); diff -r c71f4c5b42f0 xen/include/public/mem_event.h --- a/xen/include/public/mem_event.h +++ b/xen/include/public/mem_event.h @@ -40,6 +40,7 @@ #define MEM_EVENT_FLAG_DROP_PAGE (1 << 1) #define MEM_EVENT_FLAG_EVICT_FAIL (1 << 2) #define MEM_EVENT_FLAG_FOREIGN (1 << 3) +#define MEM_EVENT_FLAG_DUMMY (1 << 4) /* Reasons for the memory event request */ #define MEM_EVENT_REASON_UNKNOWN 0 /* typical reason */ @@ -76,6 +77,13 @@ typedef struct mem_event_st { DEFINE_RING_TYPES(mem_event, mem_event_request_t, mem_event_response_t); +#define DUMMY_MEM_EVENT_RSP(_r) \ + ((_r)->flags & MEM_EVENT_FLAG_DUMMY) +#define MAKE_MEM_EVENT_RSP_DUMMY(_r) \ + ((_r)->flags |= MEM_EVENT_FLAG_DUMMY) +#define DECLARE_DUMMY_MEM_EVENT_RSP(_name) \ + mem_event_response_t _name = { .flags = MEM_EVENT_FLAG_DUMMY } + #endif /* _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |