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 --- |