2023-07-19 15:59:45

by Feng Liu

[permalink] [raw]
Subject: [PATCH v1] virtio-pci: Fix legacy device flag setting error in probe

The 'is_legacy' flag is used to differentiate between legacy vs modern
device. Currently, it is based on the value of vp_dev->ldev.ioaddr.
However, due to the shared memory of the union between struct
virtio_pci_legacy_device and struct virtio_pci_modern_device, when
virtio_pci_modern_probe modifies the content of struct
virtio_pci_modern_device, it affects the content of struct
virtio_pci_legacy_device, and ldev.ioaddr is no longer zero, causing
the 'is_legacy' flag to be set as true. To resolve issue, when legacy
device is probed, mark 'is_legacy' as true, when modern device is
probed, keep 'is_legacy' as false.

Fixes: 4f0fc22534e3 ("virtio_pci: Optimize virtio_pci_device structure size")
Signed-off-by: Feng Liu <[email protected]>
Reviewed-by: Parav Pandit <[email protected]>
Reviewed-by: Jiri Pirko <[email protected]>
---
drivers/virtio/virtio_pci_common.c | 2 --
drivers/virtio/virtio_pci_legacy.c | 1 +
2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
index a6c86f916dbd..c2524a7207cf 100644
--- a/drivers/virtio/virtio_pci_common.c
+++ b/drivers/virtio/virtio_pci_common.c
@@ -557,8 +557,6 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,

pci_set_master(pci_dev);

- vp_dev->is_legacy = vp_dev->ldev.ioaddr ? true : false;
-
rc = register_virtio_device(&vp_dev->vdev);
reg_dev = vp_dev;
if (rc)
diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
index 2257f1b3d8ae..d9cbb02b35a1 100644
--- a/drivers/virtio/virtio_pci_legacy.c
+++ b/drivers/virtio/virtio_pci_legacy.c
@@ -223,6 +223,7 @@ int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
vp_dev->config_vector = vp_config_vector;
vp_dev->setup_vq = setup_vq;
vp_dev->del_vq = del_vq;
+ vp_dev->is_legacy = true;

return 0;
}
--
2.37.1 (Apple Git-137.1)



2023-07-20 02:59:41

by Xuan Zhuo

[permalink] [raw]
Subject: Re: [PATCH v1] virtio-pci: Fix legacy device flag setting error in probe

On Wed, 19 Jul 2023 11:45:50 -0400, Feng Liu <[email protected]> wrote:
> The 'is_legacy' flag is used to differentiate between legacy vs modern
> device. Currently, it is based on the value of vp_dev->ldev.ioaddr.
> However, due to the shared memory of the union between struct
> virtio_pci_legacy_device and struct virtio_pci_modern_device, when
> virtio_pci_modern_probe modifies the content of struct
> virtio_pci_modern_device, it affects the content of struct
> virtio_pci_legacy_device, and ldev.ioaddr is no longer zero, causing
> the 'is_legacy' flag to be set as true. To resolve issue, when legacy
> device is probed, mark 'is_legacy' as true, when modern device is
> probed, keep 'is_legacy' as false.
>
> Fixes: 4f0fc22534e3 ("virtio_pci: Optimize virtio_pci_device structure size")
> Signed-off-by: Feng Liu <[email protected]>
> Reviewed-by: Parav Pandit <[email protected]>
> Reviewed-by: Jiri Pirko <[email protected]>

Reviewed-by: Xuan Zhuo <[email protected]>


> ---
> drivers/virtio/virtio_pci_common.c | 2 --
> drivers/virtio/virtio_pci_legacy.c | 1 +
> 2 files changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
> index a6c86f916dbd..c2524a7207cf 100644
> --- a/drivers/virtio/virtio_pci_common.c
> +++ b/drivers/virtio/virtio_pci_common.c
> @@ -557,8 +557,6 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
>
> pci_set_master(pci_dev);
>
> - vp_dev->is_legacy = vp_dev->ldev.ioaddr ? true : false;
> -
> rc = register_virtio_device(&vp_dev->vdev);
> reg_dev = vp_dev;
> if (rc)
> diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
> index 2257f1b3d8ae..d9cbb02b35a1 100644
> --- a/drivers/virtio/virtio_pci_legacy.c
> +++ b/drivers/virtio/virtio_pci_legacy.c
> @@ -223,6 +223,7 @@ int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
> vp_dev->config_vector = vp_config_vector;
> vp_dev->setup_vq = setup_vq;
> vp_dev->del_vq = del_vq;
> + vp_dev->is_legacy = true;
>
> return 0;
> }
> --
> 2.37.1 (Apple Git-137.1)
>

