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

Commit aa196eed authored by Jason Wang's avatar Jason Wang Committed by David S. Miller
Browse files

macvtap: handle ubuf refcount correctly when meet errors



We trigger uarg->callback() immediately after we decide do datacopy
even if caller want to do zerocopy. This will cause the callback
(vhost_net_zerocopy_callback) decrease the refcount. But when we meet
an error afterwards, the error handling in vhost handle_tx() will try
to decrease it again. This is wrong and fix this by delay the
uarg->callback() until we're sure there's no errors.

Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent af1cc7a2
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -742,13 +742,8 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,

	if (zerocopy)
		err = zerocopy_sg_from_iter(skb, from);
	else {
	else
		err = skb_copy_datagram_from_iter(skb, 0, from, len);
		if (!err && m && m->msg_control) {
			struct ubuf_info *uarg = m->msg_control;
			uarg->callback(uarg, false);
		}
	}

	if (err)
		goto err_kfree;
@@ -779,7 +774,11 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
		skb_shinfo(skb)->destructor_arg = m->msg_control;
		skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
		skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
	} else if (m && m->msg_control) {
		struct ubuf_info *uarg = m->msg_control;
		uarg->callback(uarg, false);
	}

	if (vlan) {
		skb->dev = vlan->dev;
		dev_queue_xmit(skb);