Commit 236a6b1c authored by Jonathan Lemon's avatar Jonathan Lemon Committed by Jakub Kicinski

skbuff: Call sock_zerocopy_put_abort from skb_zcopy_put_abort

The sock_zerocopy_put_abort function contains logic which is
specific to the current zerocopy implementation.  Add a wrapper
which checks the callback and dispatches apppropriately.
Signed-off-by: default avatarJonathan Lemon <jonathan.lemon@gmail.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 36177832
...@@ -1478,6 +1478,16 @@ static inline void skb_zcopy_put(struct ubuf_info *uarg) ...@@ -1478,6 +1478,16 @@ static inline void skb_zcopy_put(struct ubuf_info *uarg)
uarg->callback(NULL, uarg, true); uarg->callback(NULL, uarg, true);
} }
static inline void skb_zcopy_put_abort(struct ubuf_info *uarg, bool have_uref)
{
if (uarg) {
if (uarg->callback == sock_zerocopy_callback)
sock_zerocopy_put_abort(uarg, have_uref);
else if (have_uref)
skb_zcopy_put(uarg);
}
}
/* Release a reference on a zerocopy structure */ /* Release a reference on a zerocopy structure */
static inline void skb_zcopy_clear(struct sk_buff *skb, bool zerocopy_success) static inline void skb_zcopy_clear(struct sk_buff *skb, bool zerocopy_success)
{ {
......
...@@ -1254,15 +1254,13 @@ EXPORT_SYMBOL_GPL(sock_zerocopy_callback); ...@@ -1254,15 +1254,13 @@ EXPORT_SYMBOL_GPL(sock_zerocopy_callback);
void sock_zerocopy_put_abort(struct ubuf_info *uarg, bool have_uref) void sock_zerocopy_put_abort(struct ubuf_info *uarg, bool have_uref)
{ {
if (uarg) { struct sock *sk = skb_from_uarg(uarg)->sk;
struct sock *sk = skb_from_uarg(uarg)->sk;
atomic_dec(&sk->sk_zckey); atomic_dec(&sk->sk_zckey);
uarg->len--; uarg->len--;
if (have_uref) if (have_uref)
skb_zcopy_put(uarg); sock_zerocopy_callback(NULL, uarg, true);
}
} }
EXPORT_SYMBOL_GPL(sock_zerocopy_put_abort); EXPORT_SYMBOL_GPL(sock_zerocopy_put_abort);
......
...@@ -1230,8 +1230,7 @@ static int __ip_append_data(struct sock *sk, ...@@ -1230,8 +1230,7 @@ static int __ip_append_data(struct sock *sk,
error_efault: error_efault:
err = -EFAULT; err = -EFAULT;
error: error:
if (uarg) skb_zcopy_put_abort(uarg, extra_uref);
sock_zerocopy_put_abort(uarg, extra_uref);
cork->length -= length; cork->length -= length;
IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTDISCARDS); IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTDISCARDS);
refcount_add(wmem_alloc_delta, &sk->sk_wmem_alloc); refcount_add(wmem_alloc_delta, &sk->sk_wmem_alloc);
......
...@@ -1440,7 +1440,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size) ...@@ -1440,7 +1440,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
if (copied + copied_syn) if (copied + copied_syn)
goto out; goto out;
out_err: out_err:
sock_zerocopy_put_abort(uarg, true); skb_zcopy_put_abort(uarg, true);
err = sk_stream_error(sk, flags, err); err = sk_stream_error(sk, flags, err);
/* make sure we wake any epoll edge trigger waiter */ /* make sure we wake any epoll edge trigger waiter */
if (unlikely(tcp_rtx_and_write_queues_empty(sk) && err == -EAGAIN)) { if (unlikely(tcp_rtx_and_write_queues_empty(sk) && err == -EAGAIN)) {
......
...@@ -1715,8 +1715,7 @@ static int __ip6_append_data(struct sock *sk, ...@@ -1715,8 +1715,7 @@ static int __ip6_append_data(struct sock *sk,
error_efault: error_efault:
err = -EFAULT; err = -EFAULT;
error: error:
if (uarg) skb_zcopy_put_abort(uarg, extra_uref);
sock_zerocopy_put_abort(uarg, extra_uref);
cork->length -= length; cork->length -= length;
IP6_INC_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS); IP6_INC_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);
refcount_add(wmem_alloc_delta, &sk->sk_wmem_alloc); refcount_add(wmem_alloc_delta, &sk->sk_wmem_alloc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment