diff options
| author | Arnd Bergmann <arnd@relay.de.ibm.com> | 2010-03-09 13:24:45 -0500 |
|---|---|---|
| committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2010-08-21 19:27:36 -0400 |
| commit | 28457ee69c473a903e51e26c7bcd6f1e9eceb93e (patch) | |
| tree | 7f872922577ec45ce655d68770c95082ad858a45 /drivers/vhost/net.c | |
| parent | 65e6bf484c497f02d47a0faae69ee398cd59cfda (diff) | |
vhost: add __rcu annotations
Also add rcu_dereference_protected() for code paths where locks are held.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Diffstat (limited to 'drivers/vhost/net.c')
| -rw-r--r-- | drivers/vhost/net.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 29e850a7a2f9..1318ee008346 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
| @@ -127,7 +127,10 @@ static void handle_tx(struct vhost_net *net) | |||
| 127 | size_t len, total_len = 0; | 127 | size_t len, total_len = 0; |
| 128 | int err, wmem; | 128 | int err, wmem; |
| 129 | size_t hdr_size; | 129 | size_t hdr_size; |
| 130 | struct socket *sock = rcu_dereference(vq->private_data); | 130 | struct socket *sock; |
| 131 | |||
| 132 | sock = rcu_dereference_check(vq->private_data, | ||
| 133 | lockdep_is_held(&vq->mutex)); | ||
| 131 | if (!sock) | 134 | if (!sock) |
| 132 | return; | 135 | return; |
| 133 | 136 | ||
| @@ -582,7 +585,10 @@ static void vhost_net_disable_vq(struct vhost_net *n, | |||
| 582 | static void vhost_net_enable_vq(struct vhost_net *n, | 585 | static void vhost_net_enable_vq(struct vhost_net *n, |
| 583 | struct vhost_virtqueue *vq) | 586 | struct vhost_virtqueue *vq) |
| 584 | { | 587 | { |
| 585 | struct socket *sock = vq->private_data; | 588 | struct socket *sock; |
| 589 | |||
| 590 | sock = rcu_dereference_protected(vq->private_data, | ||
| 591 | lockdep_is_held(&vq->mutex)); | ||
| 586 | if (!sock) | 592 | if (!sock) |
| 587 | return; | 593 | return; |
| 588 | if (vq == n->vqs + VHOST_NET_VQ_TX) { | 594 | if (vq == n->vqs + VHOST_NET_VQ_TX) { |
| @@ -598,7 +604,8 @@ static struct socket *vhost_net_stop_vq(struct vhost_net *n, | |||
| 598 | struct socket *sock; | 604 | struct socket *sock; |
| 599 | 605 | ||
| 600 | mutex_lock(&vq->mutex); | 606 | mutex_lock(&vq->mutex); |
| 601 | sock = vq->private_data; | 607 | sock = rcu_dereference_protected(vq->private_data, |
| 608 | lockdep_is_held(&vq->mutex)); | ||
| 602 | vhost_net_disable_vq(n, vq); | 609 | vhost_net_disable_vq(n, vq); |
| 603 | rcu_assign_pointer(vq->private_data, NULL); | 610 | rcu_assign_pointer(vq->private_data, NULL); |
| 604 | mutex_unlock(&vq->mutex); | 611 | mutex_unlock(&vq->mutex); |
| @@ -736,7 +743,8 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) | |||
| 736 | } | 743 | } |
| 737 | 744 | ||
| 738 | /* start polling new socket */ | 745 | /* start polling new socket */ |
| 739 | oldsock = vq->private_data; | 746 | oldsock = rcu_dereference_protected(vq->private_data, |
| 747 | lockdep_is_held(&vq->mutex)); | ||
| 740 | if (sock != oldsock) { | 748 | if (sock != oldsock) { |
| 741 | vhost_net_disable_vq(n, vq); | 749 | vhost_net_disable_vq(n, vq); |
| 742 | rcu_assign_pointer(vq->private_data, sock); | 750 | rcu_assign_pointer(vq->private_data, sock); |
