xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Tamas K Lengyel <tamas.lengyel@zentific.com>
To: Julien Grall <julien.grall@linaro.org>
Cc: Ian Campbell <ian.campbell@citrix.com>, Tim Deegan <tim@xen.org>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>,
	Stefano Stabellini <stefano.stabellini@citrix.com>,
	Andres Lagar-Cavilla <andres@lagarcavilla.org>,
	Jan Beulich <jbeulich@suse.com>,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	Tamas K Lengyel <tklengyel@sec.in.tum.de>
Subject: Re: [PATCH for-4.5 v8 15/19] xen/arm: Data abort exception (R/W) mem_events.
Date: Wed, 24 Sep 2014 18:27:16 +0200	[thread overview]
Message-ID: <CAErYnsgmupM7SQifbOwcfiT55kH-iCGAbFS1j+j-2PusovyXEQ@mail.gmail.com> (raw)
In-Reply-To: <5422E4AA.4060600@linaro.org>


[-- Attachment #1.1: Type: text/plain, Size: 7264 bytes --]

On Wed, Sep 24, 2014 at 5:35 PM, Julien Grall <julien.grall@linaro.org>
wrote:

> Hello Tamas,
>
> On 09/23/2014 02:14 PM, Tamas K Lengyel wrote:
> > This patch enables to store, set, check and deliver LPAE R/W mem_events.
> > As the LPAE PTE's lack enough available software programmable bits,
> > we store the permissions in a Radix tree. A custom boolean,
> access_in_use,
> > specifies if the tree is in use to avoid uneccessary lookups on an empty
> tree.
>
> unecessary
>

Ack.


> [..]
>
> > +static long p2m_mem_access_radix_set(struct p2m_domain *p2m, unsigned
> long pfn,
>
> Shouldn't "int" enough for the return type?
>
> > +                                     p2m_access_t a)
> > +{
> > +    long rc;
>
> NIT: missing new line here.
>

Ack.


>
> [..]
>
> >  /* Put any references on the single 4K page referenced by pte.  TODO:
> > @@ -553,13 +584,22 @@ static int apply_one_level(struct domain *d,
> >          if ( p2m_valid(orig_pte) )
> >              return P2M_ONE_DESCEND;
> >
> > -        if ( is_mapping_aligned(*addr, end_gpaddr, 0, level_size) )
> > +        if ( is_mapping_aligned(*addr, end_gpaddr, 0, level_size) &&
> > +           /* We only create superpages when mem_access is not in use.
> */
> > +             (level == 3 || (level < 3 && !p2m->access_in_use)) )
>
> Can't this check be moved in is_mapping_aligned? You have nearly the
> same few lines below.
>

Unfortunately not, I already checked and it is used in REMOVE as well in
which case we would need an exception.. and that wasn't very straight
forward.


>
> [..]
>
> > +    case MEMACCESS:
> > +        if ( level < 3 )
> > +        {
> > +            if ( !p2m_valid(orig_pte) )
> > +            {
> > +                *addr += level_size;
> > +                return P2M_ONE_PROGRESS_NOP;
> > +            }
> > +
> > +            /* Shatter large pages as we descend */
> > +            if ( p2m_mapping(orig_pte) )
> > +            {
> > +                rc = p2m_shatter_page(d, entry, level, flush_cache);
> > +
> > +                if ( rc < 0 )
> > +                    return rc;
> > +            } /* else: an existing table mapping -> descend */
> > +
> > +            return P2M_ONE_DESCEND;
> > +        }
> > +        else
> > +        {
> > +            pte = orig_pte;
> > +
> > +            if ( !p2m_table(pte) )
> > +                pte.bits = 0;
> > +
> > +            if ( p2m_valid(pte) )
> > +            {
> > +                ASSERT(pte.p2m.type != p2m_invalid);
>
> Why the ASSERT? I don't see why we wouldn't want to set permission for
> this type of page.
>

Not sure, this I copied from p2m_lookup. Can it even happen that something
passes p2m_valid() but have a type of p2m_invalid? I think that just
signals that something is very wrong.


>
> [..]
>
> > @@ -821,6 +912,21 @@ static int apply_p2m_changes(struct domain *d,
> >              count = 0;
> >          }
> >
> > +        /*
> > +         * Preempt setting mem_access permissions as required by XSA-89,
> > +         * if it's not the last iteration.
> > +         */
> > +        if ( op == MEMACCESS && count )
> > +        {
> > +            int progress = paddr_to_pfn(addr) - start_gpfn + 1;
>
> uint32_t?
>

Ack.


>
>
> NIT: Missing blank line.
>
> > +            if ( (end_gpfn-start_gpfn) > progress && !(progress & mask)
>
> NIT: (end_gpfn - start_gpfn)
>
> Also you are comparing with an "int" with an "unsigned long". I'm not
> sure what could happen in the compiler (implicit cast, sign extension...)
>

Yea, converting to uint32_t is the way to go.


>
> > +                 && hypercall_preempt_check() )
> > +            {
> > +                rc = progress;
> > +                goto out;
>
> Jumping directly to the label "out" will skip flushing the TLB for the
> domain. While it wasn't critical until now, partial redo during
> insertion/allocation or hypercall preemption only for relinquish, the
> guest may use the wrong permission because the TLB hasn't been flushed.
>
> At the same time, it looks like you never request to flush for the
> MEMACCESS operation (see *flush = true). Does memaccess does a TLB flush
> somewhere else?
>

Yes, at the end of p2m_set_mem_access once all PTEs are updated
successfully. I guess we could flush the TLB as we are progressing as well,
it wouldn't hurt.


>
> [..]
>
> > +bool_t p2m_mem_access_check(paddr_t gpa, vaddr_t gla, const struct
> npfec npfec)
> > +{
> > +    int rc;
> > +    bool_t violation;
> > +    xenmem_access_t xma;
> > +    mem_event_request_t *req;
> > +    struct vcpu *v = current;
> > +    struct p2m_domain *p2m = p2m_get_hostp2m(v->domain);
> > +
> > +    /* Mem_access is not in use. */
> > +    if ( !p2m->access_in_use )
> > +        return true;
>
> AFAIU, it's not possible to call this function when mem access is not in
> use. I would turn this check into an ASSERT.
>

It is possible to call this function when mem_access is not in use and it
is called every time there is a permission fault in the second stage
translation. This check here just makes sure the function returns as fast
as possible when not in use.


>
>
> [..]
>
> > +    if ( !violation )
> > +        return true;
> > +
> > +    /* First, handle rx2rw and n2rwx conversion automatically. */
> > +    if ( npfec.write_access && xma == XENMEM_access_rx2rw )
> > +    {
> > +        rc = p2m_set_mem_access(v->domain, paddr_to_pfn(gpa), 1,
> > +                                0, ~0, XENMEM_access_rw);
> > +        return false;
> > +    }
> > +    else if ( xma == XENMEM_access_n2rwx )
> > +    {
> > +        rc = p2m_set_mem_access(v->domain, paddr_to_pfn(gpa), 1,
> > +                                0, ~0, XENMEM_access_rwx);
> > +    }
> > +
> > +    /* Otherwise, check if there is a memory event listener, and send
> the message along */
> > +    if ( !mem_event_check_ring( &v->domain->mem_event->access ) )
>
> NIT: if ( !mem_event_check_ring(&v->domain->mem_event->access) )
>

Ack.


>
> > +    {
> > +        /* No listener */
> > +        if ( p2m->access_required )
> > +        {
> > +            gdprintk(XENLOG_INFO, "Memory access permissions failure, "
> > +                                  "no mem_event listener VCPU %d, dom
> %d\n",
> > +                                  v->vcpu_id, v->domain->domain_id);
> > +            domain_crash(v->domain);
> > +        }
> > +        else
> > +        {
> > +            /* n2rwx was already handled */
> > +            if ( xma != XENMEM_access_n2rwx)
>
> NIT: if ( ... )
>

Ack.


>
> [..]
>
> > +/* Set access type for a region of pfns.
> > + * If start_pfn == -1ul, sets the default access type */
> > +long p2m_set_mem_access(struct domain *d, unsigned long pfn, uint32_t
> nr,
> > +                        uint32_t start, uint32_t mask, xenmem_access_t
> access)
> > +{
>
> [..]
>
> > +    rc = apply_p2m_changes(d, MEMACCESS,
> > +                           pfn_to_paddr(pfn+start),
> pfn_to_paddr(pfn+nr),
> > +                           0, MATTR_MEM, mask, 0, a);
> > +
> > +    if ( rc < 0 )
> > +        return rc;
> > +    else if ( rc > 0 )
> > +        return start+rc;
>
> start + rc
>

Ack.


>
> > +
> > +    flush_tlb_domain(d);
>
> NIT: Missing blank line.
>
>
Ack.


> Regards,
>
>
> --
> Julien Grall
>
>
Thanks!
Tamas

[-- Attachment #1.2: Type: text/html, Size: 11249 bytes --]

[-- Attachment #2: Type: text/plain, Size: 126 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

  reply	other threads:[~2014-09-24 16:27 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-23 13:14 [PATCH for-4.5 v8 00/19] Mem_event and mem_access for ARM Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 01/19] xen: Relocate mem_access and mem_event into common Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 02/19] xen: Relocate struct npfec definition " Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 03/19] xen: Relocate p2m_access_t into common and swap the order Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 04/19] xen: Relocate p2m_mem_access_resume to mem_access common Tamas K Lengyel
2014-09-23 13:28   ` Jan Beulich
2014-09-23 14:04     ` Tamas K Lengyel
2014-09-23 14:08       ` Jan Beulich
2014-09-23 14:15         ` Tamas K Lengyel
2014-09-23 15:02           ` Jan Beulich
2014-09-23 13:14 ` [PATCH for-4.5 v8 05/19] xen: Relocate set_access_required domctl into common Tamas K Lengyel
2014-09-24 14:18   ` Julien Grall
2014-09-24 15:05     ` Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 06/19] xen: Relocate mem_event_op domctl and access_op memop " Tamas K Lengyel
2014-09-23 13:32   ` Jan Beulich
2014-09-23 14:00     ` Razvan Cojocaru
2014-09-23 14:07       ` Jan Beulich
2014-09-23 14:13         ` Tamas K Lengyel
2014-09-23 14:23           ` Razvan Cojocaru
2014-09-23 14:28             ` Tamas K Lengyel
2014-09-23 14:19         ` Razvan Cojocaru
2014-09-23 14:08       ` Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 07/19] x86/p2m: Typo fix for spelling ambiguous Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 08/19] xen/mem_event: Clean out superfluous white-spaces Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 09/19] xen/mem_event: Relax error condition on debug builds Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 10/19] xen/mem_event: Abstract architecture specific sanity checks Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 11/19] xen/mem_access: Abstract architecture specific sanity check Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 12/19] xen/arm: p2m changes for mem_access support Tamas K Lengyel
2014-09-24 14:40   ` Ian Campbell
2014-09-24 16:58     ` Tamas K Lengyel
2014-09-24 17:14       ` Razvan Cojocaru
2014-09-24 14:43   ` Julien Grall
2014-09-24 16:48     ` Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 13/19] xen/arm: Implement domain_get_maximum_gpfn Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 14/19] xen/arm: Add p2m_set_permission and p2m_shatter_page helpers Tamas K Lengyel
2014-09-24 14:48   ` Julien Grall
2014-09-23 13:14 ` [PATCH for-4.5 v8 15/19] xen/arm: Data abort exception (R/W) mem_events Tamas K Lengyel
2014-09-24 15:02   ` Ian Campbell
2014-09-24 16:17     ` Tamas K Lengyel
2014-09-24 15:35   ` Julien Grall
2014-09-24 16:27     ` Tamas K Lengyel [this message]
2014-09-24 16:51       ` Julien Grall
2014-09-24 17:13         ` Tamas K Lengyel
2014-09-24 20:52           ` Julien Grall
2014-09-24 21:24             ` Tamas K Lengyel
2014-09-24 22:07               ` Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 16/19] xen/arm: Instruction prefetch abort (X) mem_event handling Tamas K Lengyel
2014-09-24 15:05   ` Ian Campbell
2014-09-24 17:04     ` Tamas K Lengyel
2014-09-24 15:41   ` Julien Grall
2014-09-24 17:08     ` Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 17/19] xen/arm: Enable the compilation of mem_access and mem_event on ARM Tamas K Lengyel
2014-09-24 15:08   ` Ian Campbell
2014-09-24 15:42   ` Julien Grall
2014-09-23 13:14 ` [PATCH for-4.5 v8 18/19] tools/libxc: Allocate magic page for mem access " Tamas K Lengyel
2014-09-23 13:14 ` [PATCH for-4.5 v8 19/19] tools/tests: Enable xen-access " Tamas K Lengyel
2014-09-24 15:12   ` Ian Campbell
2014-09-24 16:05     ` Tamas K Lengyel

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=CAErYnsgmupM7SQifbOwcfiT55kH-iCGAbFS1j+j-2PusovyXEQ@mail.gmail.com \
    --to=tamas.lengyel@zentific.com \
    --cc=andres@lagarcavilla.org \
    --cc=dgdegra@tycho.nsa.gov \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=julien.grall@linaro.org \
    --cc=stefano.stabellini@citrix.com \
    --cc=tim@xen.org \
    --cc=tklengyel@sec.in.tum.de \
    --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).