diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2014-06-05 08:20:23 -0400 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2014-06-09 09:21:06 -0400 |
commit | ea16c51433510f7f758382dec5b933fc0797f244 (patch) | |
tree | 51f7ff47424fef4d9a8750f92723782e2d17e63a /drivers/vhost/net.c | |
parent | 98f9ca0a3faa99b7388578d55eccecf272be4038 (diff) |
vhost: move acked_features to VQs
Refactor code to make sure features are only accessed
under VQ mutex. This makes everything simpler, no need
for RCU here anymore.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'drivers/vhost/net.c')
-rw-r--r-- | drivers/vhost/net.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index e489161d0feb..2bc8f298a4e7 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
@@ -585,9 +585,9 @@ static void handle_rx(struct vhost_net *net) | |||
585 | vhost_hlen = nvq->vhost_hlen; | 585 | vhost_hlen = nvq->vhost_hlen; |
586 | sock_hlen = nvq->sock_hlen; | 586 | sock_hlen = nvq->sock_hlen; |
587 | 587 | ||
588 | vq_log = unlikely(vhost_has_feature(&net->dev, VHOST_F_LOG_ALL)) ? | 588 | vq_log = unlikely(vhost_has_feature(vq, VHOST_F_LOG_ALL)) ? |
589 | vq->log : NULL; | 589 | vq->log : NULL; |
590 | mergeable = vhost_has_feature(&net->dev, VIRTIO_NET_F_MRG_RXBUF); | 590 | mergeable = vhost_has_feature(vq, VIRTIO_NET_F_MRG_RXBUF); |
591 | 591 | ||
592 | while ((sock_len = peek_head_len(sock->sk))) { | 592 | while ((sock_len = peek_head_len(sock->sk))) { |
593 | sock_len += sock_hlen; | 593 | sock_len += sock_hlen; |
@@ -1051,15 +1051,13 @@ static int vhost_net_set_features(struct vhost_net *n, u64 features) | |||
1051 | mutex_unlock(&n->dev.mutex); | 1051 | mutex_unlock(&n->dev.mutex); |
1052 | return -EFAULT; | 1052 | return -EFAULT; |
1053 | } | 1053 | } |
1054 | n->dev.acked_features = features; | ||
1055 | smp_wmb(); | ||
1056 | for (i = 0; i < VHOST_NET_VQ_MAX; ++i) { | 1054 | for (i = 0; i < VHOST_NET_VQ_MAX; ++i) { |
1057 | mutex_lock(&n->vqs[i].vq.mutex); | 1055 | mutex_lock(&n->vqs[i].vq.mutex); |
1056 | n->vqs[i].vq.acked_features = features; | ||
1058 | n->vqs[i].vhost_hlen = vhost_hlen; | 1057 | n->vqs[i].vhost_hlen = vhost_hlen; |
1059 | n->vqs[i].sock_hlen = sock_hlen; | 1058 | n->vqs[i].sock_hlen = sock_hlen; |
1060 | mutex_unlock(&n->vqs[i].vq.mutex); | 1059 | mutex_unlock(&n->vqs[i].vq.mutex); |
1061 | } | 1060 | } |
1062 | vhost_net_flush(n); | ||
1063 | mutex_unlock(&n->dev.mutex); | 1061 | mutex_unlock(&n->dev.mutex); |
1064 | return 0; | 1062 | return 0; |
1065 | } | 1063 | } |