diff options
-rw-r--r-- | drivers/net/macvtap.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index a98fb0ed6aef..b51db2abfe44 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -818,10 +818,13 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, | |||
818 | skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY; | 818 | skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY; |
819 | skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; | 819 | skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; |
820 | } | 820 | } |
821 | if (vlan) | 821 | if (vlan) { |
822 | local_bh_disable(); | ||
822 | macvlan_start_xmit(skb, vlan->dev); | 823 | macvlan_start_xmit(skb, vlan->dev); |
823 | else | 824 | local_bh_enable(); |
825 | } else { | ||
824 | kfree_skb(skb); | 826 | kfree_skb(skb); |
827 | } | ||
825 | rcu_read_unlock(); | 828 | rcu_read_unlock(); |
826 | 829 | ||
827 | return total_len; | 830 | return total_len; |
@@ -912,8 +915,11 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q, | |||
912 | done: | 915 | done: |
913 | rcu_read_lock(); | 916 | rcu_read_lock(); |
914 | vlan = rcu_dereference(q->vlan); | 917 | vlan = rcu_dereference(q->vlan); |
915 | if (vlan) | 918 | if (vlan) { |
919 | preempt_disable(); | ||
916 | macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0); | 920 | macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0); |
921 | preempt_enable(); | ||
922 | } | ||
917 | rcu_read_unlock(); | 923 | rcu_read_unlock(); |
918 | 924 | ||
919 | return ret ? ret : copied; | 925 | return ret ? ret : copied; |