> -----Original Message----- > From: Akihiko Odaki <akihiko.od...@daynix.com> > Sent: Tuesday, 30 May 2023 04:02 > To: Cédric Le Goater <c...@redhat.com>; Sriram Yagnaraman > <sriram.yagnara...@est.tech>; qemu-devel@nongnu.org > Cc: Jason Wang <jasow...@redhat.com> > Subject: Re: [PATCH] igb: Add Function Level Reset to PF and VF > > On 2023/05/30 0:07, Cédric Le Goater wrote: > > On 5/29/23 09:45, Akihiko Odaki wrote: > >> On 2023/05/29 16:01, Cédric Le Goater wrote: > >>> On 5/29/23 04:45, Akihiko Odaki wrote: > >>>> On 2023/05/28 19:50, Sriram Yagnaraman wrote: > >>>>> > >>>>>> -----Original Message----- > >>>>>> From: Cédric Le Goater <c...@redhat.com> > >>>>>> Sent: Friday, 26 May 2023 19:31 > >>>>>> To: qemu-devel@nongnu.org > >>>>>> Cc: Akihiko Odaki <akihiko.od...@daynix.com>; Sriram Yagnaraman > >>>>>> <sriram.yagnara...@est.tech>; Jason Wang > <jasow...@redhat.com>; > >>>>>> Cédric Le Goater <c...@redhat.com> > >>>>>> Subject: [PATCH] igb: Add Function Level Reset to PF and VF > >>>>>> > >>>>>> The Intel 82576EB GbE Controller say that the Physical and > >>>>>> Virtual Functions support Function Level Reset. Add the > >>>>>> capability to each device model. > >>>>>> > >>>>>> Cc: Akihiko Odaki <akihiko.od...@daynix.com> > >>>>>> Fixes: 3a977deebe6b ("Intrdocue igb device emulation") > >>>>>> Signed-off-by: Cédric Le Goater <c...@redhat.com> > >>>>>> --- > >>>>>> hw/net/igb.c | 3 +++ > >>>>>> hw/net/igbvf.c | 3 +++ > >>>>>> 2 files changed, 6 insertions(+) > >>>>>> > >>>>>> diff --git a/hw/net/igb.c b/hw/net/igb.c index > >>>>>> 1c989d767725..08e389338dca > >>>>>> 100644 > >>>>>> --- a/hw/net/igb.c > >>>>>> +++ b/hw/net/igb.c > >>>>>> @@ -101,6 +101,7 @@ static void igb_write_config(PCIDevice *dev, > >>>>>> uint32_t addr, > >>>>>> > >>>>>> trace_igb_write_config(addr, val, len); > >>>>>> pci_default_write_config(dev, addr, val, len); > >>>>>> + pcie_cap_flr_write_config(dev, addr, val, len); > >>>>>> > >>>>>> if (range_covers_byte(addr, len, PCI_COMMAND) && > >>>>>> (dev->config[PCI_COMMAND] & PCI_COMMAND_MASTER)) { > @@ > >>>>>> -427,6 > >>>>>> +428,8 @@ static void igb_pci_realize(PCIDevice *pci_dev, Error > >>>>>> **errp) > >>>>>> } > >>>>>> > >>>>>> /* PCIe extended capabilities (in order) */ > >>>>>> + pcie_cap_flr_init(pci_dev); > >>>>>> + > >>>>>> if (pcie_aer_init(pci_dev, 1, 0x100, 0x40, errp) < 0) { > >>>>>> hw_error("Failed to initialize AER capability"); > >>>>>> } > >>>>>> diff --git a/hw/net/igbvf.c b/hw/net/igbvf.c index > >>>>>> 284ea611848b..0a58dad06802 100644 > >>>>>> --- a/hw/net/igbvf.c > >>>>>> +++ b/hw/net/igbvf.c > >>>>>> @@ -204,6 +204,7 @@ static void igbvf_write_config(PCIDevice > >>>>>> *dev, uint32_t addr, uint32_t val, { > >>>>>> trace_igbvf_write_config(addr, val, len); > >>>>>> pci_default_write_config(dev, addr, val, len); > >>>>>> + pcie_cap_flr_write_config(dev, addr, val, len); > >>>>>> } > >>>>>> > >>>>>> static uint64_t igbvf_mmio_read(void *opaque, hwaddr addr, > >>>>>> unsigned size) @@ -266,6 +267,8 @@ static void > >>>>>> igbvf_pci_realize(PCIDevice *dev, Error > >>>>>> **errp) > >>>>>> hw_error("Failed to initialize PCIe capability"); > >>>>>> } > >>>>>> > >>>>>> + pcie_cap_flr_init(dev); > >>>>> > >>>>> Sorry for my naive question, and perhaps not related to your > >>>>> patch, IGBVF device class doesn't seem to have any reset functions > >>>>> registered via igbvf_class_init(). So, I am guessing an FLR will > >>>>> not trigger igb_vf_reset(), which is probably what we want. > >>> > >>> It does through the VTCTRL registers. > >>> > >>>> You're right. Advertising FLR capability without implementing it > >>>> can confuse the guest though such probability is quite a low in > >>>> practice. The reset should be implemented first. > >>> > >>> > >>> I was looking at an issue from a VFIO perspective which does a FLR > >>> on a device when pass through. Software and FLR are equivalent for a > >>> VF. > >> > >> They should be equivalent according to the datasheet, but > >> unfortunately current igbvf implementation does nothing when reset. > >> What Sriram proposes is to add code to actually write VTCTRL when FLR > >> occurred and make FLR and software reset equivalent. And I think that > >> should be done before this change; you should advertise FLR > >> capability after the reset is actually implemented. > > > > > > AFAICT, the VFs are reset correctly by the OS when created or probed > > and by QEMU when they are passthrough in a nested guest OS (with this > patch). > > igb_vf_reset() is clearly called in QEMU, see routine > > e1000_reset_hw_vf() in Linux. > > I don't think this patch makes difference for e1000_reset_hw_vf() as it does > not > rely on FLR. > > > > > I don't think a reset op is necessary because VFs are software > > constructs but I don't mind really. If so, then, I wouldn't mimic what > > the OS does by writing the RST bit in the CTRL register of the VF, I > > would simply install igb_vf_reset() as a reset handler. > > Thinking about the reason why VFIO performs FLR, probably VFIO expects the > FLR clears all of states the kernel set to prevent the VF from leaking kernel > addresses or addresses of other user space which the VF was assigned to in the > past, for example. > > Implementing the reset operation is not necessary to make it function but to > make it secure, particularly we promise the guest that we clear the VF state > by > advertising FLR. > > Regards, > Akihiko Odaki >
I did some digging, and I can see that the linux igbvf device driver registers for FLR and performs a SW reset anyhow. https://lore.kernel.org/all/20230301105706.547921-1-kamil.mazi...@intel.com/ I have not checked what the other drivers do though, I can send a patch if you think it is worth having a reset operation on the igbvf device. > > > > Thanks, > > > > C. > > > > > > > >> > >> Regards, > >> Akihiko Odaki > >> > >>> > >>> I am not sure a VF needs more really, since it is all controlled by > >>> the PF. > C. > >>> > >>>> > >>>>> > >>>>>> + > >>>>>> if (pcie_aer_init(dev, 1, 0x100, 0x40, errp) < 0) { > >>>>>> hw_error("Failed to initialize AER capability"); > >>>>>> } > >>>>>> -- > >>>>>> 2.40.1 > >>>>> > >>>> > >>> > >> > >