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:
quoted
@@ -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