public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Alex Williamson <alex.williamson@redhat.com>
To: "Tian, Kevin" <kevin.tian@intel.com>
Cc: "kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"eric.auger@redhat.com" <eric.auger@redhat.com>,
	"clg@redhat.com" <clg@redhat.com>,
	"Chatre, Reinette" <reinette.chatre@intel.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 1/7] vfio/pci: Disable auto-enable of exclusive INTx IRQ
Date: Thu, 7 Mar 2024 13:17:16 -0700	[thread overview]
Message-ID: <20240307131716.5feda507.alex.williamson@redhat.com> (raw)
In-Reply-To: <BL1PR11MB52711AF96C93A7C2B70FE12D8C202@BL1PR11MB5271.namprd11.prod.outlook.com>

On Thu, 7 Mar 2024 08:28:45 +0000
"Tian, Kevin" <kevin.tian@intel.com> wrote:

> > From: Alex Williamson <alex.williamson@redhat.com>
> > Sent: Thursday, March 7, 2024 5:15 AM
> > 
> > Currently for devices requiring masking at the irqchip for INTx, ie.
> > devices without DisINTx support, the IRQ is enabled in request_irq()
> > and subsequently disabled as necessary to align with the masked status
> > flag.  This presents a window where the interrupt could fire between
> > these events, resulting in the IRQ incrementing the disable depth twice.  
> 
> Can you elaborate the last point about disable depth?

Each irq_desc maintains a depth field, a disable increments the depth,
an enable decrements.  On the disable transition from 0 to 1 the IRQ
chip is disabled, on the enable transition from 1 to 0 the IRQ chip is
enabled.

Therefore if an interrupt fires between request_irq() and
disable_irq(), vfio_intx_handler() will disable the IRQ (depth 0->1).
Note that masked is not tested here, the interrupt is expected to be
exclusive for non-pci_2_3 devices.  @masked would be redundantly set to
true.  The setup call path would increment depth to 2.  The order these
happen is not important so long as the interrupt is in-flight before
the setup path disables the IRQ.

> > This would be unrecoverable for a user since the masked flag prevents
> > nested enables through vfio.  
> 
> What is 'nested enables'?

In the case above we have masked true and disable depth 2.  If the user
now unmasks the interrupt then depth is reduced to 1, the IRQ is still
disabled, and masked is false.  The masked value is now out of sync
with the IRQ line and prevents the user from unmasking again.  The
disable depth is stuck at 1.

Nested enables would be if we allowed the user to unmask a line that we
think is already unmasked.
 
> > Instead, invert the logic using IRQF_NO_AUTOEN such that exclusive INTx
> > is never auto-enabled, then unmask as required.
> > 
> > Fixes: 89e1f7d4c66d ("vfio: Add PCI device driver")
> > Signed-off-by: Alex Williamson <alex.williamson@redhat.com>  
> 
> But this patch looks good to me:
> 
> Reviewed-by: Kevin Tian <kevin.tian@intel.com>
> 
> with one nit...
> 
> > 
> > +	/*
> > +	 * Devices without DisINTx support require an exclusive interrupt,
> > +	 * IRQ masking is performed at the IRQ chip.  The masked status is  
> 
> "exclusive interrupt, with IRQ masking performed at..."

TBH, the difference is too subtle for me.  With my version above you
could replace the comma with a period, I think it has the same meaning.
However, "...exclusive interrupt, with IRQ masking performed at..."
almost suggests that we need a specific type of exclusive interrupt
with this property.  There's nothing unique about the exclusive
interrupt, we could arbitrarily decide we want an exclusive interrupt
for DisINTx masking if we wanted to frustrate a lot of users.

Performing masking at the IRQ chip is actually what necessitates the
exclusive interrupt here.  Thanks,

Alex


  reply	other threads:[~2024-03-07 20:17 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-06 21:14 [PATCH 0/7] vfio: Interrupt eventfd hardening Alex Williamson
2024-03-06 21:14 ` [PATCH 1/7] vfio/pci: Disable auto-enable of exclusive INTx IRQ Alex Williamson
2024-03-07  8:28   ` Tian, Kevin
2024-03-07 20:17     ` Alex Williamson [this message]
2024-03-08  7:20       ` Tian, Kevin
2024-03-07  8:39   ` Tian, Kevin
2024-03-07 20:23     ` Alex Williamson
2024-03-08  7:23       ` Tian, Kevin
2024-03-08 17:03         ` Alex Williamson
2024-03-08 17:05       ` Jason Gunthorpe
2024-03-06 21:14 ` [PATCH 2/7] vfio/pci: Lock external INTx masking ops Alex Williamson
2024-03-07  8:37   ` Tian, Kevin
2024-03-07 20:21     ` Alex Williamson
2024-03-08  7:17       ` Tian, Kevin
2024-03-08 20:45   ` Reinette Chatre
2024-03-06 21:14 ` [PATCH 3/7] vfio: Introduce interface to flush virqfd inject workqueue Alex Williamson
2024-03-07  8:58   ` Tian, Kevin
2024-03-08 20:46   ` Reinette Chatre
2024-03-06 21:14 ` [PATCH 4/7] vfio/pci: Create persistent INTx handler Alex Williamson
2024-03-08  7:14   ` Tian, Kevin
2024-03-08 20:46   ` Reinette Chatre
2024-03-06 21:14 ` [PATCH 5/7] vfio/platform: Disable virqfds on cleanup Alex Williamson
2024-03-08  7:16   ` Tian, Kevin
2024-03-08 18:09     ` Alex Williamson
2024-03-06 21:14 ` [PATCH 6/7] vfio/platform: Create persistent IRQ handlers Alex Williamson
2024-03-06 21:14 ` [PATCH 7/7] vfio/fsl-mc: Block calling interrupt handler without trigger Alex Williamson
2024-03-07 15:21   ` kernel test robot

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=20240307131716.5feda507.alex.williamson@redhat.com \
    --to=alex.williamson@redhat.com \
    --cc=clg@redhat.com \
    --cc=eric.auger@redhat.com \
    --cc=kevin.tian@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=reinette.chatre@intel.com \
    /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