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: Jonathan Lemon <jonathan.lemon@gmail.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
36177832f4
commit
236a6b1cd5
@ -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);
|
|||||||
|
|
||||||
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,
|
|||||||
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)
|
|||||||
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,
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user