Skip to content

Commit d6247ec

Browse files
Byte-Labborkmann
authored andcommitted
bpf: Add ability to pin bpf timer to calling CPU
BPF supports creating high resolution timers using bpf_timer_* helper functions. Currently, only the BPF_F_TIMER_ABS flag is supported, which specifies that the timeout should be interpreted as absolute time. It would also be useful to be able to pin that timer to a core. For example, if you wanted to make a subset of cores run without timer interrupts, and only have the timer be invoked on a single core. This patch adds support for this with a new BPF_F_TIMER_CPU_PIN flag. When specified, the HRTIMER_MODE_PINNED flag is passed to hrtimer_start(). A subsequent patch will update selftests to validate. Signed-off-by: David Vernet <void@manifault.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Song Liu <song@kernel.org> Acked-by: Hou Tao <houtao1@huawei.com> Link: https://lore.kernel.org/bpf/20231004162339.200702-2-void@manifault.com
1 parent 84cb9cb commit d6247ec

3 files changed

Lines changed: 12 additions & 1 deletion

File tree

include/uapi/linux/bpf.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5096,6 +5096,8 @@ union bpf_attr {
50965096
* **BPF_F_TIMER_ABS**
50975097
* Start the timer in absolute expire value instead of the
50985098
* default relative one.
5099+
* **BPF_F_TIMER_CPU_PIN**
5100+
* Timer will be pinned to the CPU of the caller.
50995101
*
51005102
* Return
51015103
* 0 on success.
@@ -7309,9 +7311,11 @@ struct bpf_core_relo {
73097311
* Flags to control bpf_timer_start() behaviour.
73107312
* - BPF_F_TIMER_ABS: Timeout passed is absolute time, by default it is
73117313
* relative to current time.
7314+
* - BPF_F_TIMER_CPU_PIN: Timer will be pinned to the CPU of the caller.
73127315
*/
73137316
enum {
73147317
BPF_F_TIMER_ABS = (1ULL << 0),
7318+
BPF_F_TIMER_CPU_PIN = (1ULL << 1),
73157319
};
73167320

73177321
/* BPF numbers iterator state */

kernel/bpf/helpers.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1272,7 +1272,7 @@ BPF_CALL_3(bpf_timer_start, struct bpf_timer_kern *, timer, u64, nsecs, u64, fla
12721272

12731273
if (in_nmi())
12741274
return -EOPNOTSUPP;
1275-
if (flags > BPF_F_TIMER_ABS)
1275+
if (flags & ~(BPF_F_TIMER_ABS | BPF_F_TIMER_CPU_PIN))
12761276
return -EINVAL;
12771277
__bpf_spin_lock_irqsave(&timer->lock);
12781278
t = timer->timer;
@@ -1286,6 +1286,9 @@ BPF_CALL_3(bpf_timer_start, struct bpf_timer_kern *, timer, u64, nsecs, u64, fla
12861286
else
12871287
mode = HRTIMER_MODE_REL_SOFT;
12881288

1289+
if (flags & BPF_F_TIMER_CPU_PIN)
1290+
mode |= HRTIMER_MODE_PINNED;
1291+
12891292
hrtimer_start(&t->timer, ns_to_ktime(nsecs), mode);
12901293
out:
12911294
__bpf_spin_unlock_irqrestore(&timer->lock);

tools/include/uapi/linux/bpf.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5096,6 +5096,8 @@ union bpf_attr {
50965096
* **BPF_F_TIMER_ABS**
50975097
* Start the timer in absolute expire value instead of the
50985098
* default relative one.
5099+
* **BPF_F_TIMER_CPU_PIN**
5100+
* Timer will be pinned to the CPU of the caller.
50995101
*
51005102
* Return
51015103
* 0 on success.
@@ -7309,9 +7311,11 @@ struct bpf_core_relo {
73097311
* Flags to control bpf_timer_start() behaviour.
73107312
* - BPF_F_TIMER_ABS: Timeout passed is absolute time, by default it is
73117313
* relative to current time.
7314+
* - BPF_F_TIMER_CPU_PIN: Timer will be pinned to the CPU of the caller.
73127315
*/
73137316
enum {
73147317
BPF_F_TIMER_ABS = (1ULL << 0),
7318+
BPF_F_TIMER_CPU_PIN = (1ULL << 1),
73157319
};
73167320

73177321
/* BPF numbers iterator state */

0 commit comments

Comments
 (0)