xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Chao Gao <chao.gao@intel.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: "george.dunlap@eu.citrix.com" <george.dunlap@eu.citrix.com>,
	"andrew.cooper3@citrix.com" <andrew.cooper3@citrix.com>,
	"dario.faggioli@citrix.com" <dario.faggioli@citrix.com>,
	"Tian, Kevin" <kevin.tian@intel.com>,
	"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>
Subject: Re: [PATCH v8 5/7] VT-d: No need to set irq affinity for posted format IRTE
Date: Wed, 22 Feb 2017 15:24:54 +0800	[thread overview]
Message-ID: <20170222072453.GA63021@skl-2s3.sh.intel.com> (raw)
In-Reply-To: <5834261702000078001208F6@prv-mh.provo.novell.com>

On Tue, Nov 22, 2016 at 06:03:51PM +0800, Jan Beulich wrote:
>>>> On 18.11.16 at 02:58, <feng.wu@intel.com> wrote:
>> --- a/xen/drivers/passthrough/vtd/intremap.c
>> +++ b/xen/drivers/passthrough/vtd/intremap.c
>> @@ -600,27 +600,41 @@ static int msi_msg_to_remap_entry(
>>
>>      if ( !pi_desc )
>>      {
>> -        /* Set interrupt remapping table entry */
>> -        new_ire.remap.fpd = 0;
>> -        new_ire.remap.dm = (msg->address_lo >> MSI_ADDR_DESTMODE_SHIFT) & 0x1;
>> -        new_ire.remap.tm = (msg->data >> MSI_DATA_TRIGGER_SHIFT) & 0x1;
>> -        new_ire.remap.dlm = (msg->data >> MSI_DATA_DELIVERY_MODE_SHIFT) & 0x1;
>> -        /* Hardware require RH = 1 for LPR delivery mode */
>> -        new_ire.remap.rh = (new_ire.remap.dlm == dest_LowestPrio);
>> -        new_ire.remap.avail = 0;
>> -        new_ire.remap.res_1 = 0;
>> -        new_ire.remap.vector = (msg->data >> MSI_DATA_VECTOR_SHIFT) &
>> -                                MSI_DATA_VECTOR_MASK;
>> -        new_ire.remap.res_2 = 0;
>> -        if ( x2apic_enabled )
>> -            new_ire.remap.dst = msg->dest32;
>> -        else
>> -            new_ire.remap.dst = ((msg->address_lo >> MSI_ADDR_DEST_ID_SHIFT)
>> -                                 & 0xff) << 8;
>> +        /*
>> +         * We are here because we are trying to update the IRTE to remapped mode,
>> +         * we only need to update the remapped specific fields for the following
>> +         * two cases:
>> +         * 1. When we create a new IRTE. A new IRTE is created when we create a
>> +         *    new irq, so a new IRTE is always initialized with remapped format.
>> +         * 2. When the old IRTE is present and in remapped mode. Since if  the old
>> +         *    IRTE is in posted mode, we cannot update it to remapped mode and
>> +         *    this is what we need to suppress. So we don't update the remapped
>> +         *    specific fields here, we only update the commom field.
>> +         */
>> +        if ( !iremap_entry->remap.p || !iremap_entry->remap.im )
>> +        {
>> +            /* Set interrupt remapping table entry */
>> +            new_ire.remap.fpd = 0;
>> +            new_ire.remap.dm = (msg->address_lo >> MSI_ADDR_DESTMODE_SHIFT) & 0x1;
>> +            new_ire.remap.tm = (msg->data >> MSI_DATA_TRIGGER_SHIFT) & 0x1;
>> +            new_ire.remap.dlm = (msg->data >> MSI_DATA_DELIVERY_MODE_SHIFT) & 0x1;
>> +            /* Hardware require RH = 1 for LPR delivery mode */
>> +            new_ire.remap.rh = (new_ire.remap.dlm == dest_LowestPrio);
>> +            new_ire.remap.avail = 0;
>> +            new_ire.remap.res_1 = 0;
>> +            new_ire.remap.vector = (msg->data >> MSI_DATA_VECTOR_SHIFT) &
>> +                                    MSI_DATA_VECTOR_MASK;
>> +            new_ire.remap.res_2 = 0;
>> +            if ( x2apic_enabled )
>> +                new_ire.remap.dst = msg->dest32;
>> +            else
>> +                new_ire.remap.dst = ((msg->address_lo >> MSI_ADDR_DEST_ID_SHIFT)
>> +                                     & 0xff) << 8;
>>
>> -        new_ire.remap.res_3 = 0;
>> -        new_ire.remap.res_4 = 0;
>> -        new_ire.remap.p = 1;    /* finally, set present bit */
>> +            new_ire.remap.res_3 = 0;
>> +            new_ire.remap.res_4 = 0;
>> +            new_ire.remap.p = 1;    /* finally, set present bit */
>> +        }
>
>I disagree with this entire change, including namely point 2 of the
>comment. There should be no special casing of either transition
>here - the caller should provide you with input correctly identifying
>which of the two formats is to be generated. This certainly is
>connected to one of the comments I've just made on patch 4.
>

If we reach an agreement on patch 4, the logic will be more general and the problem 
will disappear.

>> @@ -657,25 +671,28 @@ static int msi_msg_to_remap_entry(
>>      remap_rte->address_hi = 0;
>>      remap_rte->data = index - i;
>>
>> -    if ( !pi_desc )
>> -        memcpy(iremap_entry, &new_ire, sizeof(struct iremap_entry));
>> -    else
>> +    if ( iremap_entry->val != new_ire.val )
>>      {
>> -        __uint128_t ret;
>> +        if ( !pi_desc )
>> +            memcpy(iremap_entry, &new_ire, sizeof(struct iremap_entry));
>> +        else
>> +        {
>> +            __uint128_t ret;
>>
>> -        old_ire = *iremap_entry;
>> -        ret = cmpxchg16b(iremap_entry, &old_ire, &new_ire);
>> +            old_ire = *iremap_entry;
>> +            ret = cmpxchg16b(iremap_entry, &old_ire, &new_ire);
>>
>> -        /*
>> -         * In the above, we use cmpxchg16 to atomically update the 128-bit IRTE,
>> -         * and the hardware cannot update the IRTE behind us, so the return value
>> -         * of cmpxchg16 should be the same as old_ire. This ASSERT validate it.
>> -         */
>> -        ASSERT(ret == old_ire.val);
>> -    }
>> +            /*
>> +             * In the above, we use cmpxchg16 to atomically update the 128-bit IRTE,
>> +             * and the hardware cannot update the IRTE behind us, so the return value
>> +             * of cmpxchg16 should be the same as old_ire. This ASSERT validate it.
>> +             */
>> +            ASSERT(ret == old_ire.val);
>> +        }
>>
>> -    iommu_flush_cache_entry(iremap_entry, sizeof(struct iremap_entry));
>> -    iommu_flush_iec_index(iommu, 0, index);
>> +        iommu_flush_cache_entry(iremap_entry, sizeof(struct iremap_entry));
>> +        iommu_flush_iec_index(iommu, 0, index);
>> +    }
>>
>>      unmap_vtd_domain_page(iremap_entries);
>>      spin_unlock_irqrestore(&ir_ctrl->iremap_lock, flags);
>
>This second hunk is imo all this patch should consist of.
>
>Jan
>
>_______________________________________________
>Xen-devel mailing list
>Xen-devel@lists.xen.org
>https://lists.xen.org/xen-devel

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

  reply	other threads:[~2017-02-22  7:24 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-18  1:58 [PATCH v8 5/7] VT-d: No need to set irq affinity for posted format IRTE Feng Wu
2016-11-18  4:44 ` Tian, Kevin
2016-11-22  4:31   ` Wu, Feng
2016-11-22 10:03 ` Jan Beulich
2017-02-22  7:24   ` Chao Gao [this message]
  -- strict thread matches above, loose matches on Subject: below --
2016-11-18  1:57 [PATCH v8 0/7] VMX: Properly handle pi descriptor and per-cpu blocking list Feng Wu
2016-11-18  1:57 ` [PATCH v8 5/7] VT-d: No need to set irq affinity for posted format IRTE Feng Wu

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=20170222072453.GA63021@skl-2s3.sh.intel.com \
    --to=chao.gao@intel.com \
    --cc=JBeulich@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=dario.faggioli@citrix.com \
    --cc=george.dunlap@eu.citrix.com \
    --cc=kevin.tian@intel.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).