aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/macvtap.c12
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,
912done: 915done:
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;