Re: [v7 2/3] vfio: support notifier chain in vfio_group

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 11/23/2016 8:50 AM, Jike Song wrote:
> On 11/22/2016 10:50 PM, Alex Williamson wrote:
>> On Tue, 22 Nov 2016 20:09:32 +0530
>> Kirti Wankhede <kwankhede@xxxxxxxxxx> wrote:
>>
>>> On 11/22/2016 7:32 PM, Alex Williamson wrote:
>>>> On Tue, 22 Nov 2016 19:05:16 +0530
>>>> Kirti Wankhede <kwankhede@xxxxxxxxxx> wrote:
>>>>   
>>>>> On 11/22/2016 11:39 AM, Jike Song wrote:  
>>>
>>> <snip>
>>>
>>>>>>  /* events for VFIO_IOMMU_NOTIFY */
>>>>>>  #define VFIO_IOMMU_NOTIFY_DMA_UNMAP	BIT(0)
>>>>>>  
>>>>>> +/* events for VFIO_GROUP_NOTIFY */
>>>>>> +#define VFIO_GROUP_NOTIFY_SET_KVM	BIT(0)
>>>>>> +
>>>>>> +struct kvm;
>>>>>> +extern void vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm);
>>>>>>      
>>>>>
>>>>> If I understand correctly, notifier for backend iommu driver and
>>>>> notifier for group should be registered with different notifier blocks,
>>>>> as per your current implementation:
>>>>>
>>>>> unsigned long iommu_event = VFIO_IOMMU_NOTIFY_DMA_UNMAP;
>>>>> struct notifier_block iommu_nb;
>>>>>
>>>>> iommu_nb.notifier_call = vfio_iommu_notifier_cb;
>>>>> vfio_register_notifier(dev, VFIO_IOMMU_NOTIFY, &iommu_event, &iommu_nb);
>>>>>
>>>>>
>>>>> unsigned long group_event = VFIO_GROUP_NOTIFY_SET_KVM;
>>>>> struct notifier_block group_nb;
>>>>>
>>>>> group_nb.notifier_call = vfio_group_notifier_cb;
>>>>> vfio_register_notifier(dev, VFIO_GROUP_NOTIFY, &group_event, &group_nb);
>>>>>
>>>>> Then what is the use of having 'events' bitmask as input argument?
>>>>>
>>>>> Its clear that caller should set:
>>>>> -  VFIO_IOMMU_NOTIFY_DMA_UNMAP when vfio_notify_type_t is VFIO_IOMMU_NOTIFY
>>>>> -  VFIO_GROUP_NOTIFY_SET_KVM when vfio_notify_type_t is VFIO_GROUP_NOTIFY
>>>>>
>>>>> Notifier action could be a integer as earlier and indexing of action
>>>>> would be different for both notifiers.
>>>>>
>>>>> Then caller don't have to sent event bitmask, for caller it would look like:
>>>>>
>>>>> struct notifier_block iommu_nb;
>>>>>
>>>>> iommu_nb.notifier_call = vfio_iommu_notifier_cb;
>>>>> vfio_register_notifier(dev, VFIO_IOMMU_NOTIFY, &iommu_nb);
>>>>>
>>>>>
>>>>> struct notifier_block group_nb;
>>>>>
>>>>> group_nb.notifier_call = vfio_group_notifier_cb;
>>>>> vfio_register_notifier(dev, VFIO_GROUP_NOTIFY, &group_nb);  
>>>>
>>>> If we did that then we'd effectively need to add a new notifier any
>>>> time we want a new signal because the vendor driver would have no
>>>> ability to query the notifications available.  For instance, say we
>>>> added VFIO_IOMMU_NOTIFY_SET_FOO and a vendor driver was dependent on
>>>> that and would either refuse to work or would take a backup path if
>>>> that notification isn't available.  How could it operate in your
>>>> proposal?  By passing a bitmask of events, the vendor driver can
>>>> specify the set of required events and see which event signaling is
>>>> unavailable.  The purpose of using a bitmask and passing the set of
>>>> required bits on registration is to support future expansion.  Thanks,
>>>>   
>>>
>>> If we add VFIO_IOMMU_NOTIFY_SET_FOO in future, we have to define this
>>> action in include/linux/vfio.h
>>>
>>>  #define VFIO_IOMMU_NOTIFY_DMA_UNMAP    (1)
>>> +#define VFIO_IOMMU_NOTIFY_SET_FOO      (2)
>>>
>>> Vendor driver anyways need to be compiled against the kernel to which
>>> its going to run. So vendor driver could use conditional directive:
>>>
>>> #if defined(VFIO_IOMMU_NOTIFY_SET_FOO)
>>>     /* foo signal available*/
>>> #else
>>>     /* foo signal not available*/
>>> #endif
>>
>> No, the vendor driver is not necessarily compiled against the given
>> kernel.  We can also have different backends in vfio, what if we have
>> IOMMU_SET_FOO supported by type1 and IOMMU_SET_BAR supported by spapr,
>> the vendor driver might only support one of these and can't tell at
>> compile time which is active.  Thanks,
> 
> Yes, if we rely on macros only, driver not built against current kernel
> won't work correctly. But have IOMMU backends considered, seems that we
> don't differentiating them, having only one VFIO_IOMMU_NOTIFY?
> 

Most of the distro's kernel have CONFIG_MODVERSIONS enabled and its
mostly safe to build driver against the kernel to which its going to load.
For backend IOMMU module, we have same callback functions or
VFIO_IOMMU_NOTIFY, but as Alex mentioned different IOMMU backend modules
might have different events/actions. Then the event check shouldn't be
in vfio module, it should be in backend module.

Thanks,
Kirti
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux