All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gavin Shan <gwshan@linux.vnet.ibm.com>
To: Alex Williamson <alex.williamson@redhat.com>
Cc: aik@ozlabs.ru, Gavin Shan <gwshan@linux.vnet.ibm.com>,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [RFC PATCH 2/2] VFIO: Clear stale MSIx table during EEH reset
Date: Fri, 29 Aug 2014 17:13:43 +1000	[thread overview]
Message-ID: <20140829071343.GA5693@shangw> (raw)
In-Reply-To: <1409146181.2906.249.camel@ul30vt.home>

On Wed, Aug 27, 2014 at 07:29:41AM -0600, Alex Williamson wrote:
>On Wed, 2014-08-27 at 23:15 +1000, Gavin Shan wrote:
>> On Tue, Aug 26, 2014 at 02:25:47PM -0600, Alex Williamson wrote:
>> >On Wed, 2014-08-20 at 19:52 +1000, Gavin Shan wrote:
>> >> The PCI device MSIx table is cleaned out in hardware after EEH PE
>> >> reset. However, we still hold the stale MSIx entries in QEMU, which
>> >> should be cleared accordingly. Otherwise, we will run into another
>> >> (recursive) EEH error and the PCI devices contained in the PE have
>> >> to be offlined exceptionally.
>> >> 
>> >> The patch clears stale MSIx table before EEH PE reset so that MSIx
>> >> table could be restored properly after EEH PE reset.
>> >> 
>> >> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
>> >> ---
>> >>  hw/misc/vfio.c | 24 ++++++++++++++++++++++++
>> >>  1 file changed, 24 insertions(+)
>> >> 
>> >> diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
>> >> index 1a3e7eb..3cf7f02 100644
>> >> --- a/hw/misc/vfio.c
>> >> +++ b/hw/misc/vfio.c
>> >> @@ -4424,6 +4424,8 @@ int vfio_container_ioctl(AddressSpace *as, int32_t groupid,
>> >>  {
>> >>      VFIOGroup *group;
>> >>      VFIOContainer *container;
>> >> +    VFIODevice *vdev;
>> >> +    struct vfio_eeh_pe_op *arg;
>> >
>> >Define these within the scope of the case since they're not used outside
>> >of it.
>> >
>> 
>> Yes, I'll fix.
>> 
>> >>      int ret = -1;
>> >>  
>> >>      group = vfio_get_group(groupid, as);
>> >> @@ -4442,7 +4444,29 @@ int vfio_container_ioctl(AddressSpace *as, int32_t groupid,
>> >>      switch (req) {
>> >>      case VFIO_CHECK_EXTENSION:
>> >>      case VFIO_IOMMU_SPAPR_TCE_GET_INFO:
>> >> +        break;
>> >>      case VFIO_EEH_PE_OP:
>> >> +        arg = (struct vfio_eeh_pe_op *)param;
>> >> +        switch (arg->op) {
>> >> +        case VFIO_EEH_PE_RESET_HOT:
>> >> +        case VFIO_EEH_PE_RESET_FUNDAMENTAL:
>> >> +            /*
>> >> +             * The MSIx table will be cleaned out by reset. We need
>> >> +             * disable it so that it can be reenabled properly. Also,
>> >> +             * the cached MSIx table should be cleared as it's not
>> >> +             * reflecting the contents in hardware.
>> >> +             */
>> >> +            QLIST_FOREACH(vdev, &group->device_list, next) {
>> >> +                if (msix_enabled(&vdev->pdev)) {
>> >> +                    vfio_disable_msix(vdev);
>> >> +                }
>> >> +
>> >> +                msix_reset(&vdev->pdev);
>> >> +            }
>> >
>> >We already have vfio_disable_interrupts(), can't we use that (blindly)?
>> >Do we really need to call msix_reset()?  If so, should
>> >vfio_disable_msix() call it?
>> >
>> 
>> Yes, vfio_disable_interrupts() would be better to be used here as it
>> can covers all types of interrupt (INTx/MSI/MSIx).
>> 
>> vfio_disable_interrupts() needn't clear MSIx vectors. If you prefer
>> calling msix_reset() in the function, I guess I have to add one more
>> parameter to vfio_disable_interrupts() to indicate if we need clear
>> MSI/MSIx vector:
>> 
>> static void vfio_disable_interrupts(VFIODevice *vdev, bool clr_vector)
>
>How about just creating a vfio_reset_interrupts() that calls
>msix_reset() if the device supports MSIX?  We could wrap
>vfio_disable_interrupts() and vfio_reset_interrupts() into a
>vfio_disable_and_reset_interrupts(), but I'm not sure it's worth it.
>The reset device path should also add the interrupt reset call.  Thanks,
>

Thanks, Alex. It sounds a better way. I'll refactor the code
and send v2 out for your comments.

Thanks,
Gavin

>Alex
>
>> >> +
>> >> +            break;
>> >
>> >Extraneous break
>> >
>> 
>> Yep, I'll remove it.
>> 
>> >> +        }
>> >> +
>> >>          break;
>> >>      default:
>> >>          /* Return an error on unknown requests */
>> >
>> >Thanks,
>> >Alex
>> >
>> 
>> Thanks,
>> Gavin
>> 
>
>
>

  reply	other threads:[~2014-08-29  7:14 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-20  9:52 [Qemu-devel] [RFC PATCH 0/2] Fix MSIx lost after PE reset Gavin Shan
2014-08-20  9:52 ` [Qemu-devel] [RFC PATCH 1/2] VFIO: Drop vfio_container_do_ioctl() Gavin Shan
2014-08-26 10:27   ` Alexey Kardashevskiy
2014-08-26 20:05     ` Alex Williamson
2014-08-20  9:52 ` [Qemu-devel] [RFC PATCH 2/2] VFIO: Clear stale MSIx table during EEH reset Gavin Shan
2014-08-26 10:25   ` Alexey Kardashevskiy
2014-08-26 20:25   ` Alex Williamson
2014-08-27 13:15     ` Gavin Shan
2014-08-27 13:29       ` Alex Williamson
2014-08-29  7:13         ` Gavin Shan [this message]
2014-08-26  0:58 ` [Qemu-devel] [RFC PATCH 0/2] Fix MSIx lost after PE reset Gavin Shan

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=20140829071343.GA5693@shangw \
    --to=gwshan@linux.vnet.ibm.com \
    --cc=aik@ozlabs.ru \
    --cc=alex.williamson@redhat.com \
    --cc=qemu-devel@nongnu.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.