Re: [v4 2/3] vfio_register_notifier: also register on the group notifier

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

 




On 11/16/2016 9:13 AM, Alex Williamson wrote:
> On Wed, 16 Nov 2016 11:01:37 +0800
> Jike Song <jike.song@xxxxxxxxx> wrote:
> 
>> On 11/16/2016 07:11 AM, Alex Williamson wrote:
>>> On Tue, 15 Nov 2016 19:35:46 +0800
>>> Jike Song <jike.song@xxxxxxxxx> wrote:
>>>   
>>>> The user of vfio_register_notifier might care about not only
>>>> iommu events but also vfio_group events, so also register the
>>>> notifier_block on vfio_group.
>>>>
>>>> Cc: Xiao Guangrong <guangrong.xiao@xxxxxxxxxxxxxxx>
>>>> Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx>
>>>> Cc: Alex Williamson <alex.williamson@xxxxxxxxxx>
>>>> Signed-off-by: Jike Song <jike.song@xxxxxxxxx>
>>>> ---
>>>>  drivers/vfio/vfio.c | 4 ++++
>>>>  1 file changed, 4 insertions(+)
>>>>
>>>> diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
>>>> index b149ced..2c0eedb 100644
>>>> --- a/drivers/vfio/vfio.c
>>>> +++ b/drivers/vfio/vfio.c
>>>> @@ -2065,6 +2065,8 @@ int vfio_register_notifier(struct device *dev, struct notifier_block *nb)
>>>>  	else
>>>>  		ret = -ENOTTY;
>>>>  
>>>> +	vfio_group_register_notifier(group, nb);
>>>> +
>>>>  	up_read(&container->group_lock);
>>>>  	vfio_group_try_dissolve_container(group);
>>>>  
>>>> @@ -2102,6 +2104,8 @@ int vfio_unregister_notifier(struct device *dev, struct notifier_block *nb)
>>>>  	else
>>>>  		ret = -ENOTTY;
>>>>  
>>>> +	vfio_group_unregister_notifier(group, nb);
>>>> +
>>>>  	up_read(&container->group_lock);
>>>>  	vfio_group_try_dissolve_container(group);
>>>>    
>>>
>>> You haven't addressed the error paths, if the iommu driver returns
>>> error and therefore the {un}register returns error, what is the caller
>>> to expect about the group registration?
>>>   
>>
>> Will change to:
>>
>> 	driver = container->iommu_driver;
>> 	if (likely(driver && driver->ops->register_notifier))
>> 		ret = driver->ops->register_notifier(container->iommu_data, nb);
>> 	else
>> 		ret = -ENOTTY;
>> 	if (ret)
>> 		goto err_register_iommu;
>>
>> 	ret = vfio_group_register_notifier(group, nb);
>> 	if (ret)
>> 		driver->ops->unregister_notifier(container->iommu_data, nb);
>>
>> err_register_iommu:
>> 	up_read(&container->group_lock);
>> 	vfio_group_try_dissolve_container(group);
>>
>> err_register_nb:
>> 	vfio_group_put(group);
>> 	return ret;
> 
> 
> 
> What if a vendor driver only cares about the kvm state and doesn't pin
> memory (ie. no DMA) or only cares about iommu and not group notifies?
> If we handled notifier_fn_t 'action' as a bitmask then we could have the
> registrar specify which notification they wanted (a mask/filter), so if
> they only want KVM, we only send that notify, if they only want UNMAPs,
> etc. Then we know whether iommu registration is required.  As a bonus,
> we could add a pr_info() indicating vendors that ask for KVM
> notification so that we can interrogate why they think they need it.
> The downside is that handling action as a bitmask means that we limit
> the number of actions we have available (32 or 64 bits worth).  That
> limit is hopefully far enough off to be ok though.  Thoughts?  Thanks,
> 

As per my understanding, this bitmask is input to
vfio_register_notifier() and vfio_unregister_notifier(), right?

These functions are not called from vendor driver directly, these are
called from vfio_mdev. Then should this bitmask be part of parent_ops
that vendor driver can specify?

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