summaryrefslogtreecommitdiff
path: root/tools/perf/util/cloexec.c
blob: f0dcd0ee0afaa0505470ca382a9d597a5e88fb3a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <sched.h>
#include "util.h"
#include "../perf.h"
#include "cloexec.h"
#include "asm/bug.h"
#include "debug.h"
#include <unistd.h>
#include <asm/unistd.h>
#include <sys/syscall.h>

static unsigned long flag = PERF_FLAG_FD_CLOEXEC;

int __weak sched_getcpu(void)
{
#ifdef __NR_getcpu
	unsigned cpu;
	int err = syscall(__NR_getcpu, &cpu, NULL, NULL);
	if (!err)
		return cpu;
#else
	errno = ENOSYS;
#endif
	return -1;
}

static int perf_flag_probe(void)
{
	/* use 'safest' configuration as used in perf_evsel__fallback() */
	struct perf_event_attr attr = {
		.type = PERF_TYPE_SOFTWARE,
		.config = PERF_COUNT_SW_CPU_CLOCK,
		.exclude_kernel = 1,
	};
	int fd;
	int err;
	int cpu;
	pid_t pid = -1;
	char sbuf[STRERR_BUFSIZE];

	cpu = sched_getcpu();
	if (cpu < 0)
		cpu = 0;

	/*
	 * Using -1 for the pid is a workaround to avoid gratuitous jump label
	 * changes.
	 */
	while (1) {
		/* check cloexec flag */
		fd = sys_perf_event_open(&attr, pid, cpu, -1,
					 PERF_FLAG_FD_CLOEXEC);
		if (fd < 0 && pid == -1 && errno == EACCES) {
			pid = 0;
			continue;
		}
		break;
	}
	err = errno;

	if (fd >= 0) {
		close(fd);
		return 1;
	}

	WARN_ONCE(err != EINVAL && err != EBUSY,
		  "perf_event_open(..., PERF_FLAG_FD_CLOEXEC) failed with unexpected error %d (%s)\n",
		  err, str_error_r(err, sbuf, sizeof(sbuf)));

	/* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */
	while (1) {
		fd = sys_perf_event_open(&attr, pid, cpu, -1, 0);
		if (fd < 0 && pid == -1 && errno == EACCES) {
			pid = 0;
			continue;
		}
		break;
	}
	err = errno;

	if (fd >= 0)
		close(fd);

	if (WARN_ONCE(fd < 0 && err != EBUSY,
		      "perf_event_open(..., 0) failed unexpectedly with error %d (%s)\n",
		      err, str_error_r(err, sbuf, sizeof(sbuf))))
		return -1;

	return 0;
}

unsigned long perf_event_open_cloexec_flag(void)
{
	static bool probed;

	if (!probed) {
		if (perf_flag_probe() <= 0)
			flag = 0;
		probed = true;
	}

	return flag;
}
rivate-remove&id=a5b60de6972decc6b50a39abb376077c3c3621c8'>plain -rw-r--r--apm_bios.h3634logplain -rw-r--r--arcfb.h150logplain -rw-r--r--atalk.h975logplain -rw-r--r--atm.h7874logplain -rw-r--r--atm_eni.h585logplain -rw-r--r--atm_he.h343logplain -rw-r--r--atm_idt77105.h892logplain -rw-r--r--atm_nicstar.h1215logplain -rw-r--r--atm_tcp.h1574logplain -rw-r--r--atm_zatm.h1477logplain -rw-r--r--atmapi.h889logplain -rw-r--r--atmarp.h1233logplain -rw-r--r--atmbr2684.h3208logplain -rw-r--r--atmclip.h513logplain -rw-r--r--atmdev.h7636logplain -rw-r--r--atmioc.h1583logplain -rw-r--r--atmlec.h2318logplain -rw-r--r--atmmpc.h4163logplain -rw-r--r--atmppp.h576logplain -rw-r--r--atmsap.h4907logplain -rw-r--r--atmsvc.h1790logplain -rw-r--r--audit.h19048logplain -rw-r--r--auto_dev-ioctl.h5093logplain -rw-r--r--auto_fs.h2260logplain -rw-r--r--auto_fs4.h4010logplain -rw-r--r--auxvec.h1448logplain -rw-r--r--ax25.h2761logplain -rw-r--r--b1lli.h1654logplain -rw-r--r--batman_adv.h8612logplain -rw-r--r--baycom.h820logplain -rw-r--r--bcache.h8237logplain -rw-r--r--bcm933xx_hcs.h356logplain -rw-r--r--bfs_fs.h1830logplain -rw-r--r--binfmts.h580logplain -rw-r--r--blkpg.h1620logplain -rw-r--r--blktrace_api.h4505logplain -rw-r--r--blkzoned.h5105logplain -rw-r--r--bpf.h19098logplain -rw-r--r--bpf_common.h1245logplain -rw-r--r--bpf_perf_event.h483logplain -rw-r--r--bpqether.h918logplain -rw-r--r--bsg.h2446logplain -rw-r--r--bt-bmc.h523logplain -rw-r--r--btrfs.h25922logplain -rw-r--r--btrfs_tree.h25015logplain d---------byteorder117logplain d---------caif112logplain -rw-r--r--can.h7808logplain d---------can204logplain -rw-r--r--capability.h11387logplain -rw-r--r--capi.h3094logplain -rw-r--r--cciss_defs.h3218logplain -rw-r--r--cciss_ioctl.h2727logplain -rw-r--r--cdrom.h28839logplain -rw-r--r--cec-funcs.h54313logplain -rw-r--r--cec.h37095logplain -rw-r--r--cgroupstats.h2155logplain -rw-r--r--chio.h5288logplain d---------cifs40logplain -rw-r--r--cm4000_cs.h1758logplain -rw-r--r--cn_proc.h3285logplain -rw-r--r--coda.h17682logplain -rw-r--r--coda_psdev.h735logplain -rw-r--r--coff.h12413logplain -rw-r--r--connector.h2204logplain -rw-r--r--const.h673logplain -rw-r--r--coresight-stm.h611logplain -rw-r--r--cramfs_fs.h2764logplain -rw-r--r--cryptouser.h3336logplain -rw-r--r--cuda.h857logplain -rw-r--r--cyclades.h17060logplain -rw-r--r--cycx_cfm.h2926logplain -rw-r--r--dcbnl.h24849logplain -rw-r--r--dccp.h6384logplain -rw-r--r--devlink.h4465logplain -rw-r--r--dlm.h2505logplain -rw-r--r--dlm_device.h2536logplain -rw-r--r--dlm_netlink.h1064logplain -rw-r--r--dlm_plock.h846logplain -rw-r--r--dlmconstants.h5017logplain -rw-r--r--dm-ioctl.h10703logplain -rw-r--r--dm-log-userspace.h15126logplain -rw-r--r--dma-buf.h1295logplain -rw-r--r--dn.h4579logplain -rw-r--r--dqblk_xfs.h8934logplain d---------dvb310logplain -rw-r--r--edd.h5556logplain -rw-r--r--efs_fs_sb.h2164logplain -rw-r--r--elf-em.h2166logplain -rw-r--r--elf-fdpic.h1075logplain