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

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

 



On Wed, 23 Nov 2016 10:22:37 +0530
Kirti Wankhede <kwankhede@xxxxxxxxxx> wrote:

> 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.

Yes, patch 1/3 is wrong, the required events mask should be passed to
the iommu backend and handled there, not in vfio.c.  Thanks,

Alex
--
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