2023-07-20 03:10:01

by Feng Liu

[permalink] [raw]
Subject: Re: [PATCH v1] virtio-pci: Fix legacy device flag setting error in probe



On 2023-07-19 p.m.10:27, Jason Wang wrote:
> External email: Use caution opening links or attachments
>
>
> On Wed, Jul 19, 2023 at 11:46 PM Feng Liu <[email protected]> wrote:
>>
>> The 'is_legacy' flag is used to differentiate between legacy vs modern
>> device. Currently, it is based on the value of vp_dev->ldev.ioaddr.
>> However, due to the shared memory of the union between struct
>> virtio_pci_legacy_device and struct virtio_pci_modern_device, when
>> virtio_pci_modern_probe modifies the content of struct
>> virtio_pci_modern_device, it affects the content of struct
>> virtio_pci_legacy_device, and ldev.ioaddr is no longer zero, causing
>> the 'is_legacy' flag to be set as true. To resolve issue, when legacy
>> device is probed, mark 'is_legacy' as true, when modern device is
>> probed, keep 'is_legacy' as false.
>>
>> Fixes: 4f0fc22534e3 ("virtio_pci: Optimize virtio_pci_device structure size")
>> Signed-off-by: Feng Liu <[email protected]>
>> Reviewed-by: Parav Pandit <[email protected]>
>> Reviewed-by: Jiri Pirko <[email protected]>
>> ---
>> drivers/virtio/virtio_pci_common.c | 2 --
>> drivers/virtio/virtio_pci_legacy.c | 1 +
>> 2 files changed, 1 insertion(+), 2 deletions(-)
>>
>> diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
>> index a6c86f916dbd..c2524a7207cf 100644
>> --- a/drivers/virtio/virtio_pci_common.c
>> +++ b/drivers/virtio/virtio_pci_common.c
>> @@ -557,8 +557,6 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
>>
>> pci_set_master(pci_dev);
>>
>> - vp_dev->is_legacy = vp_dev->ldev.ioaddr ? true : false;
>> -
>> rc = register_virtio_device(&vp_dev->vdev);
>> reg_dev = vp_dev;
>> if (rc)
>> diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
>> index 2257f1b3d8ae..d9cbb02b35a1 100644
>> --- a/drivers/virtio/virtio_pci_legacy.c
>> +++ b/drivers/virtio/virtio_pci_legacy.c
>> @@ -223,6 +223,7 @@ int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
>> vp_dev->config_vector = vp_config_vector;
>> vp_dev->setup_vq = setup_vq;
>> vp_dev->del_vq = del_vq;
>> + vp_dev->is_legacy = true;
>
> This seems break force_legacy for modern device:
>
> if (force_legacy) {
> rc = virtio_pci_legacy_probe(vp_dev);
> /* Also try modern mode if we can't map BAR0 (no IO space). */
> if (rc == -ENODEV || rc == -ENOMEM)
> rc = virtio_pci_modern_probe(vp_dev);
>
> Thanks
>
Will do, thanks

>>
>> return 0;
>> }
>> --
>> 2.37.1 (Apple Git-137.1)
>>
>

2023-07-20 03:17:52

by Jason Wang

[permalink] [raw]
Subject: Re: [PATCH v1] virtio-pci: Fix legacy device flag setting error in probe

