mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 11:03:07 -04:00
perf test amd ibs: avoid using executable heap
Making [parts of] the heap executable is dangerous and is blocked by
SELinux on Fedora/RHEL even for an unconfined user. Replace the malloc()
+ mprotect() combo with just mmap(), creating a private anonymous rwx
mapping, which only requires the more commonly allowed "execmem"
permission under SELinux (things like JIT or regex compilation need it
as well). mmap() with MAP_ANONYMOUS will give us a zeroed mapping that
begins on a page boundary, so the result is equivalent to the original
code even without a memset() or the page-alignment dance.
Verified that the test still passes on a machine with an AMD CPU that
has the "ibs" CPU flag.
Fixes: 35db59fa8e ("perf test amd ibs: Add sample period unit test")
Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
Reviewed-by: Ravi Bangoria <ravi.bangoria@amd.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
committed by
Namhyung Kim
parent
ca0e19074b
commit
e34006e743
@@ -46,7 +46,6 @@ static int dummy_workload_1(unsigned long count)
|
||||
{
|
||||
int (*func)(void);
|
||||
int ret = 0;
|
||||
char *p;
|
||||
char insn1[] = {
|
||||
0xb8, 0x01, 0x00, 0x00, 0x00, /* mov 1,%eax */
|
||||
0xc3, /* ret */
|
||||
@@ -59,18 +58,11 @@ static int dummy_workload_1(unsigned long count)
|
||||
0xcc, /* int 3 */
|
||||
};
|
||||
|
||||
p = calloc(2, page_size);
|
||||
if (!p) {
|
||||
printf("malloc() failed. %m");
|
||||
return 1;
|
||||
}
|
||||
|
||||
func = (void *)((unsigned long)(p + page_size - 1) & ~(page_size - 1));
|
||||
|
||||
ret = mprotect(func, page_size, PROT_READ | PROT_WRITE | PROT_EXEC);
|
||||
if (ret) {
|
||||
printf("mprotect() failed. %m");
|
||||
goto out;
|
||||
func = mmap(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
if (func == MAP_FAILED) {
|
||||
pr_debug("mmap() failed. %m\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (count < 100000)
|
||||
@@ -93,7 +85,7 @@ static int dummy_workload_1(unsigned long count)
|
||||
}
|
||||
|
||||
out:
|
||||
free(p);
|
||||
munmap(func, page_size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user