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

Re: [Xen-devel] [PATCH] do_memory_op: cleanup if copy_to_guest fails


  • To: Olaf Hering <olaf@xxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: Keir Fraser <keir@xxxxxxx>
  • Date: Thu, 16 Dec 2010 18:32:14 +0000
  • Cc:
  • Delivery-date: Thu, 16 Dec 2010 10:33:00 -0800
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:user-agent:date:subject:from:to:message-id:thread-topic :thread-index:in-reply-to:mime-version:content-type :content-transfer-encoding; b=C/Fv/ltysYWm3hyAUbUtQADaTyHRgZiSQA4DghufnKyqWWVXahg48Mrh1y31XVBZFv 8/Y0anFzDkWgjR35h2t+nyC2aZbM/t0E7oT+IUy9xJe9HL4EfwpESgkeGcf6WWwL1LGw WLNRWzQwGR7rMB2BcSCqff5DvBsRtFOQtzQjs=
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>
  • Thread-index: AcudT48pJnnP2+5NW0e9vFawrKTDAw==
  • Thread-topic: [Xen-devel] [PATCH] do_memory_op: cleanup if copy_to_guest fails

On 16/12/2010 17:59, "Olaf Hering" <olaf@xxxxxxxxx> wrote:

> Undo the page allocation in the ulikely event the copy_to_guest fails.

You can't really clean up in this case. Once a page has been alloc'ed to a
domain, it can immediately see it and map it. Trying to then
free_domheap_page() ignoring the current page reference count is actually
introducing a bug.

Leaving a bit of a mess on failed copy_to_guest is okay imo, as that is
usually a pretty fatal sign anyway. If there were good reason for cleaning
up better, we should at least be doing if (test_and_clear(PGC_allocated))
put_page().

 -- Keir

> Signed-off-by: Olaf Hering <olaf@xxxxxxxxx>
> 
> ---
> 
> I have not exercised this code path, it was found during code inspection in
> 4.0
> 
>  xen/common/memory.c |    9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> --- xen-unstable.hg-4.1.22548.orig/xen/common/memory.c
> +++ xen-unstable.hg-4.1.22548/xen/common/memory.c
> @@ -82,7 +82,10 @@ static void increase_reservation(struct
>          {
>              mfn = page_to_mfn(page);
>              if ( unlikely(__copy_to_guest_offset(a->extent_list, i, &mfn, 1))
> )
> +            {
> +                free_domheap_pages(page, a->extent_order);
>                  goto out;
> +            }
>          }
>      }
>  
> @@ -144,7 +147,13 @@ static void populate_physmap(struct memo
>  
>                  /* Inform the domain of the new page's machine address. */
>                  if ( unlikely(__copy_to_guest_offset(a->extent_list, i, &mfn,
> 1)) )
> +                {
> +                    for ( j = 0; j < (1 << a->extent_order); j++ )
> +                        set_gpfn_from_mfn(mfn + j, INVALID_M2P_ENTRY);
> +                    guest_physmap_remove_page(d, gpfn, mfn, a->extent_order);
> +                    free_domheap_pages(page, a->extent_order);
>                      goto out;
> +                }
>              }
>          }
>      }
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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