<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:PMingLiU;
        panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Aptos;
        panose-1:2 11 0 4 2 2 2 2 2 4;}
@font-face
        {font-family:"\@PMingLiU";
        panose-1:2 1 6 1 0 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:10.0pt;
        font-family:"Aptos",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Aptos",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt">Hi Bartlomiej,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Thanks for raising the concern. And Yes, we do test the VFIO_DEVICE_RESET case, by using the test program here<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><a href="https://gitlab.com/Mellanox/spdk_team/vfio-dmabuf-test/">https://gitlab.com/Mellanox/spdk_team/vfio-dmabuf-test/</a><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">William<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<div id="mail-editor-reference-message-container">
<div>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">Bartlomiej Zolnierkiewicz <bartlomiej.zolnierkiewicz@canonical.com><br>
<b>Date: </b>Monday, September 23, 2024 at 6:30 AM<br>
<b>To: </b>William Tu <witu@nvidia.com><br>
<b>Cc: </b>kernel-team@lists.ubuntu.com <kernel-team@lists.ubuntu.com>, Vladimir Sokolovsky <vlad@nvidia.com>, Bodong Wang <bodong@nvidia.com>, Sergey Gorenko <sergeygo@nvidia.com>, Jason Gunthorpe <jgg@nvidia.com>, Ziv Waksman <zwaksman@nvidia.com><br>
<b>Subject: </b>Re: [SRU][J:linux-bluefield][PATCH v5 3/6] UBUNTU: SAUCE: vfio_pci: Do not open code pci_try_reset_function()<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">External email: Use caution opening links or attachments<br>
<br>
<br>
On Mon, Sep 16, 2024 at 5:32</span><span style="font-size:11.0pt;font-family:"Arial",sans-serif"> </span><span style="font-size:11.0pt">PM William Tu <witu@nvidia.com> wrote:<br>
><br>
> From: Jason Gunthorpe <jgg@nvidia.com><br>
><br>
> BugLink: <a href="https://bugs.launchpad.net/bugs/2077887">https://bugs.launchpad.net/bugs/2077887</a><br>
><br>
> FLR triggered by an emulated config space write should not behave<br>
> differently from a FLR triggered by VFIO_DEVICE_RESET, currently the<br>
> config space path misses the power management.<br>
><br>
> Consolidate all the call sites to invoke a single function.<br>
><br>
> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com><br>
> Signed-off-by: William Tu <witu@nvidia.com><br>
<br>
I did some more research and this patch seems to introduce user-space<br>
visible changes in behaviour for VFIO PCI devices with the<br>
vdev->reset_works flag set. Also the recent upstream (re)submission of<br>
this feature from Vivek Kasireddy<br>
(<a href="https://lore.kernel.org/all/20240624065552.1572580-1-vivek.kasireddy@intel.com/">https://lore.kernel.org/all/20240624065552.1572580-1-vivek.kasireddy@intel.com/</a>)<br>
has dropped this change. Maybe I'm worrying too much but has this been<br>
actually tested with vdev->reset_works == 1 devices? If not and the<br>
patch served only a cleanup purpose then I think that it should be<br>
dropped (vfio_pci_set_power_state() call was re-added in v5 only so it<br>
also doesn't seem that it was actually needed/tested for devices which<br>
have NoSoftRst-).<br>
<br>
--<br>
Best regards,<br>
Bartlomiej<br>
<br>
> ---<br>
>  drivers/vfio/pci/vfio_pci_config.c | 14 +++-----<br>
>  drivers/vfio/pci/vfio_pci_core.c   | 54 +++++++++++++++++-------------<br>
>  drivers/vfio/pci/vfio_pci_priv.h   |  7 ++++<br>
>  3 files changed, 41 insertions(+), 34 deletions(-)<br>
>  create mode 100644 drivers/vfio/pci/vfio_pci_priv.h<br>
><br>
> diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c<br>
> index 6e58b4bf7a60..78c626b8907d 100644<br>
> --- a/drivers/vfio/pci/vfio_pci_config.c<br>
> +++ b/drivers/vfio/pci/vfio_pci_config.c<br>
> @@ -857,11 +857,8 @@ static int vfio_exp_config_write(struct vfio_pci_core_device *vdev, int pos,<br>
>                                                  pos - offset + PCI_EXP_DEVCAP,<br>
>                                                  &cap);<br>
><br>
> -               if (!ret && (cap & PCI_EXP_DEVCAP_FLR)) {<br>
> -                       vfio_pci_zap_and_down_write_memory_lock(vdev);<br>
> -                       pci_try_reset_function(vdev->pdev);<br>
> -                       up_write(&vdev->memory_lock);<br>
> -               }<br>
> +               if (!ret && (cap & PCI_EXP_DEVCAP_FLR))<br>
> +                       vfio_pci_try_reset_function(vdev);<br>
>         }<br>
><br>
>         /*<br>
> @@ -939,11 +936,8 @@ static int vfio_af_config_write(struct vfio_pci_core_device *vdev, int pos,<br>
>                                                 pos - offset + PCI_AF_CAP,<br>
>                                                 &cap);<br>
><br>
> -               if (!ret && (cap & PCI_AF_CAP_FLR) && (cap & PCI_AF_CAP_TP)) {<br>
> -                       vfio_pci_zap_and_down_write_memory_lock(vdev);<br>
> -                       pci_try_reset_function(vdev->pdev);<br>
> -                       up_write(&vdev->memory_lock);<br>
> -               }<br>
> +               if (!ret && (cap & PCI_AF_CAP_FLR) && (cap & PCI_AF_CAP_TP))<br>
> +                       vfio_pci_try_reset_function(vdev);<br>
>         }<br>
><br>
>         return count;<br>
> diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c<br>
> index 4f1aceadd4fb..a45cdd3cfb84 100644<br>
> --- a/drivers/vfio/pci/vfio_pci_core.c<br>
> +++ b/drivers/vfio/pci/vfio_pci_core.c<br>
> @@ -29,6 +29,8 @@<br>
><br>
>  #include <linux/vfio_pci_core.h><br>
><br>
> +#include "vfio_pci_priv.h"<br>
> +<br>
>  #define DRIVER_AUTHOR   "Alex Williamson <alex.williamson@redhat.com>"<br>
>  #define DRIVER_DESC "core driver for VFIO based PCI devices"<br>
><br>
> @@ -648,6 +650,33 @@ int vfio_pci_register_dev_region(struct vfio_pci_core_device *vdev,<br>
>  }<br>
>  EXPORT_SYMBOL_GPL(vfio_pci_register_dev_region);<br>
><br>
> +int vfio_pci_try_reset_function(struct vfio_pci_core_device *vdev)<br>
> +{<br>
> +       int ret;<br>
> +<br>
> +       if (!vdev->reset_works)<br>
> +               return -EINVAL;<br>
> +<br>
> +       vfio_pci_zap_and_down_write_memory_lock(vdev);<br>
> +<br>
> +       /*<br>
> +        * This function can be invoked while the power state is non-D0.<br>
> +        * If pci_try_reset_function() has been called while the power<br>
> +        * state is non-D0, then pci_try_reset_function() will<br>
> +        * internally set the power state to D0 without vfio driver<br>
> +        * involvement. For the devices which have NoSoftRst-, the<br>
> +        * reset function can cause the PCI config space reset without<br>
> +        * restoring the original state (saved locally in<br>
> +        * 'vdev->pm_save').<br>
> +        */<br>
> +       vfio_pci_set_power_state(vdev, PCI_D0);<br>
> +<br>
> +       ret = pci_try_reset_function(vdev->pdev);<br>
> +       up_write(&vdev->memory_lock);<br>
> +<br>
> +       return ret;<br>
> +}<br>
> +<br>
>  long vfio_pci_core_ioctl(struct vfio_device *core_vdev, unsigned int cmd,<br>
>                 unsigned long arg)<br>
>  {<br>
> @@ -929,30 +958,7 @@ long vfio_pci_core_ioctl(struct vfio_device *core_vdev, unsigned int cmd,<br>
>                 return ret;<br>
><br>
>         } else if (cmd == VFIO_DEVICE_RESET) {<br>
> -               int ret;<br>
> -<br>
> -               if (!vdev->reset_works)<br>
> -                       return -EINVAL;<br>
> -<br>
> -               vfio_pci_zap_and_down_write_memory_lock(vdev);<br>
> -<br>
> -               /*<br>
> -                * This function can be invoked while the power state is non-D0.<br>
> -                * If pci_try_reset_function() has been called while the power<br>
> -                * state is non-D0, then pci_try_reset_function() will<br>
> -                * internally set the power state to D0 without vfio driver<br>
> -                * involvement. For the devices which have NoSoftRst-, the<br>
> -                * reset function can cause the PCI config space reset without<br>
> -                * restoring the original state (saved locally in<br>
> -                * 'vdev->pm_save').<br>
> -                */<br>
> -               vfio_pci_set_power_state(vdev, PCI_D0);<br>
> -<br>
> -               ret = pci_try_reset_function(vdev->pdev);<br>
> -               up_write(&vdev->memory_lock);<br>
> -<br>
> -               return ret;<br>
> -<br>
> +               return vfio_pci_try_reset_function(vdev);<br>
>         } else if (cmd == VFIO_DEVICE_GET_PCI_HOT_RESET_INFO) {<br>
>                 struct vfio_pci_hot_reset_info hdr;<br>
>                 struct vfio_pci_fill_info fill = { 0 };<br>
> diff --git a/drivers/vfio/pci/vfio_pci_priv.h b/drivers/vfio/pci/vfio_pci_priv.h<br>
> new file mode 100644<br>
> index 000000000000..4971cd95b431<br>
> --- /dev/null<br>
> +++ b/drivers/vfio/pci/vfio_pci_priv.h<br>
> @@ -0,0 +1,7 @@<br>
> +/* SPDX-License-Identifier: GPL-2.0-only */<br>
> +#ifndef VFIO_PCI_PRIV_H<br>
> +#define VFIO_PCI_PRIV_H<br>
> +<br>
> +int vfio_pci_try_reset_function(struct vfio_pci_core_device *vdev);<br>
> +<br>
> +#endif<o:p></o:p></span></p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>