kcmsock.c (ed32f8d42cee118b075e4372a55c7739a11094b2) kcmsock.c (b54c9d5bd6e38edac9ce3a3f95f14a1292b5268d)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Kernel Connection Multiplexor
4 *
5 * Copyright (c) 2016 Tom Herbert <tom@herbertland.com>
6 */
7
8#include <linux/bpf.h>

--- 621 unchanged lines hidden (view full) ---

630
631 for (fragidx = 0; fragidx < skb_shinfo(skb)->nr_frags;
632 fragidx++) {
633 skb_frag_t *frag;
634
635 frag_offset = 0;
636do_frag:
637 frag = &skb_shinfo(skb)->frags[fragidx];
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Kernel Connection Multiplexor
4 *
5 * Copyright (c) 2016 Tom Herbert <tom@herbertland.com>
6 */
7
8#include <linux/bpf.h>

--- 621 unchanged lines hidden (view full) ---

630
631 for (fragidx = 0; fragidx < skb_shinfo(skb)->nr_frags;
632 fragidx++) {
633 skb_frag_t *frag;
634
635 frag_offset = 0;
636do_frag:
637 frag = &skb_shinfo(skb)->frags[fragidx];
638 if (WARN_ON(!frag->size)) {
638 if (WARN_ON(!skb_frag_size(frag))) {
639 ret = -EINVAL;
640 goto out;
641 }
642
643 ret = kernel_sendpage(psock->sk->sk_socket,
639 ret = -EINVAL;
640 goto out;
641 }
642
643 ret = kernel_sendpage(psock->sk->sk_socket,
644 frag->page.p,
645 frag->page_offset + frag_offset,
646 frag->size - frag_offset,
644 skb_frag_page(frag),
645 skb_frag_off(frag) + frag_offset,
646 skb_frag_size(frag) - frag_offset,
647 MSG_DONTWAIT);
648 if (ret <= 0) {
649 if (ret == -EAGAIN) {
650 /* Save state to try again when there's
651 * write space on the socket
652 */
653 txm->sent = sent;
654 txm->frag_offset = frag_offset;

--- 18 unchanged lines hidden (view full) ---

673 ret = 0;
674
675 goto try_again;
676 }
677
678 sent += ret;
679 frag_offset += ret;
680 KCM_STATS_ADD(psock->stats.tx_bytes, ret);
647 MSG_DONTWAIT);
648 if (ret <= 0) {
649 if (ret == -EAGAIN) {
650 /* Save state to try again when there's
651 * write space on the socket
652 */
653 txm->sent = sent;
654 txm->frag_offset = frag_offset;

--- 18 unchanged lines hidden (view full) ---

673 ret = 0;
674
675 goto try_again;
676 }
677
678 sent += ret;
679 frag_offset += ret;
680 KCM_STATS_ADD(psock->stats.tx_bytes, ret);
681 if (frag_offset < frag->size) {
681 if (frag_offset < skb_frag_size(frag)) {
682 /* Not finished with this frag */
683 goto do_frag;
684 }
685 }
686
687 if (skb == head) {
688 if (skb_has_frag_list(skb)) {
689 skb = skb_shinfo(skb)->frag_list;

--- 1414 unchanged lines hidden ---
682 /* Not finished with this frag */
683 goto do_frag;
684 }
685 }
686
687 if (skb == head) {
688 if (skb_has_frag_list(skb)) {
689 skb = skb_shinfo(skb)->frag_list;

--- 1414 unchanged lines hidden ---