[PATCH v2 16/15] syscall_get_arch: add "struct task_struct *" argument
This argument is required to extend the generic ptrace API with PTRACE_GET_SYSCALL_INFO request: syscall_get_arch() is going to be called from ptrace_request() along with other syscall_get_* functions with a tracee as their argument. This change partially reverts commit 5e937a9ae913 ("syscall_get_arch: remove useless function arguments"). Cc: linux-alpha@vger.kernel.org Cc: linux-a...@vger.kernel.org Cc: linux-arm-ker...@lists.infradead.org Cc: linux-au...@redhat.com Cc: linux-c6x-...@linux-c6x.org Cc: linux-hexa...@vger.kernel.org Cc: linux-i...@vger.kernel.org Cc: linux-m...@lists.linux-m68k.org Cc: linux-m...@linux-mips.org Cc: linux-par...@vger.kernel.org Cc: linux-ri...@lists.infradead.org Cc: linux-s...@vger.kernel.org Cc: linux...@vger.kernel.org Cc: linux-snps-...@lists.infradead.org Cc: linux...@lists.infradead.org Cc: linux-xte...@linux-xtensa.org Cc: linuxppc-...@lists.ozlabs.org Cc: nios2-...@lists.rocketboards.org Cc: openr...@lists.librecores.org Cc: sparcli...@vger.kernel.org Cc: uclinux-h8-de...@lists.sourceforge.jp Cc: x...@kernel.org Signed-off-by: Dmitry V. Levin --- arch/alpha/include/asm/syscall.h | 2 +- arch/arc/include/asm/syscall.h| 2 +- arch/arm/include/asm/syscall.h| 2 +- arch/arm64/include/asm/syscall.h | 4 ++-- arch/c6x/include/asm/syscall.h| 2 +- arch/h8300/include/asm/syscall.h | 2 +- arch/hexagon/include/asm/syscall.h| 2 +- arch/ia64/include/asm/syscall.h | 2 +- arch/m68k/include/asm/syscall.h | 2 +- arch/microblaze/include/asm/syscall.h | 2 +- arch/mips/include/asm/syscall.h | 8 arch/mips/kernel/ptrace.c | 2 +- arch/nds32/include/asm/syscall.h | 2 +- arch/nios2/include/asm/syscall.h | 2 +- arch/openrisc/include/asm/syscall.h | 2 +- arch/parisc/include/asm/syscall.h | 4 ++-- arch/powerpc/include/asm/syscall.h| 10 -- arch/riscv/include/asm/syscall.h | 2 +- arch/s390/include/asm/syscall.h | 4 ++-- arch/sh/include/asm/syscall_32.h | 2 +- arch/sh/include/asm/syscall_64.h | 2 +- arch/sparc/include/asm/syscall.h | 5 +++-- arch/unicore32/include/asm/syscall.h | 2 +- arch/x86/include/asm/syscall.h| 8 +--- arch/x86/um/asm/syscall.h | 2 +- arch/xtensa/include/asm/syscall.h | 2 +- include/asm-generic/syscall.h | 3 ++- kernel/auditsc.c | 4 ++-- kernel/seccomp.c | 4 ++-- 29 files changed, 51 insertions(+), 41 deletions(-) diff --git a/arch/alpha/include/asm/syscall.h b/arch/alpha/include/asm/syscall.h index d73a6fcb519c..11c688c1d7ec 100644 --- a/arch/alpha/include/asm/syscall.h +++ b/arch/alpha/include/asm/syscall.h @@ -4,7 +4,7 @@ #include -static inline int syscall_get_arch(void) +static inline int syscall_get_arch(struct task_struct *task) { return AUDIT_ARCH_ALPHA; } diff --git a/arch/arc/include/asm/syscall.h b/arch/arc/include/asm/syscall.h index 10b2e7523bc8..7834baa61de8 100644 --- a/arch/arc/include/asm/syscall.h +++ b/arch/arc/include/asm/syscall.h @@ -69,7 +69,7 @@ syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, } } -static inline int syscall_get_arch(void) +static inline int syscall_get_arch(struct task_struct *task) { return IS_ENABLED(CONFIG_ISA_ARCOMPACT) ? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h index 06dea6bce293..3940ceac0bdc 100644 --- a/arch/arm/include/asm/syscall.h +++ b/arch/arm/include/asm/syscall.h @@ -104,7 +104,7 @@ static inline void syscall_set_arguments(struct task_struct *task, memcpy(>ARM_r0 + i, args, n * sizeof(args[0])); } -static inline int syscall_get_arch(void) +static inline int syscall_get_arch(struct task_struct *task) { /* ARM tasks don't change audit architectures on the fly. */ return AUDIT_ARCH_ARM; diff --git a/arch/arm64/include/asm/syscall.h b/arch/arm64/include/asm/syscall.h index ad8be16a39c9..1870df03f774 100644 --- a/arch/arm64/include/asm/syscall.h +++ b/arch/arm64/include/asm/syscall.h @@ -117,9 +117,9 @@ static inline void syscall_set_arguments(struct task_struct *task, * We don't care about endianness (__AUDIT_ARCH_LE bit) here because * AArch64 has the same system calls both on little- and big- endian. */ -static inline int syscall_get_arch(void) +static inline int syscall_get_arch(struct task_struct *task) { - if (is_compat_task()) + if (is_compat_thread(task_thread_info(task))) return AUDIT_ARCH_ARM; return AUDIT_ARCH_AARCH64; diff --git a/arch/c6x/include/asm/syscall.h b/arch/c6x/include/asm/syscall.h index 39dbd1ef994c..595057191c9c 100644 --- a/arch/c6x/include/asm/syscall.h +++ b/arch/c6x/include/asm/syscall.h @@ -121,7 +121,7 @@ static inline void syscall_set_arguments(struct task_struct *task, } } -static inline int
Re: [PATCH 10/10] perf/doc: update design.txt for exclude_{host|guest} flags
On Tue, Nov 20, 2018 at 10:31:36PM +1100, Michael Ellerman wrote: > Andrew Murray writes: > > > Update design.txt to reflect the presence of the exclude_host > > and exclude_guest perf flags. > > > > Signed-off-by: Andrew Murray > > --- > > tools/perf/design.txt | 4 > > 1 file changed, 4 insertions(+) > > > > diff --git a/tools/perf/design.txt b/tools/perf/design.txt > > index a28dca2..7de7d83 100644 > > --- a/tools/perf/design.txt > > +++ b/tools/perf/design.txt > > @@ -222,6 +222,10 @@ The 'exclude_user', 'exclude_kernel' and 'exclude_hv' > > bits provide a > > way to request that counting of events be restricted to times when the > > CPU is in user, kernel and/or hypervisor mode. > > > > +Furthermore the 'exclude_host' and 'exclude_guest' bits provide a way > > +to request counting of events restricted to guest and host contexts when > > +using virtualisation. > > How does exclude_host differ from exclude_hv ? I believe exclude_host / exclude_guest are intented to distinguish between host and guest in the hosted hypervisor context (KVM). Whereas exclude_hv allows to distinguish between guest and hypervisor in the bare-metal type hypervisors. In the case of arm64 - if VHE extensions are present then the host kernel will run at a higher privilege to the guest kernel, in which case there is no distinction between hypervisor and host so we ignore exclude_hv. But where VHE extensions are not present then the host kernel runs at the same privilege level as the guest and we use a higher privilege level to switch between them - in this case we can use exclude_hv to discount that hypervisor role of switching between guests. Thanks, Andrew Murray > > cheers
Re: [PATCH 10/10] perf/doc: update design.txt for exclude_{host|guest} flags
Andrew Murray writes: > Update design.txt to reflect the presence of the exclude_host > and exclude_guest perf flags. > > Signed-off-by: Andrew Murray > --- > tools/perf/design.txt | 4 > 1 file changed, 4 insertions(+) > > diff --git a/tools/perf/design.txt b/tools/perf/design.txt > index a28dca2..7de7d83 100644 > --- a/tools/perf/design.txt > +++ b/tools/perf/design.txt > @@ -222,6 +222,10 @@ The 'exclude_user', 'exclude_kernel' and 'exclude_hv' > bits provide a > way to request that counting of events be restricted to times when the > CPU is in user, kernel and/or hypervisor mode. > > +Furthermore the 'exclude_host' and 'exclude_guest' bits provide a way > +to request counting of events restricted to guest and host contexts when > +using virtualisation. How does exclude_host differ from exclude_hv ? cheers
Re: [PATCH 01/10] perf/core: Add macro to test for event exclusion flags
Andrew Murray writes: > Add a macro that tests if any of the perf event exclusion flags > are set on a given event. > > Signed-off-by: Andrew Murray > --- > include/linux/perf_event.h | 9 + > 1 file changed, 9 insertions(+) > > diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h > index 53c500f..89ee7fa 100644 > --- a/include/linux/perf_event.h > +++ b/include/linux/perf_event.h > @@ -1004,6 +1004,15 @@ perf_event__output_id_sample(struct perf_event *event, > extern void > perf_log_lost_samples(struct perf_event *event, u64 lost); > > +static inline bool event_has_exclude_flags(struct perf_event *event) > +{ > + struct perf_event_attr *attr = >attr; > + > + return attr->exclude_idle || attr->exclude_user || > +attr->exclude_kernel || attr->exclude_hv || > +attr->exclude_guest || attr->exclude_host; > +} Sorry to be a total PITA, but using "flags" plural suggests that it only returns true if there is more than one exclude flag set. A better name would be event_has_exclude_flag() or maybe event_has_any_exclude_flag(). If you're doing a respin anyway it'd be nice to fix the name, but obviously it's not high priority. cheers
Re: [PATCH 04/10] powerpc: perf/core: generalise event exclusion checking with perf macro
Andrew Murray writes: > Replace checking of perf event exclusion flags with perf macro. > > Signed-off-by: Andrew Murray > --- > arch/powerpc/perf/hv-24x7.c | 7 +-- > arch/powerpc/perf/hv-gpci.c | 7 +-- > arch/powerpc/perf/imc-pmu.c | 14 ++ > 3 files changed, 4 insertions(+), 24 deletions(-) These conversions look fine, thanks. Acked-by: Michael Ellerman cheers > diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c > index 72238ee..60db22d 100644 > --- a/arch/powerpc/perf/hv-24x7.c > +++ b/arch/powerpc/perf/hv-24x7.c > @@ -1307,12 +1307,7 @@ static int h_24x7_event_init(struct perf_event *event) > } > > /* unsupported modes and filters */ > - if (event->attr.exclude_user || > - event->attr.exclude_kernel || > - event->attr.exclude_hv || > - event->attr.exclude_idle || > - event->attr.exclude_host || > - event->attr.exclude_guest) > + if (event_has_exclude_flags(event)) > return -EINVAL; > > /* no branch sampling */ > diff --git a/arch/powerpc/perf/hv-gpci.c b/arch/powerpc/perf/hv-gpci.c > index 43fabb3..2d2b5c0 100644 > --- a/arch/powerpc/perf/hv-gpci.c > +++ b/arch/powerpc/perf/hv-gpci.c > @@ -233,12 +233,7 @@ static int h_gpci_event_init(struct perf_event *event) > } > > /* unsupported modes and filters */ > - if (event->attr.exclude_user || > - event->attr.exclude_kernel || > - event->attr.exclude_hv || > - event->attr.exclude_idle || > - event->attr.exclude_host || > - event->attr.exclude_guest) > + if (event_has_exclude_flags(event)) > return -EINVAL; > > /* no branch sampling */ > diff --git a/arch/powerpc/perf/imc-pmu.c b/arch/powerpc/perf/imc-pmu.c > index 1fafc32b..1ae1d3f 100644 > --- a/arch/powerpc/perf/imc-pmu.c > +++ b/arch/powerpc/perf/imc-pmu.c > @@ -474,12 +474,7 @@ static int nest_imc_event_init(struct perf_event *event) > return -EINVAL; > > /* unsupported modes and filters */ > - if (event->attr.exclude_user || > - event->attr.exclude_kernel || > - event->attr.exclude_hv || > - event->attr.exclude_idle || > - event->attr.exclude_host || > - event->attr.exclude_guest) > + if (event_has_exclude_flags(event)) > return -EINVAL; > > if (event->cpu < 0) > @@ -749,12 +744,7 @@ static int core_imc_event_init(struct perf_event *event) > return -EINVAL; > > /* unsupported modes and filters */ > - if (event->attr.exclude_user || > - event->attr.exclude_kernel || > - event->attr.exclude_hv || > - event->attr.exclude_idle || > - event->attr.exclude_host || > - event->attr.exclude_guest) > + if (event_has_exclude_flags(event)) > return -EINVAL; > > if (event->cpu < 0) > -- > 2.7.4