Messages in this thread | | | Date | Mon, 23 Jun 2014 13:42:51 +1000 | From | Dave Chinner <> | Subject | Re: [PATCH v1 2/2] block: virtio-blk: support multi virt queues per virtio-blk device |
| |
On Sun, Jun 22, 2014 at 01:24:48PM +0300, Michael S. Tsirkin wrote: > On Fri, Jun 20, 2014 at 11:29:40PM +0800, Ming Lei wrote: > > @@ -24,8 +26,8 @@ static struct workqueue_struct *virtblk_wq; > > struct virtio_blk > > { > > struct virtio_device *vdev; > > - struct virtqueue *vq; > > - spinlock_t vq_lock; > > + struct virtqueue *vq[MAX_NUM_VQ]; > > + spinlock_t vq_lock[MAX_NUM_VQ]; > > array of struct { > *vq; > spinlock_t lock; > } > would use more memory but would get us better locality. > It might even make sense to add padding to avoid > cacheline sharing between two unrelated VQs. > Want to try?
It's still false sharing because the queue objects share cachelines. To operate without contention they have to be physically separated from each other like so:
struct vq { struct virtqueue *q; spinlock_t lock; } ____cacheline_aligned_in_smp;
struct some_other_struct { .... struct vq vq[MAX_NUM_VQ]; .... };
This keeps locality to objects within a queue, but separates each queue onto it's own cacheline....
Cheers,
Dave. -- Dave Chinner david@fromorbit.com
| |