aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/macvtap.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/macvtap.c')
-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 8f6056d9ba97..1c6e1116eb0a 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -715,10 +715,13 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
715 skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY; 715 skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
716 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; 716 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
717 } 717 }
718 if (vlan) 718 if (vlan) {
719 local_bh_disable();
719 macvlan_start_xmit(skb, vlan->dev); 720 macvlan_start_xmit(skb, vlan->dev);
720 else 721 local_bh_enable();
722 } else {
721 kfree_skb(skb); 723 kfree_skb(skb);
724 }
722 rcu_read_unlock(); 725 rcu_read_unlock();
723 726
724 return total_len; 727 return total_len;
@@ -809,8 +812,11 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
809done: 812done:
810 rcu_read_lock(); 813 rcu_read_lock();
811 vlan = rcu_dereference(q->vlan); 814 vlan = rcu_dereference(q->vlan);
812 if (vlan) 815 if (vlan) {
816 preempt_disable();
813 macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0); 817 macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0);
818 preempt_enable();
819 }
814 rcu_read_unlock(); 820 rcu_read_unlock();
815 821
816 return ret ? ret : copied; 822 return ret ? ret : copied;