<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 19, 2019 at 9:16 PM Jason Wang <<a href="mailto:jasowang@redhat.com" target="_blank">jasowang@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
On 2019/11/19 下午10:14, Jason Gunthorpe wrote:<br>
> On Tue, Nov 19, 2019 at 10:02:08PM +0800, Jason Wang wrote:<br>
>> On 2019/11/19 下午8:38, Jason Gunthorpe wrote:<br>
>>> On Tue, Nov 19, 2019 at 10:41:31AM +0800, Jason Wang wrote:<br>
>>>> On 2019/11/19 上午4:28, Jason Gunthorpe wrote:<br>
>>>>> On Mon, Nov 18, 2019 at 03:27:13PM -0500, Michael S. Tsirkin wrote:<br>
>>>>>> On Mon, Nov 18, 2019 at 01:41:00PM +0000, Jason Gunthorpe wrote:<br>
>>>>>>> On Mon, Nov 18, 2019 at 06:59:21PM +0800, Jason Wang wrote:<br>
>>>>>>>> +struct bus_type mdev_virtio_bus_type;<br>
>>>>>>>> +<br>
>>>>>>>> +struct mdev_virtio_device {<br>
>>>>>>>> +      struct mdev_device mdev;<br>
>>>>>>>> +      const struct mdev_virtio_ops *ops;<br>
>>>>>>>> +      u16 class_id;<br>
>>>>>>>> +};<br>
>>>>>>> This seems to share nothing with mdev (ie mdev-vfio), why is it on the<br>
>>>>>>> same bus?<br>
>>>>>> I must be missing something - which bus do they share?<br>
>>>>> mdev_bus_type ?<br>
>>>>><br>
>>>>> Jason<br>
>>>> Note: virtio has its own bus: mdev_virtio_bus_type. So they are not the same<br>
>>>> bus.<br>
>>> That is even worse, why involve struct mdev_device at all then?<br>
>>><br>
>>> Jason<br>
>><br>
>> I don't quite get the question here.<br>
> In the driver model the bus_type and foo_device are closely<br>
> linked.<br>
<br>
<br>
I don't get the definition of "closely linked" here. Do you think the <br>
bus and device implement virtual bus series are closely linked? If yes, <br>
how did they achieve that?<br>
<br>
<br>
>   Creating 'mdev_device' instances and overriding the bus_type<br>
> is a very abusive thing to do.<br></blockquote><div>RJM>] abusive is a subjective term. Looking at the whole context of the vDPA framework, I still believe that extending the mdev API is preferable. Without the framework, every vendor would have to "mediate" their own devices, which would force us to effectively "duplicate" the mdev core code and implement our own functionality on top. The core idea of VIRTIO is to have a common interface and having a framework that also supports a lot of commonality is fantastic, since we (hw vendors) too, really want to get out of the business of crafting/verify/maintaining device drivers for every version of Linux/Windows/... Heck, i',m hoping that a generic sample vDPA parent driver (ie: sort of like Intel's IFCVF driver but even more so) would be good enough for our product such that we (Brcm) don't have to supply any driver.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<br>
Ok, mdev_device (without this series) had:<br>
<br>
struct mdev_device {<br>
     struct device dev;<br>
     struct mdev_parent *parent;<br>
     guid_t uuid;<br>
     void *driver_data;<br>
     struct list_head next;<br>
     struct kobject *type_kobj;<br>
     struct device *iommu_device;<br>
     bool active;<br>
};<br>
<br>
So it's nothing bus or VFIO specific. And what virtual bus had is:<br>
<br>
struct virtbus_device {<br>
     const char            *name;<br>
     int                id;<br>
     const struct virtbus_dev_id    *dev_id;<br>
     struct device            dev;<br>
         void                *data;<br>
};<br>
<br>
Are there any fundamental issues that you think mdev_device is abused? I <br>
won't expect the answers are generic objects like kobj, iommu device <br>
pointer etc.<br>
<br>
<br>
><br>
>> My understanding for mdev is that it was a mediator between the driver and<br>
>> physical device when it's hard to let them talk directly due to the<br>
>> complexity of refactoring and maintenance.<br>
> Really, mdev is to support vfio with a backend other than PCI, nothing<br>
> more.<br>
<br>
<br>
That partially explain why it was called mdev. So for virito, we want <br>
standard virtio driver to talk with a backend other than virtio.<br>
<br>
For the issue of PCI, actually the API is generic enough to support <br>
device other than PCI, e.g AP bus.<br>
<br>
<br>
><br>
> Abusing it for other things is not appropriate. ie creating an<br>
> instance and not filling in most of the vfio focused ops is an abusive<br>
> thing to do.<br>
<br>
<br>
Well, it's only half of the mdev_parent_ops in mdev_parent, various <br>
methods could be done do be more generic to avoid duplication of codes. No?<br>
<br>
<br>
><br>
>> hardware that can offload virtio datapath but not control path. We want to<br>
>> present a unified interface (standard virtio) instead of a vendor specific<br>
>> interface, so a mediator level in the middle is a must. For virtio driver,<br>
>> mediator present a full virtio compatible device. For hardware, mediator<br>
>> will mediate the difference between the behavior defined by virtio spec and<br>
>> real hardware.<br>
> If you need to bind to the VFIO driver then mdev is the right thing to<br>
> use, otherwise it is not.<br>
><br>
> It certainly should not be used to bind to random kernel drivers. This<br>
> problem is what this virtual bus idea Intel is working on might solve.<br>
<br>
<br>
What do you mean by random here? With this series, we have dedicated bus <br>
and dedicated driver with matching method to make sure the binding is <br>
correct.<br></blockquote><div>RJM>] I think it's pretty clear that it's not random. The class id takes care of the match and allows flexibility to choose vhost-mdev vs vitrio-mdev, depending if the deployment is bare-metal vs virtualized.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<br>
><br>
> It seems the only thing people care about with mdev is the GUID<br>
> lifecycle stuff, but at the same time folks like Parav are saying they<br>
> don't want to use that lifecycle stuff and prefer devlink<br>
> instead.<br>
<br>
<br>
I'm sure you will need to handle other issues besides GUID which had <br>
been settled by mdev e.g IOMMU and types when starting to write a real <br>
hardware driver.<br>
<br>
<br>
><br>
> Most likely, at least for virtio-net, everyone else will be able to<br>
> use devlink as well, making it much less clear if that GUID lifecycle<br>
> stuff is a good idea or not.<br>
<br>
<br>
This assumption is wrong, we hard already had at least two concrete <br>
examples of vDPA device that doesn't use devlink:<br>
<br>
- Intel IFC where virtio is done at VF level<br>
- Ali Cloud ECS instance where virtio is done at PF level<br>
<br>
Again, the device slicing is only part of our goal. The major goal is to <br>
have a mediator level that can take over the virtio control path between <br>
a standard virtio driver and a hardware who datapath is virtio <br>
compatible but not control path.<br>
<br>
Thanks<br>
<br>
<br>
><br>
> Jason<br>
<br>
</blockquote></div></div>