xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Julien Grall <julien.grall@linaro.org>
To: Arianna Avanzini <avanzini.arianna@gmail.com>
Cc: julien.grall@citrix.com, paolo.valente@unimore.it, keir@xen.org,
	stefano.stabellini@eu.citrix.com, tim@xen.org,
	dario.faggioli@citrix.com, Ian.Jackson@eu.citrix.com,
	xen-devel@lists.xen.org, Ian.Campbell@eu.citrix.com,
	etrudeau@broadcom.com, JBeulich@suse.com,
	viktor.kleinik@globallogic.com
Subject: Re: [PATCH v4 2/7] arch, arm: add consistency checks to REMOVE p2m changes
Date: Tue, 25 Mar 2014 13:10:39 +0000	[thread overview]
Message-ID: <5331804F.3070208@linaro.org> (raw)
In-Reply-To: <53317BE7.1080805@linaro.org>

On 03/25/2014 12:51 PM, Julien Grall wrote:
> Hi Arianna,
> 
> Thank you for the patch,
> 
> On 03/25/2014 02:02 AM, Arianna Avanzini wrote:
>> Currently, the REMOVE case of the switch in apply_p2m_changes()
>> does not perform any consistency check on the mapping to be removed.
>> More in detail, the code does not check if the guest address to be
>> unmapped is actually mapped to the machine address given as a
>> parameter.
>> This commit attempts to add the above-described consistency check
>> to the REMOVE path of apply_p2m_changes(). This is instrumental to
>> one of the following commits which implements the possibility to
>> trigger the removal of p2m ranges via the memory_mapping DOMCTL
>> for ARM.
>>
>> Signed-off-by: Arianna Avanzini <avanzini.arianna@gmail.com>
>> Cc: Dario Faggioli <dario.faggioli@citrix.com>
>> Cc: Paolo Valente <paolo.valente@unimore.it>
>> Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>> Cc: Julien Grall <julien.grall@citrix.com>
>> Cc: Ian Campbell <Ian.Campbell@eu.citrix.com>
>> Cc: Jan Beulich <JBeulich@suse.com>
>> Cc: Keir Fraser <keir@xen.org>
>> Cc: Tim Deegan <tim@xen.org>
>> Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>
>> Cc: Eric Trudeau <etrudeau@broadcom.com>
>> Cc: Viktor Kleinik <viktor.kleinik@globallogic.com>
>>
>> ---
>>
>>     v4:
>>         - Remove useless and slow lookup and use already-available
>>           data from pte instead.
>>         - Correctly increment the local variable used to keep the
>>           machine address whose mapping is currently being removed.
>>         - Return with an error upon finding a mismatch between the
>>           actual machine address mapped to the guest address and
>>           the machine address passed as parameter, instead of just
>>           skipping the page.
>>
>> ---
>>  xen/arch/arm/p2m.c | 24 ++++++++++++++++++++----
>>  1 file changed, 20 insertions(+), 4 deletions(-)
>>
>> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
>> index d00c882..bb0db16 100644
>> --- a/xen/arch/arm/p2m.c
>> +++ b/xen/arch/arm/p2m.c
>> @@ -243,12 +243,13 @@ static int apply_p2m_changes(struct domain *d,
>>      int rc;
>>      struct p2m_domain *p2m = &d->arch.p2m;
>>      lpae_t *first = NULL, *second = NULL, *third = NULL;
>> -    paddr_t addr;
>> +    paddr_t addr, _maddr;
>>      unsigned long cur_first_page = ~0,
>>                    cur_first_offset = ~0,
>>                    cur_second_offset = ~0;
>>      unsigned long count = 0;
>>      unsigned int flush = 0;
>> +    unsigned long mfn;
>>      bool_t populate = (op == INSERT || op == ALLOCATE);
>>      lpae_t pte;
>>  
>> @@ -258,6 +259,7 @@ static int apply_p2m_changes(struct domain *d,
>>          p2m_load_VTTBR(d);
>>  
>>      addr = start_gpaddr;
>> +    _maddr = maddr;
> 
> You don't need a temporary variable to hold maddr and increment it.
> You can directly use maddr, but you will have to remove "maddr +=
> PAGE_SIZE" in INSERT.
> 
> You also need to increment maddr when first/second level are not valid.
> 
> While reading the code, I'm wondering if we need to return an error if
> we are trying to remove a non-existent page. Ian, Stefano, any thoughs?
> 
>>      while ( addr < end_gpaddr )
>>      {
>>          if ( cur_first_page != p2m_first_level_index(addr) )
>> @@ -327,6 +329,7 @@ static int apply_p2m_changes(struct domain *d,
>>  
>>          flush |= pte.p2m.valid;
>>  
>> +        mfn = pte.p2m.base;
> 
> I would move mfn = ... in REMOVE part because it may not be valid on
> some place and wrongly used in the future.
> 
>>          /* TODO: Handle other p2m type
>>           *
>>           * It's safe to do the put_page here because page_alloc will
>> @@ -335,8 +338,6 @@ static int apply_p2m_changes(struct domain *d,
>>           */
>>          if ( pte.p2m.valid && p2m_is_foreign(pte.p2m.type) )
>>          {
>> -            unsigned long mfn = pte.p2m.base;
>> -
>>              ASSERT(mfn_valid(mfn));
>>              put_page(mfn_to_page(mfn));
>>          }
>> @@ -367,9 +368,23 @@ static int apply_p2m_changes(struct domain *d,
>>                      maddr += PAGE_SIZE;
>>                  }
>>                  break;
>> -            case RELINQUISH:
>>              case REMOVE:
>>                  {
>> +                    ASSERT(pte.p2m.valid);
> 
> Why did you add an ASSERT here?

Hmmm ... after reading you patch #4, this assert is wrong. Anyone that
can call XEN_DOMCTL_memory_mapping (e.g the toolstack) can crash Xen
because there is no check that the GFN has a valid mapping.

You should replace this ASSERT by an if ...

Regards,

-- 
Julien Grall

  reply	other threads:[~2014-03-25 13:10 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-25  2:02 [PATCH v4 0/7] Implement the XEN_DOMCTL_memory_mapping hypercall for ARM Arianna Avanzini
2014-03-25  2:02 ` [PATCH v4 1/7] arch, arm: domain build: let dom0 access I/O memory of mapped devices Arianna Avanzini
2014-03-25 12:37   ` Julien Grall
2014-03-25  2:02 ` [PATCH v4 2/7] arch, arm: add consistency checks to REMOVE p2m changes Arianna Avanzini
2014-03-25 12:18   ` Stefano Stabellini
2014-03-25 12:51   ` Julien Grall
2014-03-25 13:10     ` Julien Grall [this message]
2014-03-25 17:41   ` Ian Campbell
2014-03-25  2:02 ` [PATCH v4 3/7] arch, arm: let map_mmio_regions() take pfn as parameters Arianna Avanzini
2014-03-25 12:22   ` Stefano Stabellini
2014-03-25 12:54     ` Julien Grall
2014-03-28 12:51       ` Arianna Avanzini
2014-03-28 13:31         ` Julien Grall
2014-03-25 13:00   ` Julien Grall
2014-03-25  2:02 ` [PATCH v4 4/7] xen, common: add the XEN_DOMCTL_memory_mapping hypercall Arianna Avanzini
2014-03-25  9:33   ` Jan Beulich
2014-03-28 13:24     ` Arianna Avanzini
2014-03-28 13:30       ` Jan Beulich
2014-03-25 12:35   ` Stefano Stabellini
2014-03-25 14:10     ` Jan Beulich
2014-03-25 15:10       ` Stefano Stabellini
2014-03-25 15:36         ` Jan Beulich
2014-03-25 15:42           ` Stefano Stabellini
2014-04-01 15:01             ` Ian Campbell
2014-04-01 15:18               ` Jan Beulich
2014-04-01 15:37                 ` Ian Campbell
2014-03-25 13:17   ` Julien Grall
2014-04-01 14:52     ` Ian Campbell
2014-04-01 15:16       ` Julien Grall
2014-04-01 15:39         ` Ian Campbell
2014-04-01 16:00           ` Julien Grall
2014-04-02  9:43             ` Ian Campbell
2014-04-02 10:06               ` Jan Beulich
2014-04-02 10:19                 ` Ian Campbell
2014-04-02 10:53                   ` Jan Beulich
2014-04-05 12:08                     ` Arianna Avanzini
2014-04-06 16:23                       ` Stefano Stabellini
2014-04-07  7:01                       ` Jan Beulich
2014-03-25  2:02 ` [PATCH v4 5/7] tools, libxl: parse optional start gfn from the iomem config option Arianna Avanzini
2014-03-25 15:39   ` Julien Grall
2014-03-25 15:45     ` Julien Grall
2014-03-25 16:27     ` Ian Campbell
2014-03-25  2:02 ` [PATCH v4 6/7] tools, libxl: add helpers to establish if guest is auto-translated Arianna Avanzini
2014-03-25  2:02 ` [PATCH v4 7/7] tools, libxl: handle the iomem parameter with the memory_mapping hcall Arianna Avanzini
2014-04-01 15:13   ` Ian Campbell
2014-04-01 15:26     ` Julien Grall
2014-04-01 15:34       ` Ian Campbell
2014-04-01 20:52       ` Daniel De Graaf
2014-04-02  9:45         ` Ian Campbell
2014-04-02 14:14           ` Daniel De Graaf

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=5331804F.3070208@linaro.org \
    --to=julien.grall@linaro.org \
    --cc=Ian.Campbell@eu.citrix.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=JBeulich@suse.com \
    --cc=avanzini.arianna@gmail.com \
    --cc=dario.faggioli@citrix.com \
    --cc=etrudeau@broadcom.com \
    --cc=julien.grall@citrix.com \
    --cc=keir@xen.org \
    --cc=paolo.valente@unimore.it \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=tim@xen.org \
    --cc=viktor.kleinik@globallogic.com \
    --cc=xen-devel@lists.xen.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).