All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Jan Beulich <jbeulich@suse.com>,
	"xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>
Cc: "George Dunlap" <george.dunlap@citrix.com>,
	"Wei Liu" <wl@xen.org>, "Roger Pau Monné" <roger.pau@citrix.com>
Subject: Re: [PATCH v2 2/6] x86/mem-paging: correct p2m_mem_paging_prep()'s error handling
Date: Fri, 15 May 2020 15:40:21 +0100	[thread overview]
Message-ID: <2cccf9bb-3930-436d-65de-f0eb7dd0c498@citrix.com> (raw)
In-Reply-To: <bf9dd27b-a7db-de0e-a804-d687e66ecf1e@suse.com>

On 23/04/2020 09:37, Jan Beulich wrote:
> Communicating errors from p2m_set_entry() to the caller is not enough:
> Neither the M2P nor the stats updates should occur in such a case.

"neither".  Following a colon/semicolon isn't the start of a new sentence.

> Instead the allocated page needs to be freed again; for cleanliness
> reasons also properly take into account _PGC_allocated there.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -1781,7 +1781,7 @@ void p2m_mem_paging_populate(struct doma
>   */
>  int p2m_mem_paging_prep(struct domain *d, unsigned long gfn_l, uint64_t buffer)
>  {
> -    struct page_info *page;
> +    struct page_info *page = NULL;
>      p2m_type_t p2mt;
>      p2m_access_t a;
>      gfn_t gfn = _gfn(gfn_l);
> @@ -1816,9 +1816,19 @@ int p2m_mem_paging_prep(struct domain *d
>              goto out;
>          /* Get a free page */
>          ret = -ENOMEM;
> -        page = alloc_domheap_page(p2m->domain, 0);
> +        page = alloc_domheap_page(d, 0);
>          if ( unlikely(page == NULL) )
>              goto out;
> +        if ( unlikely(!get_page(page, d)) )
> +        {
> +            /*
> +             * The domain can't possibly know about this page yet, so failure
> +             * here is a clear indication of something fishy going on.
> +             */

This needs a gprintk(XENLOG_ERR, ...) of some form.  (which also reminds
me that I *still* need to finish my patch forcing everyone to provide
something to qualify the domain crash, so release builds of Xen get some
hint as to what went on or why.)

> +            domain_crash(d);
> +            page = NULL;
> +            goto out;
> +        }
>          mfn = page_to_mfn(page);
>          page_extant = 0;
>  
> @@ -1832,7 +1842,6 @@ int p2m_mem_paging_prep(struct domain *d
>                       "Failed to load paging-in gfn %lx Dom%d bytes left %d\n",
>                       gfn_l, d->domain_id, ret);
>              ret = -EFAULT;
> -            put_page(page); /* Don't leak pages */
>              goto out;            
>          }
>      }
> @@ -1843,13 +1852,24 @@ int p2m_mem_paging_prep(struct domain *d
>      ret = p2m_set_entry(p2m, gfn, mfn, PAGE_ORDER_4K,
>                          paging_mode_log_dirty(d) ? p2m_ram_logdirty
>                                                   : p2m_ram_rw, a);
> -    set_gpfn_from_mfn(mfn_x(mfn), gfn_l);
> +    if ( !ret )
> +    {
> +        set_gpfn_from_mfn(mfn_x(mfn), gfn_l);
>  
> -    if ( !page_extant )
> -        atomic_dec(&d->paged_pages);
> +        if ( !page_extant )
> +            atomic_dec(&d->paged_pages);
> +    }
>  
>   out:
>      gfn_unlock(p2m, gfn, 0);
> +
> +    if ( page )
> +    {
> +        if ( ret )
> +            put_page_alloc_ref(page);
> +        put_page(page);

This is a very long way from clear enough to follow, and buggy if anyone
inserts a new goto out path.

~Andrew

> +    }
> +
>      return ret;
>  }
>  
>



  parent reply	other threads:[~2020-05-15 14:41 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-23  8:34 [PATCH v2 0/6] x86/mem-paging: misc cleanup Jan Beulich
2020-04-23  8:37 ` [PATCH v2 1/6] x86/mem-paging: fold p2m_mem_paging_prep()'s main if()-s Jan Beulich
2020-05-14 15:45   ` Roger Pau Monné
2020-05-14 15:51     ` Jan Beulich
2020-05-15 12:02   ` Andrew Cooper
2020-04-23  8:37 ` [PATCH v2 2/6] x86/mem-paging: correct p2m_mem_paging_prep()'s error handling Jan Beulich
2020-05-14 15:57   ` Roger Pau Monné
2020-05-15 14:40   ` Andrew Cooper [this message]
2020-05-15 15:15     ` Jan Beulich
2020-05-15 20:02       ` Andrew Cooper
2020-04-23  8:38 ` [PATCH v2 3/6] x86/mem-paging: use guest handle for XENMEM_paging_op_prep Jan Beulich
2020-05-14 16:13   ` Roger Pau Monné
2020-05-15 14:14   ` Ping: " Jan Beulich
2020-05-15 14:46   ` Andrew Cooper
2020-05-15 16:40   ` Wei Liu
2020-04-23  8:38 ` [PATCH v2 4/6] x86/mem-paging: add minimal lock order enforcement to p2m_mem_paging_prep() Jan Beulich
2020-05-14 16:25   ` Roger Pau Monné
2020-05-15  9:46     ` Jan Beulich
2020-05-15 10:21       ` Roger Pau Monné
2020-04-23  8:39 ` [PATCH v2 5/6] x86/mem-paging: move code to its dedicated source file Jan Beulich
2020-05-14 16:29   ` Roger Pau Monné
2020-05-15 15:45   ` Andrew Cooper
2020-04-23  8:39 ` [PATCH v2 6/6] x86/mem-paging: consistently use gfn_t Jan Beulich
2020-05-14 16:36   ` Roger Pau Monné
2020-05-15 15:49   ` Andrew Cooper
2020-05-15 15:52     ` Andrew Cooper

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2cccf9bb-3930-436d-65de-f0eb7dd0c498@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=george.dunlap@citrix.com \
    --cc=jbeulich@suse.com \
    --cc=roger.pau@citrix.com \
    --cc=wl@xen.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.