aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vhost/vhost.h
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2014-06-05 08:20:27 -0400
committerMichael S. Tsirkin <mst@redhat.com>2014-06-09 09:21:07 -0400
commit47283bef7ed356629467d1fac61687756e48f254 (patch)
tree464f8f6973cf9da00fc57679a62638a6c7aee593 /drivers/vhost/vhost.h
parentea16c51433510f7f758382dec5b933fc0797f244 (diff)
vhost: move memory pointer to VQs
commit 2ae76693b8bcabf370b981cd00c36cd41d33fabc vhost: replace rcu with mutex replaced rcu sync for memory accesses with VQ mutex locl/unlock. This is correct since all accesses are under VQ mutex, but incomplete: we still do useless rcu lock/unlock operations, someone might copy this code into some other context where this won't be right. This use of RCU is also non standard and hard to understand. Let's copy the pointer to each VQ structure, this way the access rules become straight-forward, and there's no need for RCU anymore. Reported-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'drivers/vhost/vhost.h')
-rw-r--r--drivers/vhost/vhost.h8
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
index ff454a0ec6f5..3eda654b8f5a 100644
--- a/drivers/vhost/vhost.h
+++ b/drivers/vhost/vhost.h
@@ -104,6 +104,7 @@ struct vhost_virtqueue {
104 struct iovec *indirect; 104 struct iovec *indirect;
105 struct vring_used_elem *heads; 105 struct vring_used_elem *heads;
106 /* Protected by virtqueue mutex. */ 106 /* Protected by virtqueue mutex. */
107 struct vhost_memory *memory;
107 void *private_data; 108 void *private_data;
108 unsigned acked_features; 109 unsigned acked_features;
109 /* Log write descriptors */ 110 /* Log write descriptors */
@@ -112,10 +113,7 @@ struct vhost_virtqueue {
112}; 113};
113 114
114struct vhost_dev { 115struct vhost_dev {
115 /* Readers use RCU to access memory table pointer 116 struct vhost_memory *memory;
116 * log base pointer and features.
117 * Writers use mutex below.*/
118 struct vhost_memory __rcu *memory;
119 struct mm_struct *mm; 117 struct mm_struct *mm;
120 struct mutex mutex; 118 struct mutex mutex;
121 struct vhost_virtqueue **vqs; 119 struct vhost_virtqueue **vqs;
@@ -140,7 +138,7 @@ long vhost_vring_ioctl(struct vhost_dev *d, int ioctl, void __user *argp);
140int vhost_vq_access_ok(struct vhost_virtqueue *vq); 138int vhost_vq_access_ok(struct vhost_virtqueue *vq);
141int vhost_log_access_ok(struct vhost_dev *); 139int vhost_log_access_ok(struct vhost_dev *);
142 140
143int vhost_get_vq_desc(struct vhost_dev *, struct vhost_virtqueue *, 141int vhost_get_vq_desc(struct vhost_virtqueue *,
144 struct iovec iov[], unsigned int iov_count, 142 struct iovec iov[], unsigned int iov_count,
145 unsigned int *out_num, unsigned int *in_num, 143 unsigned int *out_num, unsigned int *in_num,
146 struct vhost_log *log, unsigned int *log_num); 144 struct vhost_log *log, unsigned int *log_num);