> From: Alex Williamson <alex.williamson@xxxxxxxxxx> > Sent: Tuesday, June 13, 2023 10:42 PM > > On Tue, 13 Jun 2023 14:36:14 +0000 > "Liu, Yi L" <yi.l.liu@xxxxxxxxx> wrote: > > > > > > > > > > > > diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h > > > > > > index f9eb52eb9ed7..fdf2fc73f880 100644 > > > > > > --- a/drivers/vfio/vfio.h > > > > > > +++ b/drivers/vfio/vfio.h > > > > > > @@ -18,6 +18,7 @@ struct vfio_container; > > > > > > > > > > > > struct vfio_device_file { > > > > > > struct vfio_device *device; > > > > > > + bool access_granted; > > > > > > > > > > Should we make this a more strongly defined data type and later move > > > > > devid (u32) here to partially fill the hole created? > > > > > > > > Before your question, let me describe how I place the fields > > > > of this structure to see if it is common practice. The first two > > > > fields are static, so they are in the beginning. The access_granted > > > > is lockless and other fields are protected by locks. So I tried to > > > > put the lock and the fields it protects closely. So this is why I put > > > > devid behind iommufd as both are protected by the same lock. > > > > > > I think the primary considerations are locality and compactness. Hot > > > paths data should be within the first cache line of the structure, > > > related data should share a cache line, and we should use the space > > > efficiently. What you describe seems largely an aesthetic concern, > > > which was not evident to me by the segmentation alone. > > > > Sure. > > > > > > > > > struct vfio_device_file { > > > > struct vfio_device *device; > > > > struct vfio_group *group; > > > > > > > > bool access_granted; > > > > spinlock_t kvm_ref_lock; /* protect kvm field */ > > > > struct kvm *kvm; > > > > struct iommufd_ctx *iommufd; /* protected by struct vfio_device_set::lock */ > > > > u32 devid; /* only valid when iommufd is valid */ > > > > }; > > > > > > > > > > > > > > I think this is being placed towards the front of the data structure > > > > > for cache line locality given this is a hot path for file operations. > > > > > But bool types have an implementation dependent size, making them > > > > > difficult to pack. Also there will be a tendency to want to make this > > > > > a bit field, which is probably not compatible with the smp lockless > > > > > operations being used here. We might get in front of these issues if > > > > > we just define it as a u8 now. Thanks, > > > > > > > > Not quite get why bit field is going to be incompatible with smp > > > > lockless operations. Could you elaborate a bit? And should I define > > > > the access_granted as u8 or "u8:1"? > > > > > > Perhaps FUD on my part, but load-acquire type operations have specific > > > semantics and it's not clear to me that they interest with compiler > > > generated bit operations. Thanks, > > > > I see. How about below? > > > > struct vfio_device_file { > > struct vfio_device *device; > > struct vfio_group *group; > > u8 access_granted; > > u32 devid; /* only valid when iommufd is valid */ > > spinlock_t kvm_ref_lock; /* protect kvm field */ > > struct kvm *kvm; > > struct iommufd_ctx *iommufd; /* protected by struct vfio_device_set::lock */ > > }; > > Yep, that's essentially what I was suggesting. Thanks, Got it. 😊 Regards, Yi Liu