Merge Official Source
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
cc840cb819
@ -9,6 +9,7 @@ fs.protected_hardlinks=1
|
||||
fs.protected_symlinks=1
|
||||
|
||||
net.core.bpf_jit_enable=1
|
||||
net.core.bpf_jit_kallsyms=1
|
||||
|
||||
net.ipv4.conf.default.arp_ignore=1
|
||||
net.ipv4.conf.all.arp_ignore=1
|
||||
|
||||
63
package/devel/kselftests-bpf/Makefile
Normal file
63
package/devel/kselftests-bpf/Makefile
Normal file
@ -0,0 +1,63 @@
|
||||
#
|
||||
# Copyright (C) 2021 Tony Ambardar <itugrok@yahoo.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=kselftests-bpf
|
||||
PKG_VERSION:=$(LINUX_VERSION)
|
||||
PKG_RELEASE:=1
|
||||
PKG_MAINTAINER:=Tony Ambardar <itugrok@yahoo.com>
|
||||
|
||||
PKG_BUILD_FLAGS:=gc-sections lto
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
PKG_FLAGS:=nonshared
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
include $(INCLUDE_DIR)/nls.mk
|
||||
|
||||
define Package/kselftests-bpf
|
||||
SECTION:=devel
|
||||
CATEGORY:=Development
|
||||
DEPENDS:= +libelf +zlib +libpthread +librt @!IN_SDK \
|
||||
@KERNEL_DEBUG_FS @KERNEL_DEBUG_INFO_BTF @KERNEL_BPF_EVENTS
|
||||
TITLE:=Linux Kernel Selftests (BPF)
|
||||
URL:=http://www.kernel.org
|
||||
endef
|
||||
|
||||
define Package/kselftests-bpf/description
|
||||
kselftests-bpf is the Linux kernel BPF test suite
|
||||
endef
|
||||
|
||||
TEST_TARGET = test_verifier
|
||||
|
||||
MAKE_PATH:=tools/testing/selftests/bpf
|
||||
|
||||
MAKE_VARS = \
|
||||
ARCH="$(LINUX_KARCH)" \
|
||||
CROSS_COMPILE="$(TARGET_CROSS)" \
|
||||
SAN_CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
|
||||
LDLIBS="$(TARGET_LDFLAGS)" \
|
||||
TOOLCHAIN_INCLUDE="$(TOOLCHAIN_DIR)/include" \
|
||||
VMLINUX_BTF="$(LINUX_DIR)/vmlinux"
|
||||
|
||||
MAKE_FLAGS = \
|
||||
$(if $(findstring c,$(OPENWRT_VERBOSE)),V=1,V='') \
|
||||
O=$(PKG_BUILD_DIR)
|
||||
|
||||
define Build/Compile
|
||||
+$(MAKE_VARS) \
|
||||
$(MAKE) $(PKG_JOBS) -C $(LINUX_DIR)/$(MAKE_PATH) \
|
||||
$(MAKE_FLAGS) $(TEST_TARGET) ;
|
||||
endef
|
||||
|
||||
define Package/kselftests-bpf/install
|
||||
$(INSTALL_DIR) $(1)/usr/bin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(TEST_TARGET) $(1)/usr/bin/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,kselftests-bpf))
|
||||
@ -0,0 +1,123 @@
|
||||
From 5287acc6f097c0c18e54401b611a877a3083b68c Mon Sep 17 00:00:00 2001
|
||||
From: Martin KaFai Lau <kafai@fb.com>
|
||||
Date: Wed, 16 Mar 2022 10:38:23 -0700
|
||||
Subject: [PATCH 1/3] bpf: selftests: Add helpers to directly use the capget
|
||||
and capset syscall
|
||||
|
||||
After upgrading to the newer libcap (>= 2.60),
|
||||
the libcap commit aca076443591 ("Make cap_t operations thread safe.")
|
||||
added a "__u8 mutex;" to the "struct _cap_struct". It caused a few byte
|
||||
shift that breaks the assumption made in the "struct libcap" definition
|
||||
in test_verifier.c.
|
||||
|
||||
The bpf selftest usage only needs to enable and disable the effective
|
||||
caps of the running task. It is easier to directly syscall the
|
||||
capget and capset instead. It can also remove the libcap
|
||||
library dependency.
|
||||
|
||||
The cap_helpers.{c,h} is added. One __u64 is used for all CAP_*
|
||||
bits instead of two __u32.
|
||||
|
||||
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
|
||||
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
|
||||
Acked-by: John Fastabend <john.fastabend@gmail.com>
|
||||
Link: https://lore.kernel.org/bpf/20220316173823.2036955-1-kafai@fb.com
|
||||
---
|
||||
tools/testing/selftests/bpf/cap_helpers.c | 67 +++++++++++++++++++++++
|
||||
tools/testing/selftests/bpf/cap_helpers.h | 19 +++++++
|
||||
2 files changed, 86 insertions(+)
|
||||
create mode 100644 tools/testing/selftests/bpf/cap_helpers.c
|
||||
create mode 100644 tools/testing/selftests/bpf/cap_helpers.h
|
||||
|
||||
--- /dev/null
|
||||
+++ b/tools/testing/selftests/bpf/cap_helpers.c
|
||||
@@ -0,0 +1,67 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+#include "cap_helpers.h"
|
||||
+
|
||||
+/* Avoid including <sys/capability.h> from the libcap-devel package,
|
||||
+ * so directly declare them here and use them from glibc.
|
||||
+ */
|
||||
+int capget(cap_user_header_t header, cap_user_data_t data);
|
||||
+int capset(cap_user_header_t header, const cap_user_data_t data);
|
||||
+
|
||||
+int cap_enable_effective(__u64 caps, __u64 *old_caps)
|
||||
+{
|
||||
+ struct __user_cap_data_struct data[_LINUX_CAPABILITY_U32S_3];
|
||||
+ struct __user_cap_header_struct hdr = {
|
||||
+ .version = _LINUX_CAPABILITY_VERSION_3,
|
||||
+ };
|
||||
+ __u32 cap0 = caps;
|
||||
+ __u32 cap1 = caps >> 32;
|
||||
+ int err;
|
||||
+
|
||||
+ err = capget(&hdr, data);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ if (old_caps)
|
||||
+ *old_caps = (__u64)(data[1].effective) << 32 | data[0].effective;
|
||||
+
|
||||
+ if ((data[0].effective & cap0) == cap0 &&
|
||||
+ (data[1].effective & cap1) == cap1)
|
||||
+ return 0;
|
||||
+
|
||||
+ data[0].effective |= cap0;
|
||||
+ data[1].effective |= cap1;
|
||||
+ err = capset(&hdr, data);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int cap_disable_effective(__u64 caps, __u64 *old_caps)
|
||||
+{
|
||||
+ struct __user_cap_data_struct data[_LINUX_CAPABILITY_U32S_3];
|
||||
+ struct __user_cap_header_struct hdr = {
|
||||
+ .version = _LINUX_CAPABILITY_VERSION_3,
|
||||
+ };
|
||||
+ __u32 cap0 = caps;
|
||||
+ __u32 cap1 = caps >> 32;
|
||||
+ int err;
|
||||
+
|
||||
+ err = capget(&hdr, data);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ if (old_caps)
|
||||
+ *old_caps = (__u64)(data[1].effective) << 32 | data[0].effective;
|
||||
+
|
||||
+ if (!(data[0].effective & cap0) && !(data[1].effective & cap1))
|
||||
+ return 0;
|
||||
+
|
||||
+ data[0].effective &= ~cap0;
|
||||
+ data[1].effective &= ~cap1;
|
||||
+ err = capset(&hdr, data);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
--- /dev/null
|
||||
+++ b/tools/testing/selftests/bpf/cap_helpers.h
|
||||
@@ -0,0 +1,19 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 */
|
||||
+#ifndef __CAP_HELPERS_H
|
||||
+#define __CAP_HELPERS_H
|
||||
+
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/capability.h>
|
||||
+
|
||||
+#ifndef CAP_PERFMON
|
||||
+#define CAP_PERFMON 38
|
||||
+#endif
|
||||
+
|
||||
+#ifndef CAP_BPF
|
||||
+#define CAP_BPF 39
|
||||
+#endif
|
||||
+
|
||||
+int cap_enable_effective(__u64 caps, __u64 *old_caps);
|
||||
+int cap_disable_effective(__u64 caps, __u64 *old_caps);
|
||||
+
|
||||
+#endif
|
||||
@ -0,0 +1,188 @@
|
||||
From 847a6b7ee906be874f0cae279c8de902a7d3f092 Mon Sep 17 00:00:00 2001
|
||||
From: Martin KaFai Lau <kafai@fb.com>
|
||||
Date: Wed, 16 Mar 2022 10:38:29 -0700
|
||||
Subject: [PATCH 2/3] bpf: selftests: Remove libcap usage from test_verifier
|
||||
|
||||
This patch removes the libcap usage from test_verifier.
|
||||
The cap_*_effective() helpers added in the earlier patch are
|
||||
used instead.
|
||||
|
||||
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
|
||||
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
|
||||
Acked-by: John Fastabend <john.fastabend@gmail.com>
|
||||
Link: https://lore.kernel.org/bpf/20220316173829.2038682-1-kafai@fb.com
|
||||
---
|
||||
tools/testing/selftests/bpf/Makefile | 31 +++++---
|
||||
tools/testing/selftests/bpf/test_verifier.c | 88 ++++++---------------
|
||||
2 files changed, 46 insertions(+), 73 deletions(-)
|
||||
|
||||
--- a/tools/testing/selftests/bpf/Makefile
|
||||
+++ b/tools/testing/selftests/bpf/Makefile
|
||||
@@ -189,16 +189,27 @@ TEST_GEN_PROGS_EXTENDED += $(DEFAULT_BPF
|
||||
|
||||
$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(BPFOBJ)
|
||||
|
||||
-$(OUTPUT)/test_dev_cgroup: cgroup_helpers.c
|
||||
-$(OUTPUT)/test_skb_cgroup_id_user: cgroup_helpers.c
|
||||
-$(OUTPUT)/test_sock: cgroup_helpers.c
|
||||
-$(OUTPUT)/test_sock_addr: cgroup_helpers.c
|
||||
-$(OUTPUT)/test_sockmap: cgroup_helpers.c
|
||||
-$(OUTPUT)/test_tcpnotify_user: cgroup_helpers.c trace_helpers.c
|
||||
-$(OUTPUT)/get_cgroup_id_user: cgroup_helpers.c
|
||||
-$(OUTPUT)/test_cgroup_storage: cgroup_helpers.c
|
||||
-$(OUTPUT)/test_sock_fields: cgroup_helpers.c
|
||||
-$(OUTPUT)/test_sysctl: cgroup_helpers.c
|
||||
+CGROUP_HELPERS := $(OUTPUT)/cgroup_helpers.o
|
||||
+TESTING_HELPERS := $(OUTPUT)/testing_helpers.o
|
||||
+TRACE_HELPERS := $(OUTPUT)/trace_helpers.o
|
||||
+CAP_HELPERS := $(OUTPUT)/cap_helpers.o
|
||||
+
|
||||
+$(OUTPUT)/test_dev_cgroup: $(CGROUP_HELPERS) $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_skb_cgroup_id_user: $(CGROUP_HELPERS) $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_sock: $(CGROUP_HELPERS) $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_sock_addr: $(CGROUP_HELPERS) $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_sockmap: $(CGROUP_HELPERS) $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_tcpnotify_user: $(CGROUP_HELPERS) $(TESTING_HELPERS) $(TRACE_HELPERS)
|
||||
+$(OUTPUT)/get_cgroup_id_user: $(CGROUP_HELPERS) $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_cgroup_storage: $(CGROUP_HELPERS) $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_sock_fields: $(CGROUP_HELPERS) $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_sysctl: $(CGROUP_HELPERS) $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_tag: $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_lirc_mode2_user: $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/xdping: $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/flow_dissector_load: $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_maps: $(TESTING_HELPERS)
|
||||
+$(OUTPUT)/test_verifier: $(TESTING_HELPERS) $(CAP_HELPERS)
|
||||
|
||||
BPFTOOL ?= $(DEFAULT_BPFTOOL)
|
||||
$(DEFAULT_BPFTOOL): $(wildcard $(BPFTOOLDIR)/*.[ch] $(BPFTOOLDIR)/Makefile) \
|
||||
--- a/tools/testing/selftests/bpf/test_verifier.c
|
||||
+++ b/tools/testing/selftests/bpf/test_verifier.c
|
||||
@@ -22,8 +22,6 @@
|
||||
#include <limits.h>
|
||||
#include <assert.h>
|
||||
|
||||
-#include <sys/capability.h>
|
||||
-
|
||||
#include <linux/unistd.h>
|
||||
#include <linux/filter.h>
|
||||
#include <linux/bpf_perf_event.h>
|
||||
@@ -43,6 +41,7 @@
|
||||
# endif
|
||||
#endif
|
||||
#include "bpf_rlimit.h"
|
||||
+#include "cap_helpers.h"
|
||||
#include "bpf_rand.h"
|
||||
#include "bpf_util.h"
|
||||
#include "test_btf.h"
|
||||
@@ -59,6 +58,10 @@
|
||||
#define F_NEEDS_EFFICIENT_UNALIGNED_ACCESS (1 << 0)
|
||||
#define F_LOAD_WITH_STRICT_ALIGNMENT (1 << 1)
|
||||
|
||||
+/* need CAP_BPF, CAP_NET_ADMIN, CAP_PERFMON to load progs */
|
||||
+#define ADMIN_CAPS (1ULL << CAP_NET_ADMIN | \
|
||||
+ 1ULL << CAP_PERFMON | \
|
||||
+ 1ULL << CAP_BPF)
|
||||
#define UNPRIV_SYSCTL "kernel/unprivileged_bpf_disabled"
|
||||
static bool unpriv_disabled = false;
|
||||
static int skips;
|
||||
@@ -940,47 +943,19 @@ struct libcap {
|
||||
|
||||
static int set_admin(bool admin)
|
||||
{
|
||||
- cap_t caps;
|
||||
- /* need CAP_BPF, CAP_NET_ADMIN, CAP_PERFMON to load progs */
|
||||
- const cap_value_t cap_net_admin = CAP_NET_ADMIN;
|
||||
- const cap_value_t cap_sys_admin = CAP_SYS_ADMIN;
|
||||
- struct libcap *cap;
|
||||
- int ret = -1;
|
||||
-
|
||||
- caps = cap_get_proc();
|
||||
- if (!caps) {
|
||||
- perror("cap_get_proc");
|
||||
- return -1;
|
||||
- }
|
||||
- cap = (struct libcap *)caps;
|
||||
- if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_sys_admin, CAP_CLEAR)) {
|
||||
- perror("cap_set_flag clear admin");
|
||||
- goto out;
|
||||
- }
|
||||
- if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_net_admin,
|
||||
- admin ? CAP_SET : CAP_CLEAR)) {
|
||||
- perror("cap_set_flag set_or_clear net");
|
||||
- goto out;
|
||||
- }
|
||||
- /* libcap is likely old and simply ignores CAP_BPF and CAP_PERFMON,
|
||||
- * so update effective bits manually
|
||||
- */
|
||||
+ int err;
|
||||
+
|
||||
if (admin) {
|
||||
- cap->data[1].effective |= 1 << (38 /* CAP_PERFMON */ - 32);
|
||||
- cap->data[1].effective |= 1 << (39 /* CAP_BPF */ - 32);
|
||||
+ err = cap_enable_effective(ADMIN_CAPS, NULL);
|
||||
+ if (err)
|
||||
+ perror("cap_enable_effective(ADMIN_CAPS)");
|
||||
} else {
|
||||
- cap->data[1].effective &= ~(1 << (38 - 32));
|
||||
- cap->data[1].effective &= ~(1 << (39 - 32));
|
||||
+ err = cap_disable_effective(ADMIN_CAPS, NULL);
|
||||
+ if (err)
|
||||
+ perror("cap_disable_effective(ADMIN_CAPS)");
|
||||
}
|
||||
- if (cap_set_proc(caps)) {
|
||||
- perror("cap_set_proc");
|
||||
- goto out;
|
||||
- }
|
||||
- ret = 0;
|
||||
-out:
|
||||
- if (cap_free(caps))
|
||||
- perror("cap_free");
|
||||
- return ret;
|
||||
+
|
||||
+ return err;
|
||||
}
|
||||
|
||||
static int do_prog_test_run(int fd_prog, bool unpriv, uint32_t expected_val,
|
||||
@@ -1246,31 +1221,18 @@ fail_log:
|
||||
|
||||
static bool is_admin(void)
|
||||
{
|
||||
- cap_flag_value_t net_priv = CAP_CLEAR;
|
||||
- bool perfmon_priv = false;
|
||||
- bool bpf_priv = false;
|
||||
- struct libcap *cap;
|
||||
- cap_t caps;
|
||||
-
|
||||
-#ifdef CAP_IS_SUPPORTED
|
||||
- if (!CAP_IS_SUPPORTED(CAP_SETFCAP)) {
|
||||
- perror("cap_get_flag");
|
||||
- return false;
|
||||
- }
|
||||
-#endif
|
||||
- caps = cap_get_proc();
|
||||
- if (!caps) {
|
||||
- perror("cap_get_proc");
|
||||
+ __u64 caps;
|
||||
+
|
||||
+ /* The test checks for finer cap as CAP_NET_ADMIN,
|
||||
+ * CAP_PERFMON, and CAP_BPF instead of CAP_SYS_ADMIN.
|
||||
+ * Thus, disable CAP_SYS_ADMIN at the beginning.
|
||||
+ */
|
||||
+ if (cap_disable_effective(1ULL << CAP_SYS_ADMIN, &caps)) {
|
||||
+ perror("cap_disable_effective(CAP_SYS_ADMIN)");
|
||||
return false;
|
||||
}
|
||||
- cap = (struct libcap *)caps;
|
||||
- bpf_priv = cap->data[1].effective & (1 << (39/* CAP_BPF */ - 32));
|
||||
- perfmon_priv = cap->data[1].effective & (1 << (38/* CAP_PERFMON */ - 32));
|
||||
- if (cap_get_flag(caps, CAP_NET_ADMIN, CAP_EFFECTIVE, &net_priv))
|
||||
- perror("cap_get_flag NET");
|
||||
- if (cap_free(caps))
|
||||
- perror("cap_free");
|
||||
- return bpf_priv && perfmon_priv && net_priv == CAP_SET;
|
||||
+
|
||||
+ return (caps & ADMIN_CAPS) == ADMIN_CAPS;
|
||||
}
|
||||
|
||||
static void get_unpriv_disabled()
|
||||
@ -0,0 +1,122 @@
|
||||
From 1ac00fea13c576e2b13dabf9a72ad3034e3bb804 Mon Sep 17 00:00:00 2001
|
||||
From: Martin KaFai Lau <kafai@fb.com>
|
||||
Date: Wed, 16 Mar 2022 10:38:35 -0700
|
||||
Subject: [PATCH 3/3] bpf: selftests: Remove libcap usage from test_progs
|
||||
|
||||
This patch removes the libcap usage from test_progs.
|
||||
bind_perm.c is the only user. cap_*_effective() helpers added in the
|
||||
earlier patch are directly used instead.
|
||||
|
||||
No other selftest binary is using libcap, so '-lcap' is also removed
|
||||
from the Makefile.
|
||||
|
||||
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
|
||||
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
|
||||
Reviewed-by: Stanislav Fomichev <sdf@google.com>
|
||||
Acked-by: John Fastabend <john.fastabend@gmail.com>
|
||||
Link: https://lore.kernel.org/bpf/20220316173835.2039334-1-kafai@fb.com
|
||||
---
|
||||
tools/testing/selftests/bpf/Makefile | 5 ++-
|
||||
.../selftests/bpf/prog_tests/bind_perm.c | 44 ++++---------------
|
||||
2 files changed, 11 insertions(+), 38 deletions(-)
|
||||
|
||||
--- a/tools/testing/selftests/bpf/Makefile
|
||||
+++ b/tools/testing/selftests/bpf/Makefile
|
||||
@@ -26,7 +26,7 @@ CFLAGS += -g -O0 -rdynamic -Wall $(GENFL
|
||||
-I$(TOOLSINCDIR) -I$(APIDIR) -I$(OUTPUT) \
|
||||
-Dbpf_prog_load=bpf_prog_test_load \
|
||||
-Dbpf_load_program=bpf_test_load_program
|
||||
-LDLIBS += -lcap -lelf -lz -lrt -lpthread
|
||||
+LDLIBS += -lelf -lz -lrt -lpthread
|
||||
|
||||
# Silence some warnings when compiled with clang
|
||||
ifneq ($(LLVM),)
|
||||
@@ -471,7 +471,8 @@ TRUNNER_TESTS_DIR := prog_tests
|
||||
TRUNNER_BPF_PROGS_DIR := progs
|
||||
TRUNNER_EXTRA_SOURCES := test_progs.c cgroup_helpers.c trace_helpers.c \
|
||||
network_helpers.c testing_helpers.c \
|
||||
- btf_helpers.c flow_dissector_load.h
|
||||
+ btf_helpers.c flow_dissector_load.h \
|
||||
+ cap_helpers.c
|
||||
TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read $(OUTPUT)/bpf_testmod.ko \
|
||||
ima_setup.sh \
|
||||
$(wildcard progs/btf_dump_test_case_*.c)
|
||||
--- a/tools/testing/selftests/bpf/prog_tests/bind_perm.c
|
||||
+++ b/tools/testing/selftests/bpf/prog_tests/bind_perm.c
|
||||
@@ -4,9 +4,9 @@
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
-#include <sys/capability.h>
|
||||
|
||||
#include "test_progs.h"
|
||||
+#include "cap_helpers.h"
|
||||
#include "bind_perm.skel.h"
|
||||
|
||||
static int duration;
|
||||
@@ -49,41 +49,11 @@ close_socket:
|
||||
close(fd);
|
||||
}
|
||||
|
||||
-bool cap_net_bind_service(cap_flag_value_t flag)
|
||||
-{
|
||||
- const cap_value_t cap_net_bind_service = CAP_NET_BIND_SERVICE;
|
||||
- cap_flag_value_t original_value;
|
||||
- bool was_effective = false;
|
||||
- cap_t caps;
|
||||
-
|
||||
- caps = cap_get_proc();
|
||||
- if (CHECK(!caps, "cap_get_proc", "errno %d", errno))
|
||||
- goto free_caps;
|
||||
-
|
||||
- if (CHECK(cap_get_flag(caps, CAP_NET_BIND_SERVICE, CAP_EFFECTIVE,
|
||||
- &original_value),
|
||||
- "cap_get_flag", "errno %d", errno))
|
||||
- goto free_caps;
|
||||
-
|
||||
- was_effective = (original_value == CAP_SET);
|
||||
-
|
||||
- if (CHECK(cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_net_bind_service,
|
||||
- flag),
|
||||
- "cap_set_flag", "errno %d", errno))
|
||||
- goto free_caps;
|
||||
-
|
||||
- if (CHECK(cap_set_proc(caps), "cap_set_proc", "errno %d", errno))
|
||||
- goto free_caps;
|
||||
-
|
||||
-free_caps:
|
||||
- CHECK(cap_free(caps), "cap_free", "errno %d", errno);
|
||||
- return was_effective;
|
||||
-}
|
||||
-
|
||||
void test_bind_perm(void)
|
||||
{
|
||||
- bool cap_was_effective;
|
||||
+ const __u64 net_bind_svc_cap = 1ULL << CAP_NET_BIND_SERVICE;
|
||||
struct bind_perm *skel;
|
||||
+ __u64 old_caps = 0;
|
||||
int cgroup_fd;
|
||||
|
||||
if (create_netns())
|
||||
@@ -105,7 +75,8 @@ void test_bind_perm(void)
|
||||
if (!ASSERT_OK_PTR(skel, "bind_v6_prog"))
|
||||
goto close_skeleton;
|
||||
|
||||
- cap_was_effective = cap_net_bind_service(CAP_CLEAR);
|
||||
+ ASSERT_OK(cap_disable_effective(net_bind_svc_cap, &old_caps),
|
||||
+ "cap_disable_effective");
|
||||
|
||||
try_bind(AF_INET, 110, EACCES);
|
||||
try_bind(AF_INET6, 110, EACCES);
|
||||
@@ -113,8 +84,9 @@ void test_bind_perm(void)
|
||||
try_bind(AF_INET, 111, 0);
|
||||
try_bind(AF_INET6, 111, 0);
|
||||
|
||||
- if (cap_was_effective)
|
||||
- cap_net_bind_service(CAP_SET);
|
||||
+ if (old_caps & net_bind_svc_cap)
|
||||
+ ASSERT_OK(cap_enable_effective(net_bind_svc_cap, NULL),
|
||||
+ "cap_enable_effective");
|
||||
|
||||
close_skeleton:
|
||||
bind_perm__destroy(skel);
|
||||
@ -1611,8 +1611,8 @@ static int b53_switch_init(struct b53_device *dev)
|
||||
return b53_switch_reset(dev);
|
||||
}
|
||||
|
||||
struct b53_device *b53_switch_alloc(struct device *base, struct b53_io_ops *ops,
|
||||
void *priv)
|
||||
struct b53_device *b53_swconfig_switch_alloc(struct device *base, struct b53_io_ops *ops,
|
||||
void *priv)
|
||||
{
|
||||
struct b53_device *dev;
|
||||
|
||||
@ -1627,9 +1627,9 @@ struct b53_device *b53_switch_alloc(struct device *base, struct b53_io_ops *ops,
|
||||
|
||||
return dev;
|
||||
}
|
||||
EXPORT_SYMBOL(b53_switch_alloc);
|
||||
EXPORT_SYMBOL(b53_swconfig_switch_alloc);
|
||||
|
||||
int b53_switch_detect(struct b53_device *dev)
|
||||
int b53_swconfig_switch_detect(struct b53_device *dev)
|
||||
{
|
||||
u32 id32;
|
||||
u16 tmp;
|
||||
@ -1694,9 +1694,9 @@ int b53_switch_detect(struct b53_device *dev)
|
||||
return b53_read8(dev, B53_MGMT_PAGE, B53_REV_ID,
|
||||
&dev->core_rev);
|
||||
}
|
||||
EXPORT_SYMBOL(b53_switch_detect);
|
||||
EXPORT_SYMBOL(b53_swconfig_switch_detect);
|
||||
|
||||
int b53_switch_register(struct b53_device *dev)
|
||||
int b53_swconfig_switch_register(struct b53_device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -1706,7 +1706,7 @@ int b53_switch_register(struct b53_device *dev)
|
||||
dev->sw_dev.alias = dev->pdata->alias;
|
||||
}
|
||||
|
||||
if (!dev->chip_id && b53_switch_detect(dev))
|
||||
if (!dev->chip_id && b53_swconfig_switch_detect(dev))
|
||||
return -EINVAL;
|
||||
|
||||
ret = b53_switch_init(dev);
|
||||
@ -1717,7 +1717,7 @@ int b53_switch_register(struct b53_device *dev)
|
||||
|
||||
return register_switch(&dev->sw_dev, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(b53_switch_register);
|
||||
EXPORT_SYMBOL(b53_swconfig_switch_register);
|
||||
|
||||
MODULE_AUTHOR("Jonas Gorski <jogo@openwrt.org>");
|
||||
MODULE_DESCRIPTION("B53 switch library");
|
||||
|
||||
@ -280,7 +280,7 @@ static int b53_phy_probe(struct phy_device *phydev)
|
||||
if (phydev->mdio.addr != B53_PSEUDO_PHY && phydev->mdio.addr != 0)
|
||||
return -ENODEV;
|
||||
|
||||
dev = b53_switch_alloc(&phydev->mdio.dev, &b53_mdio_ops, phydev->mdio.bus);
|
||||
dev = b53_swconfig_switch_alloc(&phydev->mdio.dev, &b53_mdio_ops, phydev->mdio.bus);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -290,7 +290,7 @@ static int b53_phy_probe(struct phy_device *phydev)
|
||||
dev->pdata = NULL;
|
||||
mutex_init(&dev->reg_mutex);
|
||||
|
||||
ret = b53_switch_detect(dev);
|
||||
ret = b53_swconfig_switch_detect(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -302,7 +302,7 @@ static int b53_phy_probe(struct phy_device *phydev)
|
||||
|
||||
linkmode_copy(phydev->advertising, phydev->supported);
|
||||
|
||||
ret = b53_switch_register(dev);
|
||||
ret = b53_swconfig_switch_register(dev);
|
||||
if (ret) {
|
||||
dev_err(dev->dev, "failed to register switch: %i\n", ret);
|
||||
return ret;
|
||||
|
||||
@ -205,7 +205,7 @@ static int b53_mmap_probe(struct platform_device *pdev)
|
||||
if (!pdata)
|
||||
return -EINVAL;
|
||||
|
||||
dev = b53_switch_alloc(&pdev->dev, &b53_mmap_ops, pdata->regs);
|
||||
dev = b53_swconfig_switch_alloc(&pdev->dev, &b53_mmap_ops, pdata->regs);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -214,7 +214,7 @@ static int b53_mmap_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
||||
return b53_switch_register(dev);
|
||||
return b53_swconfig_switch_register(dev);
|
||||
}
|
||||
|
||||
static int b53_mmap_remove(struct platform_device *pdev)
|
||||
|
||||
@ -183,12 +183,12 @@ static inline struct b53_device *sw_to_b53(struct switch_dev *sw)
|
||||
return container_of(sw, struct b53_device, sw_dev);
|
||||
}
|
||||
|
||||
struct b53_device *b53_switch_alloc(struct device *base, struct b53_io_ops *ops,
|
||||
void *priv);
|
||||
struct b53_device *b53_swconfig_switch_alloc(struct device *base, struct b53_io_ops *ops,
|
||||
void *priv);
|
||||
|
||||
int b53_switch_detect(struct b53_device *dev);
|
||||
int b53_swconfig_switch_detect(struct b53_device *dev);
|
||||
|
||||
int b53_switch_register(struct b53_device *dev);
|
||||
int b53_swconfig_switch_register(struct b53_device *dev);
|
||||
|
||||
static inline void b53_switch_remove(struct b53_device *dev)
|
||||
{
|
||||
|
||||
@ -288,14 +288,14 @@ static int b53_spi_probe(struct spi_device *spi)
|
||||
struct b53_device *dev;
|
||||
int ret;
|
||||
|
||||
dev = b53_switch_alloc(&spi->dev, &b53_spi_ops, spi);
|
||||
dev = b53_swconfig_switch_alloc(&spi->dev, &b53_spi_ops, spi);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
if (spi->dev.platform_data)
|
||||
dev->pdata = spi->dev.platform_data;
|
||||
|
||||
ret = b53_switch_register(dev);
|
||||
ret = b53_swconfig_switch_register(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@ -342,7 +342,7 @@ static int b53_srab_probe(struct platform_device *pdev)
|
||||
if (!pdata)
|
||||
return -EINVAL;
|
||||
|
||||
dev = b53_switch_alloc(&pdev->dev, &b53_srab_ops, pdata->regs);
|
||||
dev = b53_swconfig_switch_alloc(&pdev->dev, &b53_srab_ops, pdata->regs);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -351,7 +351,7 @@ static int b53_srab_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
||||
return b53_switch_register(dev);
|
||||
return b53_swconfig_switch_register(dev);
|
||||
}
|
||||
|
||||
static int b53_srab_remove(struct platform_device *pdev)
|
||||
|
||||
@ -327,7 +327,7 @@
|
||||
<&infracfg CLK_INFRA_AP_DMA_CK>,
|
||||
<&infracfg CLK_INFRA_I2C_MCK_CK>,
|
||||
<&infracfg CLK_INFRA_I2C_PCK_CK>;
|
||||
clock-names = "main", "dma", "mck", "pck";
|
||||
clock-names = "main", "dma", "arb", "pmic";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
From e7697814c142c99f470c3458d49e41b25a575f23 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Fri, 26 May 2023 10:31:40 +0100
|
||||
Subject: [PATCH] cpufreq: mediatek: correct voltages for MT7622 and MT7623
|
||||
|
||||
The MT6380 regulator typically used together with MT7622 does not
|
||||
support the current maximum processor and SRAM voltage in the cpufreq
|
||||
driver (1360000uV).
|
||||
For MT7622 limit processor and SRAM supply voltages to 1350000uV to
|
||||
avoid having the tracking algorithm request unsupported voltages from
|
||||
the regulator.
|
||||
|
||||
On MT7623 there is no separate SRAM supply and the maximum voltage used
|
||||
is 1300000uV. Create dedicated platform data for MT7623 to cover that
|
||||
case as well.
|
||||
|
||||
Fixes: 0883426fd07e3 ("cpufreq: mediatek: Raise proc and sram max voltage for MT7622/7623")
|
||||
Suggested-by: Jia-wei Chang <Jia-wei.Chang@mediatek.com>
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
---
|
||||
drivers/cpufreq/mediatek-cpufreq.c | 13 ++++++++++---
|
||||
1 file changed, 10 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/mediatek-cpufreq.c
|
||||
+++ b/drivers/cpufreq/mediatek-cpufreq.c
|
||||
@@ -696,9 +696,16 @@ static const struct mtk_cpufreq_platform
|
||||
static const struct mtk_cpufreq_platform_data mt7622_platform_data = {
|
||||
.min_volt_shift = 100000,
|
||||
.max_volt_shift = 200000,
|
||||
- .proc_max_volt = 1360000,
|
||||
+ .proc_max_volt = 1350000,
|
||||
.sram_min_volt = 0,
|
||||
- .sram_max_volt = 1360000,
|
||||
+ .sram_max_volt = 1350000,
|
||||
+ .ccifreq_supported = false,
|
||||
+};
|
||||
+
|
||||
+static const struct mtk_cpufreq_platform_data mt7623_platform_data = {
|
||||
+ .min_volt_shift = 100000,
|
||||
+ .max_volt_shift = 200000,
|
||||
+ .proc_max_volt = 1300000,
|
||||
.ccifreq_supported = false,
|
||||
};
|
||||
|
||||
@@ -743,7 +750,7 @@ static const struct of_device_id mtk_cpu
|
||||
{ .compatible = "mediatek,mt2701", .data = &mt2701_platform_data },
|
||||
{ .compatible = "mediatek,mt2712", .data = &mt2701_platform_data },
|
||||
{ .compatible = "mediatek,mt7622", .data = &mt7622_platform_data },
|
||||
- { .compatible = "mediatek,mt7623", .data = &mt7622_platform_data },
|
||||
+ { .compatible = "mediatek,mt7623", .data = &mt7623_platform_data },
|
||||
{ .compatible = "mediatek,mt7988", .data = &mt7988_platform_data },
|
||||
{ .compatible = "mediatek,mt8167", .data = &mt8516_platform_data },
|
||||
{ .compatible = "mediatek,mt817x", .data = &mt2701_platform_data },
|
||||
@ -1,29 +0,0 @@
|
||||
From 20aad28ba5d62f1618408c264384d0b2ad7417db Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Mon, 22 May 2023 23:25:48 +0100
|
||||
Subject: [PATCH] cpufreq: mediatek: don't request unsupported voltage
|
||||
|
||||
PMICs on MT7622 and MT7623 boards only support up to 1350000uV despite
|
||||
the SoC's processor and SRAM voltage can be up to 1360000uV. As a
|
||||
work-around specify max. processor and SRAM voltage as 1350000uV to
|
||||
avoid requesting an unsupported voltage from the regulator.
|
||||
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
---
|
||||
drivers/cpufreq/mediatek-cpufreq.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/cpufreq/mediatek-cpufreq.c
|
||||
+++ b/drivers/cpufreq/mediatek-cpufreq.c
|
||||
@@ -696,9 +696,9 @@ static const struct mtk_cpufreq_platform
|
||||
static const struct mtk_cpufreq_platform_data mt7622_platform_data = {
|
||||
.min_volt_shift = 100000,
|
||||
.max_volt_shift = 200000,
|
||||
- .proc_max_volt = 1360000,
|
||||
+ .proc_max_volt = 1350000,
|
||||
.sram_min_volt = 0,
|
||||
- .sram_max_volt = 1360000,
|
||||
+ .sram_max_volt = 1350000,
|
||||
.ccifreq_supported = false,
|
||||
};
|
||||
|
||||
@ -1,55 +0,0 @@
|
||||
From 94bf61df9201195d6d8ce82e299fb231b31fbaae Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@makrotopia.org>
|
||||
Date: Fri, 26 May 2023 10:29:45 +0100
|
||||
Subject: [PATCH] i2c: mt65xx: add additional clocks
|
||||
|
||||
On MT7981 additional clocks are required when accessing I2C registers.
|
||||
Add MCK and PCK optional clocks to i2c-mt65xx driver so we don't have
|
||||
to always have them enabled, but really only if I2C is used.
|
||||
|
||||
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
---
|
||||
drivers/i2c/busses/i2c-mt65xx.c | 14 +++++++++++++-
|
||||
1 file changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/i2c/busses/i2c-mt65xx.c
|
||||
+++ b/drivers/i2c/busses/i2c-mt65xx.c
|
||||
@@ -93,6 +93,8 @@
|
||||
* @I2C_MT65XX_CLK_DMA: DMA clock for i2c via DMA
|
||||
* @I2C_MT65XX_CLK_PMIC: PMIC clock for i2c from PMIC
|
||||
* @I2C_MT65XX_CLK_ARB: Arbitrator clock for i2c
|
||||
+ * @I2C_MT65XX_CLK_MCK: MCK clock for i2c
|
||||
+ * @I2C_MT65XX_CLK_PCK: PCK clock for i2c
|
||||
* @I2C_MT65XX_CLK_MAX: Number of supported clocks
|
||||
*/
|
||||
enum i2c_mt65xx_clks {
|
||||
@@ -100,11 +102,13 @@ enum i2c_mt65xx_clks {
|
||||
I2C_MT65XX_CLK_DMA,
|
||||
I2C_MT65XX_CLK_PMIC,
|
||||
I2C_MT65XX_CLK_ARB,
|
||||
+ I2C_MT65XX_CLK_MCK,
|
||||
+ I2C_MT65XX_CLK_PCK,
|
||||
I2C_MT65XX_CLK_MAX
|
||||
};
|
||||
|
||||
static const char * const i2c_mt65xx_clk_ids[I2C_MT65XX_CLK_MAX] = {
|
||||
- "main", "dma", "pmic", "arb"
|
||||
+ "main", "dma", "pmic", "arb", "mck", "pck"
|
||||
};
|
||||
|
||||
enum DMA_REGS_OFFSET {
|
||||
@@ -1444,6 +1448,14 @@ static int mtk_i2c_probe(struct platform
|
||||
if (IS_ERR(i2c->clocks[I2C_MT65XX_CLK_ARB].clk))
|
||||
return PTR_ERR(i2c->clocks[I2C_MT65XX_CLK_ARB].clk);
|
||||
|
||||
+ i2c->clocks[I2C_MT65XX_CLK_MCK].clk = devm_clk_get_optional(&pdev->dev, "mck");
|
||||
+ if (IS_ERR(i2c->clocks[I2C_MT65XX_CLK_MCK].clk))
|
||||
+ return PTR_ERR(i2c->clocks[I2C_MT65XX_CLK_MCK].clk);
|
||||
+
|
||||
+ i2c->clocks[I2C_MT65XX_CLK_PCK].clk = devm_clk_get_optional(&pdev->dev, "pck");
|
||||
+ if (IS_ERR(i2c->clocks[I2C_MT65XX_CLK_PCK].clk))
|
||||
+ return PTR_ERR(i2c->clocks[I2C_MT65XX_CLK_PCK].clk);
|
||||
+
|
||||
if (i2c->have_pmic) {
|
||||
i2c->clocks[I2C_MT65XX_CLK_PMIC].clk = devm_clk_get(&pdev->dev, "pmic");
|
||||
if (IS_ERR(i2c->clocks[I2C_MT65XX_CLK_PMIC].clk)) {
|
||||
Loading…
Reference in New Issue
Block a user