mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-15 09:34:17 +00:00
7b1b2b60c6
Although not explicitly documented in the psample module itself, the definition of PSAMPLE_ATTR_SAMPLE_RATE seems inherited from act_sample. Quoting tc-sample(8): "RATE of 100 will lead to an average of one sampled packet out of every 100 observed." With this semantics, the rates that we can express with an unsigned 32-bits number are very unevenly distributed and concentrated towards "sampling few packets". For example, we can express a probability of 2.32E-8% but we cannot express anything between 100% and 50%. For sampling applications that are capable of sampling a decent amount of packets, this sampling rate semantics is not very useful. Add a new flag to the uAPI that indicates that the sampling rate is expressed in scaled probability, this is: - 0 is 0% probability, no packets get sampled. - U32_MAX is 100% probability, all packets get sampled. Reviewed-by: Aaron Conole <aconole@redhat.com> Acked-by: Eelco Chaudron <echaudro@redhat.com> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: Adrian Moreno <amorenoz@redhat.com> Link: https://patch.msgid.link/20240704085710.353845-5-amorenoz@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
55 lines
1.1 KiB
C
55 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __NET_PSAMPLE_H
|
|
#define __NET_PSAMPLE_H
|
|
|
|
#include <uapi/linux/psample.h>
|
|
#include <linux/list.h>
|
|
|
|
struct psample_group {
|
|
struct list_head list;
|
|
struct net *net;
|
|
u32 group_num;
|
|
u32 refcount;
|
|
u32 seq;
|
|
struct rcu_head rcu;
|
|
};
|
|
|
|
struct psample_metadata {
|
|
u32 trunc_size;
|
|
int in_ifindex;
|
|
int out_ifindex;
|
|
u16 out_tc;
|
|
u64 out_tc_occ; /* bytes */
|
|
u64 latency; /* nanoseconds */
|
|
u8 out_tc_valid:1,
|
|
out_tc_occ_valid:1,
|
|
latency_valid:1,
|
|
rate_as_probability:1,
|
|
unused:4;
|
|
const u8 *user_cookie;
|
|
u32 user_cookie_len;
|
|
};
|
|
|
|
struct psample_group *psample_group_get(struct net *net, u32 group_num);
|
|
void psample_group_take(struct psample_group *group);
|
|
void psample_group_put(struct psample_group *group);
|
|
|
|
struct sk_buff;
|
|
|
|
#if IS_ENABLED(CONFIG_PSAMPLE)
|
|
|
|
void psample_sample_packet(struct psample_group *group, struct sk_buff *skb,
|
|
u32 sample_rate, const struct psample_metadata *md);
|
|
|
|
#else
|
|
|
|
static inline void psample_sample_packet(struct psample_group *group,
|
|
struct sk_buff *skb, u32 sample_rate,
|
|
const struct psample_metadata *md)
|
|
{
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* __NET_PSAMPLE_H */
|