mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Add utilities to help checking capabilities of the running procss.  Make
perf link with libcap, if it is available. If no libcap-dev[el],
fallback to the geteuid() == 0 test used before.
Committer notes:
  $ perf test python
  18: 'import perf' in python                               : FAILED!
  $ perf test -v python
  Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc
  18: 'import perf' in python                               :
  --- start ---
  test child forked, pid 23288
  Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
  ImportError: /tmp/build/perf/python/perf.so: undefined symbol: cap_get_flag
  test child finished with -1
  ---- end ----
  'import perf' in python: FAILED!
  $
This happens because differently from the perf binary generated with
this patch applied:
  $ ldd /tmp/build/perf/perf | grep libcap
  	libcap.so.2 => /lib64/libcap.so.2 (0x00007f724a4ef000)
  $
The python binding isn't linking with libcap:
  $ ldd /tmp/build/perf/python/perf.so | grep libcap
  $
So add 'cap' to the 'extra_libraries' variable in
tools/perf/util/setup.py, and rebuild:
  $ perf test python
  18: 'import perf' in python                               : Ok
  $
If we explicitely disable libcap it also continues to work:
  $ make NO_LIBCAP=1 -C tools/perf O=/tmp/build/perf install-bin
    $ ldd /tmp/build/perf/perf | grep libcap
  $ ldd /tmp/build/perf/python/perf.so | grep libcap
  $ perf test python
  18: 'import perf' in python                               : Ok
  $
Signed-off-by: Igor Lubashev <ilubashe@akamai.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
Cc: James Morris <jmorris@namei.org>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: linux-arm-kernel@lists.infradead.org
[ split from a larger patch ]
Link: http://lkml.kernel.org/r/8a1e76cf5c7c9796d0d4d240fbaa85305298aafa.1565188228.git.ilubashe@akamai.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
		
	
			
		
			
				
	
	
		
			29 lines
		
	
	
	
		
			468 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			29 lines
		
	
	
	
		
			468 B
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
/*
 | 
						|
 * Capability utilities
 | 
						|
 */
 | 
						|
 | 
						|
#ifdef HAVE_LIBCAP_SUPPORT
 | 
						|
 | 
						|
#include "cap.h"
 | 
						|
#include <stdbool.h>
 | 
						|
#include <sys/capability.h>
 | 
						|
 | 
						|
bool perf_cap__capable(cap_value_t cap)
 | 
						|
{
 | 
						|
	cap_flag_value_t val;
 | 
						|
	cap_t caps = cap_get_proc();
 | 
						|
 | 
						|
	if (!caps)
 | 
						|
		return false;
 | 
						|
 | 
						|
	if (cap_get_flag(caps, cap, CAP_EFFECTIVE, &val) != 0)
 | 
						|
		val = CAP_CLEAR;
 | 
						|
 | 
						|
	if (cap_free(caps) != 0)
 | 
						|
		return false;
 | 
						|
 | 
						|
	return val == CAP_SET;
 | 
						|
}
 | 
						|
 | 
						|
#endif  /* HAVE_LIBCAP_SUPPORT */
 |