diff options
Diffstat (limited to 'drivers/net/macvtap.c')
-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 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, | |||
809 | done: | 812 | done: |
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; |