BACKPORT: bpf: add bpf_ktime_get_boot_ns()
On a device like a cellphone which is constantly suspending and resuming CLOCK_MONOTONIC is not particularly useful for keeping track of or reacting to external network events. Instead you want to use CLOCK_BOOTTIME. Hence add bpf_ktime_get_boot_ns() as a mirror of bpf_ktime_get_ns() based around CLOCK_BOOTTIME instead of CLOCK_MONOTONIC. Signed-off-by: Maciej Żenczykowski <maze@google.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> (cherry picked from commit 71d19214776e61b33da48f7c1b46e522c7f78221) Change-Id: Ifd62c410dcc5112fd1a473a7e1f70231ca514bc0
This commit is contained in:
parent
2d04a808c6
commit
0934349866
@ -108,6 +108,8 @@ lirc_mode2_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
|
|||||||
return &bpf_map_peek_elem_proto;
|
return &bpf_map_peek_elem_proto;
|
||||||
case BPF_FUNC_ktime_get_ns:
|
case BPF_FUNC_ktime_get_ns:
|
||||||
return &bpf_ktime_get_ns_proto;
|
return &bpf_ktime_get_ns_proto;
|
||||||
|
case BPF_FUNC_ktime_get_boot_ns:
|
||||||
|
return &bpf_ktime_get_boot_ns_proto;
|
||||||
case BPF_FUNC_tail_call:
|
case BPF_FUNC_tail_call:
|
||||||
return &bpf_tail_call_proto;
|
return &bpf_tail_call_proto;
|
||||||
case BPF_FUNC_get_prandom_u32:
|
case BPF_FUNC_get_prandom_u32:
|
||||||
|
@ -1046,6 +1046,7 @@ extern const struct bpf_func_proto bpf_get_smp_processor_id_proto;
|
|||||||
extern const struct bpf_func_proto bpf_get_numa_node_id_proto;
|
extern const struct bpf_func_proto bpf_get_numa_node_id_proto;
|
||||||
extern const struct bpf_func_proto bpf_tail_call_proto;
|
extern const struct bpf_func_proto bpf_tail_call_proto;
|
||||||
extern const struct bpf_func_proto bpf_ktime_get_ns_proto;
|
extern const struct bpf_func_proto bpf_ktime_get_ns_proto;
|
||||||
|
extern const struct bpf_func_proto bpf_ktime_get_boot_ns_proto;
|
||||||
extern const struct bpf_func_proto bpf_get_current_pid_tgid_proto;
|
extern const struct bpf_func_proto bpf_get_current_pid_tgid_proto;
|
||||||
extern const struct bpf_func_proto bpf_get_current_uid_gid_proto;
|
extern const struct bpf_func_proto bpf_get_current_uid_gid_proto;
|
||||||
extern const struct bpf_func_proto bpf_get_current_comm_proto;
|
extern const struct bpf_func_proto bpf_get_current_comm_proto;
|
||||||
|
@ -570,6 +570,8 @@ union bpf_attr {
|
|||||||
* u64 bpf_ktime_get_ns(void)
|
* u64 bpf_ktime_get_ns(void)
|
||||||
* Description
|
* Description
|
||||||
* Return the time elapsed since system boot, in nanoseconds.
|
* Return the time elapsed since system boot, in nanoseconds.
|
||||||
|
* Does not include time the system was suspended.
|
||||||
|
* See: clock_gettime(CLOCK_MONOTONIC)
|
||||||
* Return
|
* Return
|
||||||
* Current *ktime*.
|
* Current *ktime*.
|
||||||
*
|
*
|
||||||
@ -2750,6 +2752,14 @@ union bpf_attr {
|
|||||||
* **-EOPNOTSUPP** kernel configuration does not enable SYN cookies
|
* **-EOPNOTSUPP** kernel configuration does not enable SYN cookies
|
||||||
*
|
*
|
||||||
* **-EPROTONOSUPPORT** IP packet version is not 4 or 6
|
* **-EPROTONOSUPPORT** IP packet version is not 4 or 6
|
||||||
|
*
|
||||||
|
* u64 bpf_ktime_get_boot_ns(void)
|
||||||
|
* Description
|
||||||
|
* Return the time elapsed since system boot, in nanoseconds.
|
||||||
|
* Does include the time the system was suspended.
|
||||||
|
* See: clock_gettime(CLOCK_BOOTTIME)
|
||||||
|
* Return
|
||||||
|
* Current *ktime*.
|
||||||
*/
|
*/
|
||||||
#define __BPF_FUNC_MAPPER(FN) \
|
#define __BPF_FUNC_MAPPER(FN) \
|
||||||
FN(unspec), \
|
FN(unspec), \
|
||||||
@ -2862,7 +2872,22 @@ union bpf_attr {
|
|||||||
FN(sk_storage_get), \
|
FN(sk_storage_get), \
|
||||||
FN(sk_storage_delete), \
|
FN(sk_storage_delete), \
|
||||||
FN(send_signal), \
|
FN(send_signal), \
|
||||||
FN(tcp_gen_syncookie),
|
FN(tcp_gen_syncookie), \
|
||||||
|
FN(skb_output), \
|
||||||
|
FN(probe_read_user), \
|
||||||
|
FN(probe_read_kernel), \
|
||||||
|
FN(probe_read_user_str), \
|
||||||
|
FN(probe_read_kernel_str), \
|
||||||
|
FN(tcp_send_ack), \
|
||||||
|
FN(send_signal_thread), \
|
||||||
|
FN(jiffies64), \
|
||||||
|
FN(read_branch_records), \
|
||||||
|
FN(get_ns_current_pid_tgid), \
|
||||||
|
FN(xdp_output), \
|
||||||
|
FN(get_netns_cookie), \
|
||||||
|
FN(get_current_ancestor_cgroup_id), \
|
||||||
|
FN(sk_assign), \
|
||||||
|
FN(ktime_get_boot_ns),
|
||||||
|
|
||||||
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
|
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
|
||||||
* function eBPF program intends to call
|
* function eBPF program intends to call
|
||||||
|
@ -2045,6 +2045,7 @@ const struct bpf_func_proto bpf_get_prandom_u32_proto __weak;
|
|||||||
const struct bpf_func_proto bpf_get_smp_processor_id_proto __weak;
|
const struct bpf_func_proto bpf_get_smp_processor_id_proto __weak;
|
||||||
const struct bpf_func_proto bpf_get_numa_node_id_proto __weak;
|
const struct bpf_func_proto bpf_get_numa_node_id_proto __weak;
|
||||||
const struct bpf_func_proto bpf_ktime_get_ns_proto __weak;
|
const struct bpf_func_proto bpf_ktime_get_ns_proto __weak;
|
||||||
|
const struct bpf_func_proto bpf_ktime_get_boot_ns_proto __weak;
|
||||||
|
|
||||||
const struct bpf_func_proto bpf_get_current_pid_tgid_proto __weak;
|
const struct bpf_func_proto bpf_get_current_pid_tgid_proto __weak;
|
||||||
const struct bpf_func_proto bpf_get_current_uid_gid_proto __weak;
|
const struct bpf_func_proto bpf_get_current_uid_gid_proto __weak;
|
||||||
|
@ -152,6 +152,18 @@ const struct bpf_func_proto bpf_ktime_get_ns_proto = {
|
|||||||
.ret_type = RET_INTEGER,
|
.ret_type = RET_INTEGER,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
BPF_CALL_0(bpf_ktime_get_boot_ns)
|
||||||
|
{
|
||||||
|
/* NMI safe access to clock boottime */
|
||||||
|
return ktime_get_boot_fast_ns();
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct bpf_func_proto bpf_ktime_get_boot_ns_proto = {
|
||||||
|
.func = bpf_ktime_get_boot_ns,
|
||||||
|
.gpl_only = false,
|
||||||
|
.ret_type = RET_INTEGER,
|
||||||
|
};
|
||||||
|
|
||||||
BPF_CALL_0(bpf_get_current_pid_tgid)
|
BPF_CALL_0(bpf_get_current_pid_tgid)
|
||||||
{
|
{
|
||||||
struct task_struct *task = current;
|
struct task_struct *task = current;
|
||||||
|
@ -701,6 +701,8 @@ tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
|
|||||||
return &bpf_probe_read_proto;
|
return &bpf_probe_read_proto;
|
||||||
case BPF_FUNC_ktime_get_ns:
|
case BPF_FUNC_ktime_get_ns:
|
||||||
return &bpf_ktime_get_ns_proto;
|
return &bpf_ktime_get_ns_proto;
|
||||||
|
case BPF_FUNC_ktime_get_boot_ns:
|
||||||
|
return &bpf_ktime_get_boot_ns_proto;
|
||||||
case BPF_FUNC_tail_call:
|
case BPF_FUNC_tail_call:
|
||||||
return &bpf_tail_call_proto;
|
return &bpf_tail_call_proto;
|
||||||
case BPF_FUNC_get_current_pid_tgid:
|
case BPF_FUNC_get_current_pid_tgid:
|
||||||
|
@ -5996,6 +5996,8 @@ bpf_base_func_proto(enum bpf_func_id func_id)
|
|||||||
return &bpf_tail_call_proto;
|
return &bpf_tail_call_proto;
|
||||||
case BPF_FUNC_ktime_get_ns:
|
case BPF_FUNC_ktime_get_ns:
|
||||||
return &bpf_ktime_get_ns_proto;
|
return &bpf_ktime_get_ns_proto;
|
||||||
|
case BPF_FUNC_ktime_get_boot_ns:
|
||||||
|
return &bpf_ktime_get_boot_ns_proto;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -570,6 +570,8 @@ union bpf_attr {
|
|||||||
* u64 bpf_ktime_get_ns(void)
|
* u64 bpf_ktime_get_ns(void)
|
||||||
* Description
|
* Description
|
||||||
* Return the time elapsed since system boot, in nanoseconds.
|
* Return the time elapsed since system boot, in nanoseconds.
|
||||||
|
* Does not include time the system was suspended.
|
||||||
|
* See: clock_gettime(CLOCK_MONOTONIC)
|
||||||
* Return
|
* Return
|
||||||
* Current *ktime*.
|
* Current *ktime*.
|
||||||
*
|
*
|
||||||
@ -2750,6 +2752,14 @@ union bpf_attr {
|
|||||||
* **-EOPNOTSUPP** kernel configuration does not enable SYN cookies
|
* **-EOPNOTSUPP** kernel configuration does not enable SYN cookies
|
||||||
*
|
*
|
||||||
* **-EPROTONOSUPPORT** IP packet version is not 4 or 6
|
* **-EPROTONOSUPPORT** IP packet version is not 4 or 6
|
||||||
|
*
|
||||||
|
* u64 bpf_ktime_get_boot_ns(void)
|
||||||
|
* Description
|
||||||
|
* Return the time elapsed since system boot, in nanoseconds.
|
||||||
|
* Does include the time the system was suspended.
|
||||||
|
* See: clock_gettime(CLOCK_BOOTTIME)
|
||||||
|
* Return
|
||||||
|
* Current *ktime*.
|
||||||
*/
|
*/
|
||||||
#define __BPF_FUNC_MAPPER(FN) \
|
#define __BPF_FUNC_MAPPER(FN) \
|
||||||
FN(unspec), \
|
FN(unspec), \
|
||||||
@ -2862,7 +2872,22 @@ union bpf_attr {
|
|||||||
FN(sk_storage_get), \
|
FN(sk_storage_get), \
|
||||||
FN(sk_storage_delete), \
|
FN(sk_storage_delete), \
|
||||||
FN(send_signal), \
|
FN(send_signal), \
|
||||||
FN(tcp_gen_syncookie),
|
FN(tcp_gen_syncookie), \
|
||||||
|
FN(skb_output), \
|
||||||
|
FN(probe_read_user), \
|
||||||
|
FN(probe_read_kernel), \
|
||||||
|
FN(probe_read_user_str), \
|
||||||
|
FN(probe_read_kernel_str), \
|
||||||
|
FN(tcp_send_ack), \
|
||||||
|
FN(send_signal_thread), \
|
||||||
|
FN(jiffies64), \
|
||||||
|
FN(read_branch_records), \
|
||||||
|
FN(get_ns_current_pid_tgid), \
|
||||||
|
FN(xdp_output), \
|
||||||
|
FN(get_netns_cookie), \
|
||||||
|
FN(get_current_ancestor_cgroup_id), \
|
||||||
|
FN(sk_assign), \
|
||||||
|
FN(ktime_get_boot_ns),
|
||||||
|
|
||||||
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
|
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
|
||||||
* function eBPF program intends to call
|
* function eBPF program intends to call
|
||||||
|
Loading…
Reference in New Issue
Block a user