All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] x86/hvm: ioreq server fixes
@ 2015-04-23 15:46 Paul Durrant
  2015-04-23 15:46 ` [PATCH 1/2] x86/hvm: actually release ioreq server pages Paul Durrant
  2015-04-23 15:46 ` [PATCH 2/2] x86/hvm: implicitly disable an ioreq server when it is destroyed Paul Durrant
  0 siblings, 2 replies; 7+ messages in thread
From: Paul Durrant @ 2015-04-23 15:46 UTC (permalink / raw)
  To: xen-devel; +Cc: Paul Durrant

The following two patches fix a bug in the ioreq server gmfn release
code and also make the semantics of server destruction more intuitive.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/2] x86/hvm: actually release ioreq server pages
  2015-04-23 15:46 [PATCH 0/2] x86/hvm: ioreq server fixes Paul Durrant
@ 2015-04-23 15:46 ` Paul Durrant
  2015-04-23 15:50   ` Andrew Cooper
  2015-04-24  8:01   ` Jan Beulich
  2015-04-23 15:46 ` [PATCH 2/2] x86/hvm: implicitly disable an ioreq server when it is destroyed Paul Durrant
  1 sibling, 2 replies; 7+ messages in thread
From: Paul Durrant @ 2015-04-23 15:46 UTC (permalink / raw)
  To: xen-devel; +Cc: Andrew Cooper, Paul Durrant, Keir Fraser, Jan Beulich

hvm_free_ioreq_gmfn has the sense of the ioreq_gmfn mask inverted; it
needs to set a bit to release the gmfn, not clear it.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Cc: Keir Fraser <keir@xen.org>
Cc: Jan Beulich <jbeulich@suse.com>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
---
 xen/arch/x86/hvm/hvm.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index bfde380..f840175 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -496,7 +496,7 @@ static void hvm_free_ioreq_gmfn(struct domain *d, unsigned long gmfn)
 {
     unsigned int i = gmfn - d->arch.hvm_domain.ioreq_gmfn.base;
 
-    clear_bit(i, &d->arch.hvm_domain.ioreq_gmfn.mask);
+    set_bit(i, &d->arch.hvm_domain.ioreq_gmfn.mask);
 }
 
 static void hvm_unmap_ioreq_page(struct hvm_ioreq_server *s, bool_t buf)
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/2] x86/hvm: implicitly disable an ioreq server when it is destroyed
  2015-04-23 15:46 [PATCH 0/2] x86/hvm: ioreq server fixes Paul Durrant
  2015-04-23 15:46 ` [PATCH 1/2] x86/hvm: actually release ioreq server pages Paul Durrant
@ 2015-04-23 15:46 ` Paul Durrant
  2015-04-23 16:02   ` Andrew Cooper
  1 sibling, 1 reply; 7+ messages in thread
From: Paul Durrant @ 2015-04-23 15:46 UTC (permalink / raw)
  To: xen-devel; +Cc: Andrew Cooper, Paul Durrant, Keir Fraser, Jan Beulich

Currently, unless a (non-default) ioreq server is explicitly disabled before
being destroyed, its gmfns will not be placed back into the p2m but still
released back into the ioreq_gmfn mask. This is somewhat counter-intuitive
and easily remedied by this small patch.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Cc: Keir Fraser <keir@xen.org>
Cc: Jan Beulich <jbeulich@suse.com>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
---
 xen/arch/x86/hvm/hvm.c |    8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index f840175..3c62b80 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -972,6 +972,7 @@ static int hvm_ioreq_server_init(struct hvm_ioreq_server *s, struct domain *d,
 static void hvm_ioreq_server_deinit(struct hvm_ioreq_server *s,
                                     bool_t is_default)
 {
+    ASSERT(!s->enabled);
     hvm_ioreq_server_remove_all_vcpus(s);
     hvm_ioreq_server_unmap_pages(s, is_default);
     hvm_ioreq_server_free_rangesets(s, is_default);
@@ -1074,6 +1075,8 @@ static int hvm_destroy_ioreq_server(struct domain *d, ioservid_t id)
 
         domain_pause(d);
 
+        hvm_ioreq_server_disable(s, 0);
+
         list_del(&s->list_entry);
         
         hvm_ioreq_server_deinit(s, 0);
@@ -1332,11 +1335,10 @@ static void hvm_destroy_all_ioreq_servers(struct domain *d)
     {
         bool_t is_default = (s == d->arch.hvm_domain.default_ioreq_server);
 
+        hvm_ioreq_server_disable(s, is_default);
+
         if ( is_default )
-        {
-            hvm_ioreq_server_disable(s, 1);
             d->arch.hvm_domain.default_ioreq_server = NULL;
-        }
 
         list_del(&s->list_entry);
         
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] x86/hvm: actually release ioreq server pages
  2015-04-23 15:46 ` [PATCH 1/2] x86/hvm: actually release ioreq server pages Paul Durrant