On Wed, Jul 19, 2023 at 11:46 PM Feng Liu <[email protected]> wrote:
>
> The 'is_legacy' flag is used to differentiate between legacy vs modern
> device. Currently, it is based on the value of vp_dev->ldev.ioaddr.
> However, due to the shared memory of the union between struct
> virtio_pci_legacy_device and struct virtio_pci_modern_device, when
> virtio_pci_modern_probe modifies the content of struct
> virtio_pci_modern_device, it affects the content of struct
> virtio_pci_legacy_device, and ldev.ioaddr is no longer zero, causing
> the 'is_legacy' flag to be set as true. To resolve issue, when legacy
> device is probed, mark 'is_legacy' as true, when modern device is
> probed, keep 'is_legacy' as false.
>
> Fixes: 4f0fc22534e3 ("virtio_pci: Optimize virtio_pci_device structure size")
> Signed-off-by: Feng Liu <[email protected]>
> Reviewed-by: Parav Pandit <[email protected]>
> Reviewed-by: Jiri Pirko <[email protected]>
> ---
> drivers/virtio/virtio_pci_common.c | 2 --
> drivers/virtio/virtio_pci_legacy.c | 1 +
> 2 files changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
> index a6c86f916dbd..c2524a7207cf 100644
> --- a/drivers/virtio/virtio_pci_common.c
> +++ b/drivers/virtio/virtio_pci_common.c
> @@ -557,8 +557,6 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
>
> pci_set_master(pci_dev);
>
> - vp_dev->is_legacy = vp_dev->ldev.ioaddr ? true : false;
> -
> rc = register_virtio_device(&vp_dev->vdev);
> reg_dev = vp_dev;
> if (rc)
> diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
> index 2257f1b3d8ae..d9cbb02b35a1 100644
> --- a/drivers/virtio/virtio_pci_legacy.c
> +++ b/drivers/virtio/virtio_pci_legacy.c
> @@ -223,6 +223,7 @@ int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
> vp_dev->config_vector = vp_config_vector;
> vp_dev->setup_vq = setup_vq;
> vp_dev->del_vq = del_vq;
> + vp_dev->is_legacy = true;

This seems break force_legacy for modern device:

if (force_legacy) {
rc = virtio_pci_legacy_probe(vp_dev);
/* Also try modern mode if we can't map BAR0 (no IO space). */
if (rc == -ENODEV || rc == -ENOMEM)
rc = virtio_pci_modern_probe(vp_dev);

Thanks

>
> return 0;
> }
> --
> 2.37.1 (Apple Git-137.1)
>


2023-07-20 16:54:49

by Feng Liu

[permalink] [raw]
Subject: Re: [PATCH v1] virtio-pci: Fix legacy device flag setting error in probe



On 2023-07-19 p.m.10:27, Jason Wang wrote:
> External email: Use caution opening links or attachments
>
>
> On Wed, Jul 19, 2023 at 11:46 PM Feng Liu <[email protected]> wrote:
>>
>> The 'is_legacy' flag is used to differentiate between legacy vs modern
>> device. Currently, it is based on the value of vp_dev->ldev.ioaddr.
>> However, due to the shared memory of the union between struct
>> virtio_pci_legacy_device and struct virtio_pci_modern_device, when
>> virtio_pci_modern_probe modifies the content of struct
>> virtio_pci_modern_device, it affects the content of struct
>> virtio_pci_legacy_device, and ldev.ioaddr is no longer zero, causing
>> the 'is_legacy' flag to be set as true. To resolve issue, when legacy
>> device is probed, mark 'is_legacy' as true, when modern device is
>> probed, keep 'is_legacy' as false.
>>
>> Fixes: 4f0fc22534e3 ("virtio_pci: Optimize virtio_pci_device structure size")
>> Signed-off-by: Feng Liu <[email protected]>
>> Reviewed-by: Parav Pandit <[email protected]>
>> Reviewed-by: Jiri Pirko <[email protected]>
>> ---
>> drivers/virtio/virtio_pci_common.c | 2 --
>> drivers/virtio/virtio_pci_legacy.c | 1 +
>> 2 files changed, 1 insertion(+), 2 deletions(-)
>>
>> diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
>> index a6c86f916dbd..c2524a7207cf 100644
>> --- a/drivers/virtio/virtio_pci_common.c
>> +++ b/drivers/virtio/virtio_pci_common.c
>> @@ -557,8 +557,6 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
>>
>> pci_set_master(pci_dev);
>>
>> - vp_dev->is_legacy = vp_dev->ldev.ioaddr ? true : false;
>> -
>> rc = register_virtio_device(&vp_dev->vdev);
>> reg_dev = vp_dev;
>> if (rc)
>> diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
>> index 2257f1b3d8ae..d9cbb02b35a1 100644
>> --- a/drivers/virtio/virtio_pci_legacy.c
>> +++ b/drivers/virtio/virtio_pci_legacy.c
>> @@ -223,6 +223,7 @@ int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
>> vp_dev->config_vector = vp_config_vector;
>> vp_dev->setup_vq = setup_vq;
>> vp_dev->del_vq = del_vq;
>> + vp_dev->is_legacy = true;
>
> This seems break force_legacy for modern device:
>
> if (force_legacy) {
> rc = virtio_pci_legacy_probe(vp_dev);
> /* Also try modern mode if we can't map BAR0 (no IO space). */
> if (rc == -ENODEV || rc == -ENOMEM)
> rc = virtio_pci_modern_probe(vp_dev);
>
> Thanks
>

Hi, Jason

In the case of force_legacy, if no IO space occurs, function will return
directly after vp_legacy_probe, and will not run vp_dev->is_legacy =
true; because vp_dev is allocated through kzalloc, the default
vp_dev->is_legacy is false, which It is expected for modern device, so
it will not break modern device.

What do you think?

int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
{
[...]

rc = vp_legacy_probe(ldev);
if (rc)
return rc; /* if no IO space, function will return from here */

[...]
vp_dev->is_legacy = true;
}


>>
>> return 0;
>> }
>> --
>> 2.37.1 (Apple Git-137.1)
>>
>

