diff mbox series

pci: advertise a page aligned ATS

Message ID 20200909081731.24688-1-jasowang@redhat.com
State Accepted
Commit 4c70875372b821b045e84f462466a5c04b091ef5
Headers show
Series pci: advertise a page aligned ATS | expand

Commit Message

Jason Wang Sept. 9, 2020, 8:17 a.m. UTC
After Linux kernel commit 61363c1474b1 ("iommu/vt-d: Enable ATS only
if the device uses page aligned address."), ATS will be only enabled
if device advertises a page aligned request.

Unfortunately, vhost-net is the only user and we don't advertise the
aligned request capability in the past since both vhost IOTLB and
address_space_get_iotlb_entry() can support non page aligned request.

Though it's not clear that if the above kernel commit makes
sense. Let's advertise a page aligned ATS here to make vhost device
IOTLB work with Intel IOMMU again.

Note that in the future we may extend pcie_ats_init() to accept
parameters like queue depth and page alignment.

Cc: qemu-stable@nongnu.org
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
 hw/pci/pcie.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Jason Wang Oct. 15, 2020, 7:47 a.m. UTC | #1
On 2020/9/9 下午4:17, Jason Wang wrote:
> After Linux kernel commit 61363c1474b1 ("iommu/vt-d: Enable ATS only

> if the device uses page aligned address."), ATS will be only enabled

> if device advertises a page aligned request.

>

> Unfortunately, vhost-net is the only user and we don't advertise the

> aligned request capability in the past since both vhost IOTLB and

> address_space_get_iotlb_entry() can support non page aligned request.

>

> Though it's not clear that if the above kernel commit makes

> sense. Let's advertise a page aligned ATS here to make vhost device

> IOTLB work with Intel IOMMU again.

>

> Note that in the future we may extend pcie_ats_init() to accept

> parameters like queue depth and page alignment.

>

> Cc: qemu-stable@nongnu.org

> Signed-off-by: Jason Wang <jasowang@redhat.com>

> ---

>   hw/pci/pcie.c | 5 +++--

>   1 file changed, 3 insertions(+), 2 deletions(-)

>

> diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c

> index 5b48bae0f6..d4010cf8f3 100644

> --- a/hw/pci/pcie.c

> +++ b/hw/pci/pcie.c

> @@ -971,8 +971,9 @@ void pcie_ats_init(PCIDevice *dev, uint16_t offset)

>   

>       dev->exp.ats_cap = offset;

>   

> -    /* Invalidate Queue Depth 0, Page Aligned Request 0 */

> -    pci_set_word(dev->config + offset + PCI_ATS_CAP, 0);

> +    /* Invalidate Queue Depth 0, Page Aligned Request 1 */

> +    pci_set_word(dev->config + offset + PCI_ATS_CAP,

> +                 PCI_ATS_CAP_PAGE_ALIGNED);

>       /* STU 0, Disabled by default */

>       pci_set_word(dev->config + offset + PCI_ATS_CTRL, 0);

>   



Ping, Michael, want to pick this patch?

Thanks
Michael S. Tsirkin Oct. 15, 2020, 1:10 p.m. UTC | #2
On Thu, Oct 15, 2020 at 03:47:09PM +0800, Jason Wang wrote:
> 

> On 2020/9/9 下午4:17, Jason Wang wrote:

> > After Linux kernel commit 61363c1474b1 ("iommu/vt-d: Enable ATS only

> > if the device uses page aligned address."), ATS will be only enabled

> > if device advertises a page aligned request.

> > 

> > Unfortunately, vhost-net is the only user and we don't advertise the

> > aligned request capability in the past since both vhost IOTLB and

> > address_space_get_iotlb_entry() can support non page aligned request.

> > 

> > Though it's not clear that if the above kernel commit makes

> > sense. Let's advertise a page aligned ATS here to make vhost device

> > IOTLB work with Intel IOMMU again.

> > 

> > Note that in the future we may extend pcie_ats_init() to accept

> > parameters like queue depth and page alignment.

> > 

> > Cc: qemu-stable@nongnu.org

> > Signed-off-by: Jason Wang <jasowang@redhat.com>

> > ---

> >   hw/pci/pcie.c | 5 +++--

> >   1 file changed, 3 insertions(+), 2 deletions(-)

> > 

> > diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c

> > index 5b48bae0f6..d4010cf8f3 100644

> > --- a/hw/pci/pcie.c

> > +++ b/hw/pci/pcie.c

> > @@ -971,8 +971,9 @@ void pcie_ats_init(PCIDevice *dev, uint16_t offset)

> >       dev->exp.ats_cap = offset;

> > -    /* Invalidate Queue Depth 0, Page Aligned Request 0 */

> > -    pci_set_word(dev->config + offset + PCI_ATS_CAP, 0);

> > +    /* Invalidate Queue Depth 0, Page Aligned Request 1 */

> > +    pci_set_word(dev->config + offset + PCI_ATS_CAP,

> > +                 PCI_ATS_CAP_PAGE_ALIGNED);

> >       /* STU 0, Disabled by default */

> >       pci_set_word(dev->config + offset + PCI_ATS_CTRL, 0);

> 

> 

> Ping, Michael, want to pick this patch?

> 

> Thanks


Tagged, thanks!
diff mbox series

Patch

diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
index 5b48bae0f6..d4010cf8f3 100644
--- a/hw/pci/pcie.c
+++ b/hw/pci/pcie.c
@@ -971,8 +971,9 @@  void pcie_ats_init(PCIDevice *dev, uint16_t offset)
 
     dev->exp.ats_cap = offset;
 
-    /* Invalidate Queue Depth 0, Page Aligned Request 0 */
-    pci_set_word(dev->config + offset + PCI_ATS_CAP, 0);
+    /* Invalidate Queue Depth 0, Page Aligned Request 1 */
+    pci_set_word(dev->config + offset + PCI_ATS_CAP,
+                 PCI_ATS_CAP_PAGE_ALIGNED);
     /* STU 0, Disabled by default */
     pci_set_word(dev->config + offset + PCI_ATS_CTRL, 0);