aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vhost
diff options
context:
space:
mode:
authorJason Wang <jasowang@redhat.com>2011-06-21 06:04:27 -0400
committerMichael S. Tsirkin <mst@redhat.com>2011-07-19 06:28:34 -0400
commitf59281dafb832b161133743fcf3dc29051e6fdb8 (patch)
tree3eacc9fd60396174a94c8bd02326e930ff94351d /drivers/vhost
parent81fc70d86527a1450560709500ca5f52e661da1f (diff)
vhost: init used ring after backend was set
Move the used ring initialization after backend was set. This makes it possible to disable the backend and tweak the used ring, then restart. This will also make it possible to log the used ring write correctly. Signed-off-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'drivers/vhost')
-rw-r--r--drivers/vhost/net.c4
-rw-r--r--drivers/vhost/test.c5
-rw-r--r--drivers/vhost/vhost.c14
-rw-r--r--drivers/vhost/vhost.h1
4 files changed, 16 insertions, 8 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index f0fd52cdfadc..70ac60437d17 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -703,6 +703,10 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
703 vhost_net_disable_vq(n, vq); 703 vhost_net_disable_vq(n, vq);
704 rcu_assign_pointer(vq->private_data, sock); 704 rcu_assign_pointer(vq->private_data, sock);
705 vhost_net_enable_vq(n, vq); 705 vhost_net_enable_vq(n, vq);
706
707 r = vhost_init_used(vq);
708 if (r)
709 goto err_vq;
706 } 710 }
707 711
708 mutex_unlock(&vq->mutex); 712 mutex_unlock(&vq->mutex);
diff --git a/drivers/vhost/test.c b/drivers/vhost/test.c
index 734e1d74ad80..fc9a1d75281f 100644
--- a/drivers/vhost/test.c
+++ b/drivers/vhost/test.c
@@ -195,8 +195,13 @@ static long vhost_test_run(struct vhost_test *n, int test)
195 lockdep_is_held(&vq->mutex)); 195 lockdep_is_held(&vq->mutex));
196 rcu_assign_pointer(vq->private_data, priv); 196 rcu_assign_pointer(vq->private_data, priv);
197 197
198 r = vhost_init_used(&n->vqs[index]);
199
198 mutex_unlock(&vq->mutex); 200 mutex_unlock(&vq->mutex);
199 201
202 if (r)
203 goto err;
204
200 if (oldpriv) { 205 if (oldpriv) {
201 vhost_test_flush_vq(n, index); 206 vhost_test_flush_vq(n, index);
202 } 207 }
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 5ef2f62becf4..9a108038fe52 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -629,15 +629,17 @@ static long vhost_set_memory(struct vhost_dev *d, struct vhost_memory __user *m)
629 return 0; 629 return 0;
630} 630}
631 631
632static int init_used(struct vhost_virtqueue *vq, 632int vhost_init_used(struct vhost_virtqueue *vq)
633 struct vring_used __user *used)
634{ 633{
635 int r = put_user(vq->used_flags, &used->flags); 634 int r;
635 if (!vq->private_data)
636 return 0;
636 637
638 r = put_user(vq->used_flags, &vq->used->flags);
637 if (r) 639 if (r)
638 return r; 640 return r;
639 vq->signalled_used_valid = false; 641 vq->signalled_used_valid = false;
640 return get_user(vq->last_used_idx, &used->idx); 642 return get_user(vq->last_used_idx, &vq->used->idx);
641} 643}
642 644
643static long vhost_set_vring(struct vhost_dev *d, int ioctl, void __user *argp) 645static long vhost_set_vring(struct vhost_dev *d, int ioctl, void __user *argp)
@@ -752,10 +754,6 @@ static long vhost_set_vring(struct vhost_dev *d, int ioctl, void __user *argp)
752 } 754 }
753 } 755 }
754 756
755 r = init_used(vq, (struct vring_used __user *)(unsigned long)
756 a.used_user_addr);
757 if (r)
758 break;
759 vq->log_used = !!(a.flags & (0x1 << VHOST_VRING_F_LOG)); 757 vq->log_used = !!(a.flags & (0x1 << VHOST_VRING_F_LOG));
760 vq->desc = (void __user *)(unsigned long)a.desc_user_addr; 758 vq->desc = (void __user *)(unsigned long)a.desc_user_addr;
761 vq->avail = (void __user *)(unsigned long)a.avail_user_addr; 759 vq->avail = (void __user *)(unsigned long)a.avail_user_addr;
diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
index 1544b782529b..14c9abf0d800 100644
--- a/drivers/vhost/vhost.h
+++ b/drivers/vhost/vhost.h
@@ -174,6 +174,7 @@ int vhost_get_vq_desc(struct vhost_dev *, struct vhost_virtqueue *,
174 struct vhost_log *log, unsigned int *log_num); 174 struct vhost_log *log, unsigned int *log_num);
175void vhost_discard_vq_desc(struct vhost_virtqueue *, int n); 175void vhost_discard_vq_desc(struct vhost_virtqueue *, int n);
176 176
177int vhost_init_used(struct vhost_virtqueue *);
177int vhost_add_used(struct vhost_virtqueue *, unsigned int head, int len); 178int vhost_add_used(struct vhost_virtqueue *, unsigned int head, int len);
178int vhost_add_used_n(struct vhost_virtqueue *, struct vring_used_elem *heads, 179int vhost_add_used_n(struct vhost_virtqueue *, struct vring_used_elem *heads,
179 unsigned count); 180 unsigned count);