2023-07-20 18:44:47

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: [PATCH v1] virtio-pci: Fix legacy device flag setting error in probe

On Thu, Jul 20, 2023 at 10:27:04AM +0800, Jason Wang wrote:
> On Wed, Jul 19, 2023 at 11:46 PM Feng Liu <[email protected]> wrote:
> >
> > The 'is_legacy' flag is used to differentiate between legacy vs modern
> > device. Currently, it is based on the value of vp_dev->ldev.ioaddr.
> > However, due to the shared memory of the union between struct
> > virtio_pci_legacy_device and struct virtio_pci_modern_device, when
> > virtio_pci_modern_probe modifies the content of struct
> > virtio_pci_modern_device, it affects the content of struct
> > virtio_pci_legacy_device, and ldev.ioaddr is no longer zero, causing
> > the 'is_legacy' flag to be set as true. To resolve issue, when legacy
> > device is probed, mark 'is_legacy' as true, when modern device is
> > probed, keep 'is_legacy' as false.
> >
> > Fixes: 4f0fc22534e3 ("virtio_pci: Optimize virtio_pci_device structure size")
> > Signed-off-by: Feng Liu <[email protected]>
> > Reviewed-by: Parav Pandit <[email protected]>
> > Reviewed-by: Jiri Pirko <[email protected]>
> > ---
> > drivers/virtio/virtio_pci_common.c | 2 --
> > drivers/virtio/virtio_pci_legacy.c | 1 +
> > 2 files changed, 1 insertion(+), 2 deletions(-)
> >
> > diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
> > index a6c86f916dbd..c2524a7207cf 100644
> > --- a/drivers/virtio/virtio_pci_common.c
> > +++ b/drivers/virtio/virtio_pci_common.c
> > @@ -557,8 +557,6 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
> >
> > pci_set_master(pci_dev);
> >
> > - vp_dev->is_legacy = vp_dev->ldev.ioaddr ? true : false;
> > -
> > rc = register_virtio_device(&vp_dev->vdev);
> > reg_dev = vp_dev;
> > if (rc)
> > diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
> > index 2257f1b3d8ae..d9cbb02b35a1 100644
> > --- a/drivers/virtio/virtio_pci_legacy.c
> > +++ b/drivers/virtio/virtio_pci_legacy.c
> > @@ -223,6 +223,7 @@ int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
> > vp_dev->config_vector = vp_config_vector;
> > vp_dev->setup_vq = setup_vq;
> > vp_dev->del_vq = del_vq;
> > + vp_dev->is_legacy = true;
>
> This seems break force_legacy for modern device:
>
> if (force_legacy) {
> rc = virtio_pci_legacy_probe(vp_dev);
> /* Also try modern mode if we can't map BAR0 (no IO space). */
> if (rc == -ENODEV || rc == -ENOMEM)
> rc = virtio_pci_modern_probe(vp_dev);
>
> Thanks

don't see the breakage here - can you explain a bit more?

> >
> > return 0;
> > }
> > --
> > 2.37.1 (Apple Git-137.1)
> >