@ 2015-04-23 15:50   ` Andrew Cooper
  2015-04-24  8:01   ` Jan Beulich
  1 sibling, 0 replies; 7+ messages in thread
From: Andrew Cooper @ 2015-04-23 15:50 UTC (permalink / raw)
  To: Paul Durrant, xen-devel; +Cc: Keir Fraser, Jan Beulich

On 23/04/15 16:46, Paul Durrant wrote:
> hvm_free_ioreq_gmfn has the sense of the ioreq_gmfn mask inverted; it
> needs to set a bit to release the gmfn, not clear it.
>
> Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
> Cc: Keir Fraser <keir@xen.org>
> Cc: Jan Beulich <jbeulich@suse.com>
> Cc: Andrew Cooper <andrew.cooper3@citrix.com>

s/mask/free_mask/ ?

For the change itself, Reviewed-by: Andrew Cooper
<andrew.cooper3@citrix.com>

> ---
>  xen/arch/x86/hvm/hvm.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> index bfde380..f840175 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -496,7 +496,7 @@ static void hvm_free_ioreq_gmfn(struct domain *d, unsigned long gmfn)
>  {
>      unsigned int i = gmfn - d->arch.hvm_domain.ioreq_gmfn.base;
>  
> -    clear_bit(i, &d->arch.hvm_domain.ioreq_gmfn.mask);
> +    set_bit(i, &d->arch.hvm_domain.ioreq_gmfn.mask);
>  }
>  
>  static void hvm_unmap_ioreq_page(struct hvm_ioreq_server *s, bool_t buf)

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/2] x86/hvm: implicitly disable an ioreq server when it is destroyed
  2015-04-23 15:46 ` [PATCH 2/2] x86/hvm: implicitly disable an ioreq server when it is destroyed Paul Durrant
@ 2015-04-23 16:02   ` Andrew Cooper
  0 siblings, 0 replies; 7+ messages in thread
From: Andrew Cooper @ 2015-04-23 16:02 UTC (permalink / raw)
  To: Paul Durrant, xen-devel; +Cc: Keir Fraser, Jan Beulich

On 23/04/15 16:46, Paul Durrant wrote:
> Currently, unless a (non-default) ioreq server is explicitly disabled before
> being destroyed, its gmfns will not be placed back into the p2m but still
> released back into the ioreq_gmfn mask. This is somewhat counter-intuitive
> and easily remedied by this small patch.
>
> Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
> Cc: Keir Fraser <keir@xen.org>
> Cc: Jan Beulich <jbeulich@suse.com>
> Cc: Andrew Cooper <andrew.cooper3@citrix.com>

Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>

