net/rds/stats.c
Source file repositories/reference/linux-study-clean/net/rds/stats.c
File Facts
- System
- Linux kernel
- Corpus path
net/rds/stats.c- Extension
.c- Size
- 4465 bytes
- Lines
- 156
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/percpu.hlinux/seq_file.hlinux/proc_fs.hlinux/export.hrds.h
Detected Declarations
function rds_stats_info_copyfunction rds_stats_infofunction for_each_online_cpufunction rds_stats_exitfunction rds_stats_initexport rds_stats_info_copy
Annotated Snippet
#include <linux/percpu.h>
#include <linux/seq_file.h>
#include <linux/proc_fs.h>
#include <linux/export.h>
#include "rds.h"
DEFINE_PER_CPU_SHARED_ALIGNED(struct rds_statistics, rds_stats);
EXPORT_PER_CPU_SYMBOL_GPL(rds_stats);
/* :.,$s/unsigned long\>.*\<s_\(.*\);/"\1",/g */
static const char *const rds_stat_names[] = {
"conn_reset",
"recv_drop_bad_checksum",
"recv_drop_old_seq",
"recv_drop_no_sock",
"recv_drop_dead_sock",
"recv_deliver_raced",
"recv_delivered",
"recv_queued",
"recv_immediate_retry",
"recv_delayed_retry",
"recv_ack_required",
"recv_rdma_bytes",
"recv_ping",
"send_queue_empty",
"send_queue_full",
"send_lock_contention",
"send_lock_queue_raced",
"send_immediate_retry",
"send_delayed_retry",
"send_drop_acked",
"send_ack_required",
"send_queued",
"send_rdma",
"send_rdma_bytes",
"send_pong",
"page_remainder_hit",
"page_remainder_miss",
"copy_to_user",
"copy_from_user",
"cong_update_queued",
"cong_update_received",
"cong_send_error",
"cong_send_blocked",
"recv_bytes_added_to_sock",
"recv_bytes_freed_fromsock",
"send_stuck_rm",
"mprds_catchup_tx0_retries",
};
void rds_stats_info_copy(struct rds_info_iterator *iter,
uint64_t *values, const char *const *names, size_t nr)
{
struct rds_info_counter ctr;
size_t i;
for (i = 0; i < nr; i++) {
BUG_ON(strlen(names[i]) >= sizeof(ctr.name));
strscpy_pad(ctr.name, names[i]);
ctr.value = values[i];
rds_info_copy(iter, &ctr, sizeof(ctr));
}
}
EXPORT_SYMBOL_GPL(rds_stats_info_copy);
/*
* This gives global counters across all the transports. The strings
* are copied in so that the tool doesn't need knowledge of the specific
* stats that we're exporting. Some are pretty implementation dependent
* and may change over time. That doesn't stop them from being useful.
*
* This is the only function in the chain that knows about the byte granular
* length in userspace. It converts it to number of stat entries that the
* rest of the functions operate in.
*/
static void rds_stats_info(struct socket *sock, unsigned int len,
struct rds_info_iterator *iter,
struct rds_info_lengths *lens)
{
struct rds_statistics stats = {0, };
uint64_t *src;
uint64_t *sum;
size_t i;
int cpu;
unsigned int avail;
avail = len / sizeof(struct rds_info_counter);
Annotation
- Immediate include surface: `linux/percpu.h`, `linux/seq_file.h`, `linux/proc_fs.h`, `linux/export.h`, `rds.h`.
- Detected declarations: `function rds_stats_info_copy`, `function rds_stats_info`, `function for_each_online_cpu`, `function rds_stats_exit`, `function rds_stats_init`, `export rds_stats_info_copy`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: integration implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
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.