diff options
author | Vlad Yasevich <vyasevic@redhat.com> | 2013-06-25 16:04:20 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-06-25 19:44:56 -0400 |
commit | ac4e4af1e59e16a018527ffa58d9d3f30bb96ca9 (patch) | |
tree | 310295ae1fffa64e94f8f3d733465d652925149a /drivers/net/macvtap.c | |
parent | 441ac0fcaadc76ad09771812382345001dd2b813 (diff) |
macvtap: Consistently use rcu functions
Currently macvtap uses rcu_bh functions in its
user facing fuction macvtap_get_user() and macvtap_put_user().
However, its packet handlers use normal rcu as the rcu_read_lock()
is taken in netif_receive_skb(). We can safely discontinue
the usage or rcu with bh disabled.
Signed-off-by: Vlad Yasevich <vyasevic@redhat.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/macvtap.c')
-rw-r--r-- | drivers/net/macvtap.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index efbf2eb6ae78..d7856a8f589a 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -754,8 +754,8 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, | |||
754 | 754 | ||
755 | skb_probe_transport_header(skb, ETH_HLEN); | 755 | skb_probe_transport_header(skb, ETH_HLEN); |
756 | 756 | ||
757 | rcu_read_lock_bh(); | 757 | rcu_read_lock(); |
758 | vlan = rcu_dereference_bh(q->vlan); | 758 | vlan = rcu_dereference(q->vlan); |
759 | /* copy skb_ubuf_info for callback when skb has no error */ | 759 | /* copy skb_ubuf_info for callback when skb has no error */ |
760 | if (zerocopy) { | 760 | if (zerocopy) { |
761 | skb_shinfo(skb)->destructor_arg = m->msg_control; | 761 | skb_shinfo(skb)->destructor_arg = m->msg_control; |
@@ -766,7 +766,7 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, | |||
766 | macvlan_start_xmit(skb, vlan->dev); | 766 | macvlan_start_xmit(skb, vlan->dev); |
767 | else | 767 | else |
768 | kfree_skb(skb); | 768 | kfree_skb(skb); |
769 | rcu_read_unlock_bh(); | 769 | rcu_read_unlock(); |
770 | 770 | ||
771 | return total_len; | 771 | return total_len; |
772 | 772 | ||
@@ -774,11 +774,11 @@ err_kfree: | |||
774 | kfree_skb(skb); | 774 | kfree_skb(skb); |
775 | 775 | ||
776 | err: | 776 | err: |
777 | rcu_read_lock_bh(); | 777 | rcu_read_lock(); |
778 | vlan = rcu_dereference_bh(q->vlan); | 778 | vlan = rcu_dereference(q->vlan); |
779 | if (vlan) | 779 | if (vlan) |
780 | vlan->dev->stats.tx_dropped++; | 780 | vlan->dev->stats.tx_dropped++; |
781 | rcu_read_unlock_bh(); | 781 | rcu_read_unlock(); |
782 | 782 | ||
783 | return err; | 783 | return err; |
784 | } | 784 | } |
@@ -854,11 +854,11 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q, | |||
854 | copied += len; | 854 | copied += len; |
855 | 855 | ||
856 | done: | 856 | done: |
857 | rcu_read_lock_bh(); | 857 | rcu_read_lock(); |
858 | vlan = rcu_dereference_bh(q->vlan); | 858 | vlan = rcu_dereference(q->vlan); |
859 | if (vlan) | 859 | if (vlan) |
860 | macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0); | 860 | macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0); |
861 | rcu_read_unlock_bh(); | 861 | rcu_read_unlock(); |
862 | 862 | ||
863 | return ret ? ret : copied; | 863 | return ret ? ret : copied; |
864 | } | 864 | } |