Skip to content

Commit af1cc7a

Browse files
jasowangdavem330
authored andcommitted
tun: 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. Reported-by: wangyunjian <wangyunjian@huawei.com> Signed-off-by: Jason Wang <jasowang@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 4ccfd63 commit af1cc7a

1 file changed

Lines changed: 4 additions & 6 deletions

File tree

drivers/net/tun.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,13 +1246,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
12461246

12471247
if (zerocopy)
12481248
err = zerocopy_sg_from_iter(skb, from);
1249-
else {
1249+
else
12501250
err = skb_copy_datagram_from_iter(skb, 0, from, len);
1251-
if (!err && msg_control) {
1252-
struct ubuf_info *uarg = msg_control;
1253-
uarg->callback(uarg, false);
1254-
}
1255-
}
12561251

12571252
if (err) {
12581253
this_cpu_inc(tun->pcpu_stats->rx_dropped);
@@ -1298,6 +1293,9 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
12981293
skb_shinfo(skb)->destructor_arg = msg_control;
12991294
skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
13001295
skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
1296+
} else if (msg_control) {
1297+
struct ubuf_info *uarg = msg_control;
1298+
uarg->callback(uarg, false);
13011299
}
13021300

13031301
skb_reset_network_header(skb);

0 commit comments

Comments
 (0)