Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01d6657b authored by Jason Wang's avatar Jason Wang Committed by Michael S. Tsirkin
Browse files

macvtap: zerocopy: set SKBTX_DEV_ZEROCOPY only when skb is built successfully



Current the SKBTX_DEV_ZEROCOPY is set unconditionally after
zerocopy_sg_from_iovec(), this would lead NULL pointer when macvtap
fails to build zerocopy skb because destructor_arg was not
initialized. Solve this by set this flag after the skb were built
successfully.

Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 02ce04bb
Loading
Loading
Loading
Loading
+5 −4
Original line number Original line Diff line number Diff line
@@ -699,10 +699,9 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
	if (!skb)
	if (!skb)
		goto err;
		goto err;


	if (zerocopy) {
	if (zerocopy)
		err = zerocopy_sg_from_iovec(skb, iv, vnet_hdr_len, count);
		err = zerocopy_sg_from_iovec(skb, iv, vnet_hdr_len, count);
		skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
	else
	} else
		err = skb_copy_datagram_from_iovec(skb, 0, iv, vnet_hdr_len,
		err = skb_copy_datagram_from_iovec(skb, 0, iv, vnet_hdr_len,
						   len);
						   len);
	if (err)
	if (err)
@@ -721,8 +720,10 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
	rcu_read_lock_bh();
	rcu_read_lock_bh();
	vlan = rcu_dereference_bh(q->vlan);
	vlan = rcu_dereference_bh(q->vlan);
	/* copy skb_ubuf_info for callback when skb has no error */
	/* copy skb_ubuf_info for callback when skb has no error */
	if (zerocopy)
	if (zerocopy) {
		skb_shinfo(skb)->destructor_arg = m->msg_control;
		skb_shinfo(skb)->destructor_arg = m->msg_control;
		skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
	}
	if (vlan)
	if (vlan)
		macvlan_start_xmit(skb, vlan->dev);
		macvlan_start_xmit(skb, vlan->dev);
	else
	else