> ---
>  xen/arch/x86/hvm/hvm.c |    8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> index f840175..3c62b80 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -972,6 +972,7 @@ static int hvm_ioreq_server_init(struct hvm_ioreq_server *s, struct domain *d,
>  static void hvm_ioreq_server_deinit(struct hvm_ioreq_server *s,
>                                      bool_t is_default)
>  {
> +    ASSERT(!s->enabled);
>      hvm_ioreq_server_remove_all_vcpus(s);
>      hvm_ioreq_server_unmap_pages(s, is_default);
>      hvm_ioreq_server_free_rangesets(s, is_default);
> @@ -1074,6 +1075,8 @@ static int hvm_destroy_ioreq_server(struct domain *d, ioservid_t id)
>  
>          domain_pause(d);
>  
> +        hvm_ioreq_server_disable(s, 0);
> +
>          list_del(&s->list_entry);
>          
>          hvm_ioreq_server_deinit(s, 0);
> @@ -1332,11 +1335,10 @@ static void hvm_destroy_all_ioreq_servers(struct domain *d)
>      {
>          bool_t is_default = (s == d->arch.hvm_domain.default_ioreq_server);
>  
> +        hvm_ioreq_server_disable(s, is_default);
> +
>          if ( is_default )
> -        {
> -            hvm_ioreq_server_disable(s, 1);
>              d->arch.hvm_domain.default_ioreq_server = NULL;
> -        }
>  
>          list_del(&s->list_entry);
>          

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] x86/hvm: actually release ioreq server pages
  2015-04-23 15:46 ` [PATCH 1/2] x86/hvm: actually release ioreq server pages Paul Durrant
  2015-04-23 15:50   ` Andrew Cooper
@ 2015-04-24  8:01   ` Jan Beulich
  2015-04-24  9:28     ` Paul Durrant
  1 sibling, 1 reply; 7+ messages in thread
From: Jan Beulich @ 2015-04-24  8:01 UTC (permalink / raw)
  To: Paul Durrant; +Cc: Andrew Cooper, Keir Fraser, xen-devel

>>> On 23.04.15 at 17:46, <paul.durrant@citrix.com> wrote:
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -496,7 +496,7 @@ static void hvm_free_ioreq_gmfn(struct domain *d, unsigned long gmfn)
>  {
>      unsigned int i = gmfn - d->arch.hvm_domain.ioreq_gmfn.base;
>  
> -    clear_bit(i, &d->arch.hvm_domain.ioreq_gmfn.mask);
> +    set_bit(i, &d->arch.hvm_domain.ioreq_gmfn.mask);
>  }

Double checking this I came to wonder whether
HVM_PARAM_NR_IOREQ_SERVER_PAGES handling isn't broken
when invoked a second time with a.value smaller than what was
used the first time, or when any server pages are already in
use.

Jan

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] x86/hvm: actually release ioreq server pages
  2015-04-24  8:01   ` Jan Beulich
@ 2015-04-24  9:28     ` Paul Durrant
  0 siblings, 0 replies; 7+ messages in thread
From: Paul Durrant @ 2015-04-24  9:28 UTC (permalink / raw)
  To: Jan Beulich; +Cc: Andrew Cooper, Keir (Xen.org), xen-devel@lists.xenproject.org

> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]
> Sent: 24 April 2015 09:01
> To: Paul Durrant
> Cc: Andrew Cooper; xen-devel@lists.xenproject.org; Keir (Xen.org)
> Subject: Re: [PATCH 1/2] x86/hvm: actually release ioreq server pages
> 
> >>> On 23.04.15 at 17:46, <paul.durrant@citrix.com> wrote:
> > --- a/xen/arch/x86/hvm/hvm.c
> > +++ b/xen/arch/x86/hvm/hvm.c
> > @@ -496,7 +496,7 @@ static void hvm_free_ioreq_gmfn(struct domain *d,
> unsigned long gmfn)
> >  {
> >      unsigned int i = gmfn - d->arch.hvm_domain.ioreq_gmfn.base;
> >
> > -    clear_bit(i, &d->arch.hvm_domain.ioreq_gmfn.mask);
> > +    set_bit(i, &d->arch.hvm_domain.ioreq_gmfn.mask);
> >  }
> 
> Double checking this I came to wonder whether
> HVM_PARAM_NR_IOREQ_SERVER_PAGES handling isn't broken
> when invoked a second time with a.value smaller than what was
> used the first time, or when any server pages are already in
> use.
> 

Yes, the param is only intended to be a set-once param, the same as HVM_PARAM_IOREQ_SERVER_PFN. If the latter were changed after ioreq servers had been created then it could also lead to strangeness. I'll put together a patch to add checks for both.

  Paul

> Jan

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-04-24  9:29 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-04-23 15:46 [PATCH 0/2] x86/hvm: ioreq server fixes Paul Durrant
2015-04-23 15:46 ` [PATCH 1/2] x86/hvm: actually release ioreq server pages Paul Durrant
2015-04-23 15:50   ` Andrew Cooper
2015-04-24  8:01   ` Jan Beulich
2015-04-24  9:28     ` Paul Durrant
2015-04-23 15:46 ` [PATCH 2/2] x86/hvm: implicitly disable an ioreq server when it is destroyed Paul Durrant
2015-04-23 16:02   ` Andrew Cooper

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.