2023-07-24 13:32:02

by Feng Liu

[permalink] [raw]
Subject: Re: [PATCH v1] virtio-pci: Fix legacy device flag setting error in probe



On 2023-07-20 p.m.1:14, Michael S. Tsirkin wrote:
> External email: Use caution opening links or attachments
>
>
> On Thu, Jul 20, 2023 at 10:27:04AM +0800, Jason Wang wrote:
>> On Wed, Jul 19, 2023 at 11:46 PM Feng Liu <[email protected]> wrote:
>>>
>>> The 'is_legacy' flag is used to differentiate between legacy vs modern
>>> device. Currently, it is based on the value of vp_dev->ldev.ioaddr.
>>> However, due to the shared memory of the union between struct
>>> virtio_pci_legacy_device and struct virtio_pci_modern_device, when
>>> virtio_pci_modern_probe modifies the content of struct
>>> virtio_pci_modern_device, it affects the content of struct
>>> virtio_pci_legacy_device, and ldev.ioaddr is no longer zero, causing
>>> the 'is_legacy' flag to be set as true. To resolve issue, when legacy
>>> device is probed, mark 'is_legacy' as true, when modern device is
>>> probed, keep 'is_legacy' as false.
>>>
>>> Fixes: 4f0fc22534e3 ("virtio_pci: Optimize virtio_pci_device structure size")
>>> Signed-off-by: Feng Liu <[email protected]>
>>> Reviewed-by: Parav Pandit <[email protected]>
>>> Reviewed-by: Jiri Pirko <[email protected]>
>>> ---
>>> drivers/virtio/virtio_pci_common.c | 2 --
>>> drivers/virtio/virtio_pci_legacy.c | 1 +
>>> 2 files changed, 1 insertion(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
>>> index a6c86f916dbd..c2524a7207cf 100644
>>> --- a/drivers/virtio/virtio_pci_common.c
>>> +++ b/drivers/virtio/virtio_pci_common.c
>>> @@ -557,8 +557,6 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
>>>
>>> pci_set_master(pci_dev);
>>>
>>> - vp_dev->is_legacy = vp_dev->ldev.ioaddr ? true : false;
>>> -
>>> rc = register_virtio_device(&vp_dev->vdev);
>>> reg_dev = vp_dev;
>>> if (rc)
>>> diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
>>> index 2257f1b3d8ae..d9cbb02b35a1 100644
>>> --- a/drivers/virtio/virtio_pci_legacy.c
>>> +++ b/drivers/virtio/virtio_pci_legacy.c
>>> @@ -223,6 +223,7 @@ int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
>>> vp_dev->config_vector = vp_config_vector;
>>> vp_dev->setup_vq = setup_vq;
>>> vp_dev->del_vq = del_vq;
>>> + vp_dev->is_legacy = true;
>>
>> This seems break force_legacy for modern device:
>>
>> if (force_legacy) {
>> rc = virtio_pci_legacy_probe(vp_dev);
>> /* Also try modern mode if we can't map BAR0 (no IO space). */
>> if (rc == -ENODEV || rc == -ENOMEM)
>> rc = virtio_pci_modern_probe(vp_dev);
>>
>> Thanks
>
> don't see the breakage here - can you explain a bit more?
>
Hi, Jason

I also think there is no breakage herea and gave an explanation in
another email, please have a see.

So are there any comments about this bug fix patch? Can this patch pass
the review?

Thanks
Feng

>>>
>>> return 0;
>>> }
>>> --
>>> 2.37.1 (Apple Git-137.1)
>>>
>

2023-07-25 04:05:03

by Jason Wang

[permalink] [raw]
Subject: Re: [PATCH v1] virtio-pci: Fix legacy device flag setting error in probe

On Mon, Jul 24, 2023 at 9:14 PM Feng Liu <[email protected]> wrote:
>
>
>
> On 2023-07-20 p.m.1:14, Michael S. Tsirkin wrote:
> > External email: Use caution opening links or attachments
> >
> >
> > On Thu, Jul 20, 2023 at 10:27:04AM +0800, Jason Wang wrote:
> >> On Wed, Jul 19, 2023 at 11:46 PM Feng Liu <[email protected]> wrote:
> >>>
> >>> The 'is_legacy' flag is used to differentiate between legacy vs modern
> >>> device. Currently, it is based on the value of vp_dev->ldev.ioaddr.
> >>> However, due to the shared memory of the union between struct
> >>> virtio_pci_legacy_device and struct virtio_pci_modern_device, when
> >>> virtio_pci_modern_probe modifies the content of struct
> >>> virtio_pci_modern_device, it affects the content of struct
> >>> virtio_pci_legacy_device, and ldev.ioaddr is no longer zero, causing
> >>> the 'is_legacy' flag to be set as true. To resolve issue, when legacy
> >>> device is probed, mark 'is_legacy' as true, when modern device is
> >>> probed, keep 'is_legacy' as false.
> >>>
> >>> Fixes: 4f0fc22534e3 ("virtio_pci: Optimize virtio_pci_device structure size")
> >>> Signed-off-by: Feng Liu <[email protected]>
> >>> Reviewed-by: Parav Pandit <[email protected]>
> >>> Reviewed-by: Jiri Pirko <[email protected]>
> >>> ---
> >>> drivers/virtio/virtio_pci_common.c | 2 --
> >>> drivers/virtio/virtio_pci_legacy.c | 1 +
> >>> 2 files changed, 1 insertion(+), 2 deletions(-)
> >>>
> >>> diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
> >>> index a6c86f916dbd..c2524a7207cf 100644
> >>> --- a/drivers/virtio/virtio_pci_common.c
> >>> +++ b/drivers/virtio/virtio_pci_common.c
> >>> @@ -557,8 +557,6 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
> >>>
> >>> pci_set_master(pci_dev);
> >>>
> >>> - vp_dev->is_legacy = vp_dev->ldev.ioaddr ? true : false;
> >>> -
> >>> rc = register_virtio_device(&vp_dev->vdev);
> >>> reg_dev = vp_dev;
> >>> if (rc)
> >>> diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
> >>> index 2257f1b3d8ae..d9cbb02b35a1 100644
> >>> --- a/drivers/virtio/virtio_pci_legacy.c
> >>> +++ b/drivers/virtio/virtio_pci_legacy.c
> >>> @@ -223,6 +223,7 @@ int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
> >>> vp_dev->config_vector = vp_config_vector;
> >>> vp_dev->setup_vq = setup_vq;
> >>> vp_dev->del_vq = del_vq;
> >>> + vp_dev->is_legacy = true;
> >>
> >> This seems break force_legacy for modern device:
> >>
> >> if (force_legacy) {
> >> rc = virtio_pci_legacy_probe(vp_dev);
> >> /* Also try modern mode if we can't map BAR0 (no IO space). */
> >> if (rc == -ENODEV || rc == -ENOMEM)
> >> rc = virtio_pci_modern_probe(vp_dev);
> >>
> >> Thanks
> >
> > don't see the breakage here - can you explain a bit more?
> >
> Hi, Jason
>
> I also think there is no breakage herea and gave an explanation in
> another email, please have a see.

I think I've made a mistake, the patch should be fine.

>
> So are there any comments about this bug fix patch? Can this patch pass
> the review?

Yes.

Acked-by: Jason Wang <[email protected]>

Thanks

>
> Thanks
> Feng
>
> >>>
> >>> return 0;
> >>> }
> >>> --
> >>> 2.37.1 (Apple Git-137.1)
> >>>
> >
>


2023-07-25 04:23:16

by Feng Liu

[permalink] [raw]
Subject: Re: [PATCH v1] virtio-pci: Fix legacy device flag setting error in probe



On 2023-07-24 p.m.11:41, Jason Wang wrote:
> External email: Use caution opening links or attachments
>
>
> On Mon, Jul 24, 2023 at 9:14 PM Feng Liu <[email protected]> wrote:
>>
>>
>>
>> On 2023-07-20 p.m.1:14, Michael S. Tsirkin wrote:
>>> External email: Use caution opening links or attachments
>>>
>>>
>>> On Thu, Jul 20, 2023 at 10:27:04AM +0800, Jason Wang wrote:
>>>> On Wed, Jul 19, 2023 at 11:46 PM Feng Liu <[email protected]> wrote:
>>>>>
>>>>> The 'is_legacy' flag is used to differentiate between legacy vs modern
>>>>> device. Currently, it is based on the value of vp_dev->ldev.ioaddr.
>>>>> However, due to the shared memory of the union between struct
>>>>> virtio_pci_legacy_device and struct virtio_pci_modern_device, when
>>>>> virtio_pci_modern_probe modifies the content of struct
>>>>> virtio_pci_modern_device, it affects the content of struct
>>>>> virtio_pci_legacy_device, and ldev.ioaddr is no longer zero, causing
>>>>> the 'is_legacy' flag to be set as true. To resolve issue, when legacy
>>>>> device is probed, mark 'is_legacy' as true, when modern device is
>>>>> probed, keep 'is_legacy' as false.
>>>>>
>>>>> Fixes: 4f0fc22534e3 ("virtio_pci: Optimize virtio_pci_device structure size")
>>>>> Signed-off-by: Feng Liu <[email protected]>
>>>>> Reviewed-by: Parav Pandit <[email protected]>
>>>>> Reviewed-by: Jiri Pirko <[email protected]>
>>>>> ---
>>>>> drivers/virtio/virtio_pci_common.c | 2 --
>>>>> drivers/virtio/virtio_pci_legacy.c | 1 +
>>>>> 2 files changed, 1 insertion(+), 2 deletions(-)
>>>>>
>>>>> diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
>>>>> index a6c86f916dbd..c2524a7207cf 100644
>>>>> --- a/drivers/virtio/virtio_pci_common.c
>>>>> +++ b/drivers/virtio/virtio_pci_common.c
>>>>> @@ -557,8 +557,6 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
>>>>>
>>>>> pci_set_master(pci_dev);
>>>>>
>>>>> - vp_dev->is_legacy = vp_dev->ldev.ioaddr ? true : false;
>>>>> -
>>>>> rc = register_virtio_device(&vp_dev->vdev);
>>>>> reg_dev = vp_dev;
>>>>> if (rc)
>>>>> diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
>>>>> index 2257f1b3d8ae..d9cbb02b35a1 100644
>>>>> --- a/drivers/virtio/virtio_pci_legacy.c
>>>>> +++ b/drivers/virtio/virtio_pci_legacy.c
>>>>> @@ -223,6 +223,7 @@ int virtio_pci_legacy_probe(struct virtio_pci_device *vp_dev)
>>>>> vp_dev->config_vector = vp_config_vector;
>>>>> vp_dev->setup_vq = setup_vq;
>>>>> vp_dev->del_vq = del_vq;
>>>>> + vp_dev->is_legacy = true;
>>>>
>>>> This seems break force_legacy for modern device:
>>>>
>>>> if (force_legacy) {
>>>> rc = virtio_pci_legacy_probe(vp_dev);
>>>> /* Also try modern mode if we can't map BAR0 (no IO space). */
>>>> if (rc == -ENODEV || rc == -ENOMEM)
>>>> rc = virtio_pci_modern_probe(vp_dev);
>>>>
>>>> Thanks
>>>
>>> don't see the breakage here - can you explain a bit more?
>>>
>> Hi, Jason
>>
>> I also think there is no breakage herea and gave an explanation in
>> another email, please have a see.
>
> I think I've made a mistake, the patch should be fine.
>
>>
>> So are there any comments about this bug fix patch? Can this patch pass
>> the review?
>
> Yes.
>
> Acked-by: Jason Wang <[email protected]>
>
> Thanks
>

Thanks Jason

>>
>> Thanks
>> Feng
>>
>>>>>
>>>>> return 0;
>>>>> }
>>>>> --
>>>>> 2.37.1 (Apple Git-137.1)
>>>>>
>>>
>>
>