Mailing List Archive

[PATCH 5 of 5] Ignore memory events with an obviously invalid gfn
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.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r c71f4c5b42f0 -r 790cd814bee8 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 -r 790cd814bee8 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 -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
+
+#define DUMMY_MEM_EVENT_RSP(_r) ((_r)->gfn == INVALID_RSP_GFN)
+#define MAKE_MEM_EVENT_RSP_DUMMY(_r) ((_r)->gfn = INVALID_RSP_GFN)
+#define DECLARE_DUMMY_MEM_EVENT_RSP(_name) \
+ mem_event_response_t _name = { .gfn = INVALID_RSP_GFN }
+
#endif

/*

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Re: [PATCH 5 of 5] Ignore memory events with an obviously invalid gfn [ In reply to ]
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.

> +#define DUMMY_MEM_EVENT_RSP(_r) ((_r)->gfn == INVALID_RSP_GFN)
> +#define MAKE_MEM_EVENT_RSP_DUMMY(_r) ((_r)->gfn = INVALID_RSP_GFN)
> +#define DECLARE_DUMMY_MEM_EVENT_RSP(_name) \
> + mem_event_response_t _name = { .gfn = INVALID_RSP_GFN }
> +
> #endif
>
> /*
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Re: [PATCH 5 of 5] Ignore memory events with an obviously invalid gfn [ In reply to ]
> 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@lagarcavilla.org>

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@lists.xensource.com
http://lists.xensource.com/xen-devel