Skip to content

Commit cd6e111

Browse files
tomratbertdavem330
authored andcommitted
kcm: Add statistics and proc interfaces
This patch adds various counters for KCM. These include counters for messages and bytes received or sent, as well as counters for number of attached/unattached TCP sockets and other error or edge events. The statistics are exposed via a proc interface. /proc/net/kcm provides statistics per KCM socket and per psock (attached TCP sockets). /proc/net/kcm_stats provides aggregate statistics. Signed-off-by: Tom Herbert <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent ab7ac4e commit cd6e111

File tree

4 files changed

+597
-1
lines changed

4 files changed

+597
-1
lines changed

include/net/kcm.h

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,42 @@
1717

1818
extern unsigned int kcm_net_id;
1919

20+
#define KCM_STATS_ADD(stat, count) ((stat) += (count))
21+
#define KCM_STATS_INCR(stat) ((stat)++)
22+
23+
struct kcm_psock_stats {
24+
unsigned long long rx_msgs;
25+
unsigned long long rx_bytes;
26+
unsigned long long tx_msgs;
27+
unsigned long long tx_bytes;
28+
unsigned int rx_aborts;
29+
unsigned int rx_mem_fail;
30+
unsigned int rx_need_more_hdr;
31+
unsigned int rx_bad_hdr_len;
32+
unsigned long long reserved;
33+
unsigned long long unreserved;
34+
unsigned int tx_aborts;
35+
};
36+
37+
struct kcm_mux_stats {
38+
unsigned long long rx_msgs;
39+
unsigned long long rx_bytes;
40+
unsigned long long tx_msgs;
41+
unsigned long long tx_bytes;
42+
unsigned int rx_ready_drops;
43+
unsigned int tx_retries;
44+
unsigned int psock_attach;
45+
unsigned int psock_unattach_rsvd;
46+
unsigned int psock_unattach;
47+
};
48+
49+
struct kcm_stats {
50+
unsigned long long rx_msgs;
51+
unsigned long long rx_bytes;
52+
unsigned long long tx_msgs;
53+
unsigned long long tx_bytes;
54+
};
55+
2056
struct kcm_tx_msg {
2157
unsigned int sent;
2258
unsigned int fragidx;
@@ -41,6 +77,8 @@ struct kcm_sock {
4177
u32 done : 1;
4278
struct work_struct done_work;
4379

80+
struct kcm_stats stats;
81+
4482
/* Transmit */
4583
struct kcm_psock *tx_psock;
4684
struct work_struct tx_work;
@@ -77,6 +115,8 @@ struct kcm_psock {
77115

78116
struct list_head psock_list;
79117

118+
struct kcm_psock_stats stats;
119+
80120
/* Receive */
81121
struct sk_buff *rx_skb_head;
82122
struct sk_buff **rx_skb_nextp;
@@ -86,15 +126,21 @@ struct kcm_psock {
86126
struct delayed_work rx_delayed_work;
87127
struct bpf_prog *bpf_prog;
88128
struct kcm_sock *rx_kcm;
129+
unsigned long long saved_rx_bytes;
130+
unsigned long long saved_rx_msgs;
89131

90132
/* Transmit */
91133
struct kcm_sock *tx_kcm;
92134
struct list_head psock_avail_list;
135+
unsigned long long saved_tx_bytes;
136+
unsigned long long saved_tx_msgs;
93137
};
94138

95139
/* Per net MUX list */
96140
struct kcm_net {
97141
struct mutex mutex;
142+
struct kcm_psock_stats aggregate_psock_stats;
143+
struct kcm_mux_stats aggregate_mux_stats;
98144
struct list_head mux_list;
99145
int count;
100146
};
@@ -110,6 +156,9 @@ struct kcm_mux {
110156
struct list_head psocks; /* List of all psocks on MUX */
111157
int psocks_cnt; /* Total attached sockets */
112158

159+
struct kcm_mux_stats stats;
160+
struct kcm_psock_stats aggregate_psock_stats;
161+
113162
/* Receive */
114163
spinlock_t rx_lock ____cacheline_aligned_in_smp;
115164
struct list_head kcm_rx_waiters; /* KCMs waiting for receiving */
@@ -122,4 +171,49 @@ struct kcm_mux {
122171
struct list_head kcm_tx_waiters; /* KCMs waiting for a TX psock */
123172
};
124173

174+
#ifdef CONFIG_PROC_FS
175+
int kcm_proc_init(void);
176+
void kcm_proc_exit(void);
177+
#else
178+
static int kcm_proc_init(void) { return 0; }
179+
static void kcm_proc_exit(void) { }
180+
#endif
181+
182+
static inline void aggregate_psock_stats(struct kcm_psock_stats *stats,
183+
struct kcm_psock_stats *agg_stats)
184+
{
185+
/* Save psock statistics in the mux when psock is being unattached. */
186+
187+
#define SAVE_PSOCK_STATS(_stat) (agg_stats->_stat += stats->_stat)
188+
SAVE_PSOCK_STATS(rx_msgs);
189+
SAVE_PSOCK_STATS(rx_bytes);
190+
SAVE_PSOCK_STATS(rx_aborts);
191+
SAVE_PSOCK_STATS(rx_mem_fail);
192+
SAVE_PSOCK_STATS(rx_need_more_hdr);
193+
SAVE_PSOCK_STATS(rx_bad_hdr_len);
194+
SAVE_PSOCK_STATS(tx_msgs);
195+
SAVE_PSOCK_STATS(tx_bytes);
196+
SAVE_PSOCK_STATS(reserved);
197+
SAVE_PSOCK_STATS(unreserved);
198+
SAVE_PSOCK_STATS(tx_aborts);
199+
#undef SAVE_PSOCK_STATS
200+
}
201+
202+
static inline void aggregate_mux_stats(struct kcm_mux_stats *stats,
203+
struct kcm_mux_stats *agg_stats)
204+
{
205+
/* Save psock statistics in the mux when psock is being unattached. */
206+
207+
#define SAVE_MUX_STATS(_stat) (agg_stats->_stat += stats->_stat)
208+
SAVE_MUX_STATS(rx_msgs);
209+
SAVE_MUX_STATS(rx_bytes);
210+
SAVE_MUX_STATS(tx_msgs);
211+
SAVE_MUX_STATS(tx_bytes);
212+
SAVE_MUX_STATS(rx_ready_drops);
213+
SAVE_MUX_STATS(psock_attach);
214+
SAVE_MUX_STATS(psock_unattach_rsvd);
215+
SAVE_MUX_STATS(psock_unattach);
216+
#undef SAVE_MUX_STATS
217+
}
218+
125219
#endif /* __NET_KCM_H_ */

net/kcm/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
obj-$(CONFIG_AF_KCM) += kcm.o
22

3-
kcm-y := kcmsock.o
3+
kcm-y := kcmsock.o kcmproc.o

0 commit comments

Comments
 (0)