net/sunrpc/socklib.c
Source file repositories/reference/linux-study-clean/net/sunrpc/socklib.c
File Facts
- System
- Linux kernel
- Corpus path
net/sunrpc/socklib.c- Extension
.c- Size
- 6805 bytes
- Lines
- 279
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: implementation source
- Status
- source implementation candidate
Why This File Exists
Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/compiler.hlinux/netdevice.hlinux/gfp.hlinux/skbuff.hlinux/types.hlinux/pagemap.hlinux/udp.hlinux/sunrpc/msg_prot.hlinux/sunrpc/sched.hlinux/sunrpc/xdr.hlinux/export.hsocklib.h
Detected Declarations
struct xdr_skb_readerfunction xdr_skb_read_bitsfunction xdr_partial_copy_from_skbfunction csum_partial_copy_to_xdrfunction xprt_sendmsgfunction xprt_send_kvecfunction xprt_send_pagedatafunction xprt_send_rm_and_kvecfunction xprt_sock_sendmsg
Annotated Snippet
struct xdr_skb_reader {
struct sk_buff *skb;
unsigned int offset;
bool need_checksum;
size_t count;
__wsum csum;
};
/**
* xdr_skb_read_bits - copy some data bits from skb to internal buffer
* @desc: sk_buff copy helper
* @to: copy destination
* @len: number of bytes to copy
*
* Possibly called several times to iterate over an sk_buff and copy data out of
* it.
*/
static size_t
xdr_skb_read_bits(struct xdr_skb_reader *desc, void *to, size_t len)
{
len = min(len, desc->count);
if (desc->need_checksum) {
__wsum csum;
csum = skb_copy_and_csum_bits(desc->skb, desc->offset, to, len);
desc->csum = csum_block_add(desc->csum, csum, desc->offset);
} else {
if (unlikely(skb_copy_bits(desc->skb, desc->offset, to, len)))
return 0;
}
desc->count -= len;
desc->offset += len;
return len;
}
static ssize_t
xdr_partial_copy_from_skb(struct xdr_buf *xdr, struct xdr_skb_reader *desc)
{
struct page **ppage = xdr->pages + (xdr->page_base >> PAGE_SHIFT);
unsigned int poff = xdr->page_base & ~PAGE_MASK;
unsigned int pglen = xdr->page_len;
ssize_t copied = 0;
size_t ret;
if (xdr->head[0].iov_len == 0)
return 0;
ret = xdr_skb_read_bits(desc, xdr->head[0].iov_base,
xdr->head[0].iov_len);
if (ret != xdr->head[0].iov_len || !desc->count)
return ret;
copied += ret;
while (pglen) {
unsigned int len = min(PAGE_SIZE - poff, pglen);
char *kaddr;
/* ACL likes to be lazy in allocating pages - ACLs
* are small by default but can get huge. */
if ((xdr->flags & XDRBUF_SPARSE_PAGES) && *ppage == NULL) {
*ppage = alloc_page(GFP_NOWAIT);
if (unlikely(*ppage == NULL)) {
if (copied == 0)
return -ENOMEM;
return copied;
}
}
kaddr = kmap_atomic(*ppage);
ret = xdr_skb_read_bits(desc, kaddr + poff, len);
flush_dcache_page(*ppage);
kunmap_atomic(kaddr);
copied += ret;
if (ret != len || !desc->count)
return copied;
ppage++;
pglen -= len;
poff = 0;
}
if (xdr->tail[0].iov_len) {
copied += xdr_skb_read_bits(desc, xdr->tail[0].iov_base,
xdr->tail[0].iov_len);
}
return copied;
}
Annotation
- Immediate include surface: `linux/compiler.h`, `linux/netdevice.h`, `linux/gfp.h`, `linux/skbuff.h`, `linux/types.h`, `linux/pagemap.h`, `linux/udp.h`, `linux/sunrpc/msg_prot.h`.
- Detected declarations: `struct xdr_skb_reader`, `function xdr_skb_read_bits`, `function xdr_partial_copy_from_skb`, `function csum_partial_copy_to_xdr`, `function xprt_sendmsg`, `function xprt_send_kvec`, `function xprt_send_pagedata`, `function xprt_send_rm_and_kvec`, `function xprt_sock_sendmsg`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.