aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Borkmann <daniel@iogearbox.net>2016-10-21 06:46:33 -0400
committerDavid S. Miller <davem@davemloft.net>2016-10-22 17:05:52 -0400
commit2d0e30c30f84d08dc16f0f2af41f1b8a85f0755e (patch)
treea58da7082e4dcfea4b7782e72aec65920cfd5905
parenta10b91b8b81c29b87ff5a6d58c1402898337b956 (diff)
bpf: add helper for retrieving current numa node id
Use case is mainly for soreuseport to select sockets for the local numa node, but since generic, lets also add this for other networking and tracing program types. Suggested-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/linux/bpf.h1
-rw-r--r--include/uapi/linux/bpf.h6
-rw-r--r--kernel/bpf/core.c1
-rw-r--r--kernel/bpf/helpers.c12
-rw-r--r--kernel/trace/bpf_trace.c2
-rw-r--r--net/core/filter.c2
6 files changed, 24 insertions, 0 deletions
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index c201017b5730..edcd96ded8aa 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -319,6 +319,7 @@ extern const struct bpf_func_proto bpf_map_delete_elem_proto;
319 319
320extern const struct bpf_func_proto bpf_get_prandom_u32_proto; 320extern const struct bpf_func_proto bpf_get_prandom_u32_proto;
321extern const struct bpf_func_proto bpf_get_smp_processor_id_proto; 321extern const struct bpf_func_proto bpf_get_smp_processor_id_proto;
322extern const struct bpf_func_proto bpf_get_numa_node_id_proto;
322extern const struct bpf_func_proto bpf_tail_call_proto; 323extern const struct bpf_func_proto bpf_tail_call_proto;
323extern const struct bpf_func_proto bpf_ktime_get_ns_proto; 324extern const struct bpf_func_proto bpf_ktime_get_ns_proto;
324extern const struct bpf_func_proto bpf_get_current_pid_tgid_proto; 325extern const struct bpf_func_proto bpf_get_current_pid_tgid_proto;
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index f09c70b97eca..374ef582ae18 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -426,6 +426,12 @@ enum bpf_func_id {
426 */ 426 */
427 BPF_FUNC_set_hash_invalid, 427 BPF_FUNC_set_hash_invalid,
428 428
429 /**
430 * bpf_get_numa_node_id()
431 * Returns the id of the current NUMA node.
432 */
433 BPF_FUNC_get_numa_node_id,
434
429 __BPF_FUNC_MAX_ID, 435 __BPF_FUNC_MAX_ID,
430}; 436};
431 437
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index aa6d98154106..82a04143368e 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -1043,6 +1043,7 @@ const struct bpf_func_proto bpf_map_delete_elem_proto __weak;
1043 1043
1044const struct bpf_func_proto bpf_get_prandom_u32_proto __weak; 1044const struct bpf_func_proto bpf_get_prandom_u32_proto __weak;
1045const struct bpf_func_proto bpf_get_smp_processor_id_proto __weak; 1045const struct bpf_func_proto bpf_get_smp_processor_id_proto __weak;
1046const struct bpf_func_proto bpf_get_numa_node_id_proto __weak;
1046const struct bpf_func_proto bpf_ktime_get_ns_proto __weak; 1047const struct bpf_func_proto bpf_ktime_get_ns_proto __weak;
1047 1048
1048const struct bpf_func_proto bpf_get_current_pid_tgid_proto __weak; 1049const struct bpf_func_proto bpf_get_current_pid_tgid_proto __weak;
diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
index 39918402e6e9..045cbe673356 100644
--- a/kernel/bpf/helpers.c
+++ b/kernel/bpf/helpers.c
@@ -13,6 +13,7 @@
13#include <linux/rcupdate.h> 13#include <linux/rcupdate.h>
14#include <linux/random.h> 14#include <linux/random.h>
15#include <linux/smp.h> 15#include <linux/smp.h>
16#include <linux/topology.h>
16#include <linux/ktime.h> 17#include <linux/ktime.h>
17#include <linux/sched.h> 18#include <linux/sched.h>
18#include <linux/uidgid.h> 19#include <linux/uidgid.h>
@@ -92,6 +93,17 @@ const struct bpf_func_proto bpf_get_smp_processor_id_proto = {
92 .ret_type = RET_INTEGER, 93 .ret_type = RET_INTEGER,
93}; 94};
94 95
96BPF_CALL_0(bpf_get_numa_node_id)
97{
98 return numa_node_id();
99}
100
101const struct bpf_func_proto bpf_get_numa_node_id_proto = {
102 .func = bpf_get_numa_node_id,
103 .gpl_only = false,
104 .ret_type = RET_INTEGER,
105};
106
95BPF_CALL_0(bpf_ktime_get_ns) 107BPF_CALL_0(bpf_ktime_get_ns)
96{ 108{
97 /* NMI safe access to clock monotonic */ 109 /* NMI safe access to clock monotonic */
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 5dcb99281259..fa77311dadb2 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -422,6 +422,8 @@ static const struct bpf_func_proto *tracing_func_proto(enum bpf_func_id func_id)
422 return bpf_get_trace_printk_proto(); 422 return bpf_get_trace_printk_proto();
423 case BPF_FUNC_get_smp_processor_id: 423 case BPF_FUNC_get_smp_processor_id:
424 return &bpf_get_smp_processor_id_proto; 424 return &bpf_get_smp_processor_id_proto;
425 case BPF_FUNC_get_numa_node_id:
426 return &bpf_get_numa_node_id_proto;
425 case BPF_FUNC_perf_event_read: 427 case BPF_FUNC_perf_event_read:
426 return &bpf_perf_event_read_proto; 428 return &bpf_perf_event_read_proto;
427 case BPF_FUNC_probe_write_user: 429 case BPF_FUNC_probe_write_user:
diff --git a/net/core/filter.c b/net/core/filter.c
index 00351cdf7d0c..cd9e2ba66b0e 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -2492,6 +2492,8 @@ sk_filter_func_proto(enum bpf_func_id func_id)
2492 return &bpf_get_prandom_u32_proto; 2492 return &bpf_get_prandom_u32_proto;
2493 case BPF_FUNC_get_smp_processor_id: 2493 case BPF_FUNC_get_smp_processor_id:
2494 return &bpf_get_raw_smp_processor_id_proto; 2494 return &bpf_get_raw_smp_processor_id_proto;
2495 case BPF_FUNC_get_numa_node_id:
2496 return &bpf_get_numa_node_id_proto;
2495 case BPF_FUNC_tail_call: 2497 case BPF_FUNC_tail_call:
2496 return &bpf_tail_call_proto; 2498 return &bpf_tail_call_proto;
2497 case BPF_FUNC_ktime_get_ns: 2499 case BPF_FUNC_ktime_get_ns: