perf/core fixes and improvements:
perf top: Arnaldo Carvalho de Melo: . Lift restriction on using callchains without "sym" in --sort, allowing perf trace: Arnaldo Carvalho de Melo: . Fix ')' placement in "interrupted" syscall lines. . Fix alignment for [continued] lines. perf tests: Florian Fainelli: . Add a test for the ARM 32-bit [vectors] page. tools lib traceevent: Tzvetomir Stoyanov: . Introduce new libtracevent API: tep_override_comm(). . Initialize host_bigendian at tep_handle allocation. . More namespacing changes. . Remove superfluous APIs. tools headers uapi: Arnaldo Carvalho de Melo: . Update linux/{fs,vhost}.h, grab a copy o linux/mount.h, where the MS_ mount flags were moved. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQR2GiIUctdOfX2qHhGyPKLppCJ+JwUCXDT1GAAKCRCyPKLppCJ+ JxpIAQD4gwKryQB3RwDIhznIjpaR1voHNPyEdSiLC5mKqLI8aQD/TQUr472WFjDB 6rJWflAd8IjVD4PKgNNlIAcMWMApPgA= =rsPE -----END PGP SIGNATURE----- Merge tag 'perf-core-for-mingo-5.0-20190108' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent Pull perf/core fixes and improvements from Arnaldo Carvalho de Melo: perf top: Arnaldo Carvalho de Melo: - Lift restriction on using callchains without "sym" in --sort perf trace: Arnaldo Carvalho de Melo: - Fix ')' placement in "interrupted" syscall lines. - Fix alignment for [continued] lines. perf tests: Florian Fainelli: - Add a test for the ARM 32-bit [vectors] page. tools lib traceevent: Tzvetomir Stoyanov: - Introduce new libtracevent API: tep_override_comm(). - Initialize host_bigendian at tep_handle allocation. - More namespacing changes. - Remove superfluous APIs. tools headers uapi: Arnaldo Carvalho de Melo: . Update linux/{fs,vhost}.h, grab a copy o linux/mount.h, where the MS_ mount flags were moved. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
576b50ea23
|
@ -14,6 +14,11 @@
|
|||
#include <linux/ioctl.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/* Use of MS_* flags within the kernel is restricted to core mount(2) code. */
|
||||
#if !defined(__KERNEL__)
|
||||
#include <linux/mount.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* It's silly to have NR_OPEN bigger than NR_FILE, but you can change
|
||||
* the file limit at runtime and only root can increase the per-process
|
||||
|
@ -101,57 +106,6 @@ struct inodes_stat_t {
|
|||
|
||||
#define NR_FILE 8192 /* this can well be larger on a larger system */
|
||||
|
||||
|
||||
/*
|
||||
* These are the fs-independent mount-flags: up to 32 flags are supported
|
||||
*/
|
||||
#define MS_RDONLY 1 /* Mount read-only */
|
||||
#define MS_NOSUID 2 /* Ignore suid and sgid bits */
|
||||
#define MS_NODEV 4 /* Disallow access to device special files */
|
||||
#define MS_NOEXEC 8 /* Disallow program execution */
|
||||
#define MS_SYNCHRONOUS 16 /* Writes are synced at once */
|
||||
#define MS_REMOUNT 32 /* Alter flags of a mounted FS */
|
||||
#define MS_MANDLOCK 64 /* Allow mandatory locks on an FS */
|
||||
#define MS_DIRSYNC 128 /* Directory modifications are synchronous */
|
||||
#define MS_NOATIME 1024 /* Do not update access times. */
|
||||
#define MS_NODIRATIME 2048 /* Do not update directory access times */
|
||||
#define MS_BIND 4096
|
||||
#define MS_MOVE 8192
|
||||
#define MS_REC 16384
|
||||
#define MS_VERBOSE 32768 /* War is peace. Verbosity is silence.
|
||||
MS_VERBOSE is deprecated. */
|
||||
#define MS_SILENT 32768
|
||||
#define MS_POSIXACL (1<<16) /* VFS does not apply the umask */
|
||||
#define MS_UNBINDABLE (1<<17) /* change to unbindable */
|
||||
#define MS_PRIVATE (1<<18) /* change to private */
|
||||
#define MS_SLAVE (1<<19) /* change to slave */
|
||||
#define MS_SHARED (1<<20) /* change to shared */
|
||||
#define MS_RELATIME (1<<21) /* Update atime relative to mtime/ctime. */
|
||||
#define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */
|
||||
#define MS_I_VERSION (1<<23) /* Update inode I_version field */
|
||||
#define MS_STRICTATIME (1<<24) /* Always perform atime updates */
|
||||
#define MS_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */
|
||||
|
||||
/* These sb flags are internal to the kernel */
|
||||
#define MS_SUBMOUNT (1<<26)
|
||||
#define MS_NOREMOTELOCK (1<<27)
|
||||
#define MS_NOSEC (1<<28)
|
||||
#define MS_BORN (1<<29)
|
||||
#define MS_ACTIVE (1<<30)
|
||||
#define MS_NOUSER (1<<31)
|
||||
|
||||
/*
|
||||
* Superblock flags that can be altered by MS_REMOUNT
|
||||
*/
|
||||
#define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION|\
|
||||
MS_LAZYTIME)
|
||||
|
||||
/*
|
||||
* Old magic mount flag and mask
|
||||
*/
|
||||
#define MS_MGC_VAL 0xC0ED0000
|
||||
#define MS_MGC_MSK 0xffff0000
|
||||
|
||||
/*
|
||||
* Structure for FS_IOC_FSGETXATTR[A] and FS_IOC_FSSETXATTR.
|
||||
*/
|
||||
|
@ -269,7 +223,8 @@ struct fsxattr {
|
|||
#define FS_POLICY_FLAGS_PAD_16 0x02
|
||||
#define FS_POLICY_FLAGS_PAD_32 0x03
|
||||
#define FS_POLICY_FLAGS_PAD_MASK 0x03
|
||||
#define FS_POLICY_FLAGS_VALID 0x03
|
||||
#define FS_POLICY_FLAG_DIRECT_KEY 0x04 /* use master key directly */
|
||||
#define FS_POLICY_FLAGS_VALID 0x07
|
||||
|
||||
/* Encryption algorithms */
|
||||
#define FS_ENCRYPTION_MODE_INVALID 0
|
||||
|
@ -281,6 +236,7 @@ struct fsxattr {
|
|||
#define FS_ENCRYPTION_MODE_AES_128_CTS 6
|
||||
#define FS_ENCRYPTION_MODE_SPECK128_256_XTS 7 /* Removed, do not use. */
|
||||
#define FS_ENCRYPTION_MODE_SPECK128_256_CTS 8 /* Removed, do not use. */
|
||||
#define FS_ENCRYPTION_MODE_ADIANTUM 9
|
||||
|
||||
struct fscrypt_policy {
|
||||
__u8 version;
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
#ifndef _UAPI_LINUX_MOUNT_H
|
||||
#define _UAPI_LINUX_MOUNT_H
|
||||
|
||||
/*
|
||||
* These are the fs-independent mount-flags: up to 32 flags are supported
|
||||
*
|
||||
* Usage of these is restricted within the kernel to core mount(2) code and
|
||||
* callers of sys_mount() only. Filesystems should be using the SB_*
|
||||
* equivalent instead.
|
||||
*/
|
||||
#define MS_RDONLY 1 /* Mount read-only */
|
||||
#define MS_NOSUID 2 /* Ignore suid and sgid bits */
|
||||
#define MS_NODEV 4 /* Disallow access to device special files */
|
||||
#define MS_NOEXEC 8 /* Disallow program execution */
|
||||
#define MS_SYNCHRONOUS 16 /* Writes are synced at once */
|
||||
#define MS_REMOUNT 32 /* Alter flags of a mounted FS */
|
||||
#define MS_MANDLOCK 64 /* Allow mandatory locks on an FS */
|
||||
#define MS_DIRSYNC 128 /* Directory modifications are synchronous */
|
||||
#define MS_NOATIME 1024 /* Do not update access times. */
|
||||
#define MS_NODIRATIME 2048 /* Do not update directory access times */
|
||||
#define MS_BIND 4096
|
||||
#define MS_MOVE 8192
|
||||
#define MS_REC 16384
|
||||
#define MS_VERBOSE 32768 /* War is peace. Verbosity is silence.
|
||||
MS_VERBOSE is deprecated. */
|
||||
#define MS_SILENT 32768
|
||||
#define MS_POSIXACL (1<<16) /* VFS does not apply the umask */
|
||||
#define MS_UNBINDABLE (1<<17) /* change to unbindable */
|
||||
#define MS_PRIVATE (1<<18) /* change to private */
|
||||
#define MS_SLAVE (1<<19) /* change to slave */
|
||||
#define MS_SHARED (1<<20) /* change to shared */
|
||||
#define MS_RELATIME (1<<21) /* Update atime relative to mtime/ctime. */
|
||||
#define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */
|
||||
#define MS_I_VERSION (1<<23) /* Update inode I_version field */
|
||||
#define MS_STRICTATIME (1<<24) /* Always perform atime updates */
|
||||
#define MS_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */
|
||||
|
||||
/* These sb flags are internal to the kernel */
|
||||
#define MS_SUBMOUNT (1<<26)
|
||||
#define MS_NOREMOTELOCK (1<<27)
|
||||
#define MS_NOSEC (1<<28)
|
||||
#define MS_BORN (1<<29)
|
||||
#define MS_ACTIVE (1<<30)
|
||||
#define MS_NOUSER (1<<31)
|
||||
|
||||
/*
|
||||
* Superblock flags that can be altered by MS_REMOUNT
|
||||
*/
|
||||
#define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION|\
|
||||
MS_LAZYTIME)
|
||||
|
||||
/*
|
||||
* Old magic mount flag and mask
|
||||
*/
|
||||
#define MS_MGC_VAL 0xC0ED0000
|
||||
#define MS_MGC_MSK 0xffff0000
|
||||
|
||||
#endif /* _UAPI_LINUX_MOUNT_H */
|
|
@ -11,94 +11,9 @@
|
|||
* device configuration.
|
||||
*/
|
||||
|
||||
#include <linux/vhost_types.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/virtio_config.h>
|
||||
#include <linux/virtio_ring.h>
|
||||
|
||||
struct vhost_vring_state {
|
||||
unsigned int index;
|
||||
unsigned int num;
|
||||
};
|
||||
|
||||
struct vhost_vring_file {
|
||||
unsigned int index;
|
||||
int fd; /* Pass -1 to unbind from file. */
|
||||
|
||||
};
|
||||
|
||||
struct vhost_vring_addr {
|
||||
unsigned int index;
|
||||
/* Option flags. */
|
||||
unsigned int flags;
|
||||
/* Flag values: */
|
||||
/* Whether log address is valid. If set enables logging. */
|
||||
#define VHOST_VRING_F_LOG 0
|
||||
|
||||
/* Start of array of descriptors (virtually contiguous) */
|
||||
__u64 desc_user_addr;
|
||||
/* Used structure address. Must be 32 bit aligned */
|
||||
__u64 used_user_addr;
|
||||
/* Available structure address. Must be 16 bit aligned */
|
||||
__u64 avail_user_addr;
|
||||
/* Logging support. */
|
||||
/* Log writes to used structure, at offset calculated from specified
|
||||
* address. Address must be 32 bit aligned. */
|
||||
__u64 log_guest_addr;
|
||||
};
|
||||
|
||||
/* no alignment requirement */
|
||||
struct vhost_iotlb_msg {
|
||||
__u64 iova;
|
||||
__u64 size;
|
||||
__u64 uaddr;
|
||||
#define VHOST_ACCESS_RO 0x1
|
||||
#define VHOST_ACCESS_WO 0x2
|
||||
#define VHOST_ACCESS_RW 0x3
|
||||
__u8 perm;
|
||||
#define VHOST_IOTLB_MISS 1
|
||||
#define VHOST_IOTLB_UPDATE 2
|
||||
#define VHOST_IOTLB_INVALIDATE 3
|
||||
#define VHOST_IOTLB_ACCESS_FAIL 4
|
||||
__u8 type;
|
||||
};
|
||||
|
||||
#define VHOST_IOTLB_MSG 0x1
|
||||
#define VHOST_IOTLB_MSG_V2 0x2
|
||||
|
||||
struct vhost_msg {
|
||||
int type;
|
||||
union {
|
||||
struct vhost_iotlb_msg iotlb;
|
||||
__u8 padding[64];
|
||||
};
|
||||
};
|
||||
|
||||
struct vhost_msg_v2 {
|
||||
__u32 type;
|
||||
__u32 reserved;
|
||||
union {
|
||||
struct vhost_iotlb_msg iotlb;
|
||||
__u8 padding[64];
|
||||
};
|
||||
};
|
||||
|
||||
struct vhost_memory_region {
|
||||
__u64 guest_phys_addr;
|
||||
__u64 memory_size; /* bytes */
|
||||
__u64 userspace_addr;
|
||||
__u64 flags_padding; /* No flags are currently specified. */
|
||||
};
|
||||
|
||||
/* All region addresses and sizes must be 4K aligned. */
|
||||
#define VHOST_PAGE_SIZE 0x1000
|
||||
|
||||
struct vhost_memory {
|
||||
__u32 nregions;
|
||||
__u32 padding;
|
||||
struct vhost_memory_region regions[0];
|
||||
};
|
||||
|
||||
/* ioctls */
|
||||
|
||||
|
@ -186,31 +101,7 @@ struct vhost_memory {
|
|||
* device. This can be used to stop the ring (e.g. for migration). */
|
||||
#define VHOST_NET_SET_BACKEND _IOW(VHOST_VIRTIO, 0x30, struct vhost_vring_file)
|
||||
|
||||
/* Feature bits */
|
||||
/* Log all write descriptors. Can be changed while device is active. */
|
||||
#define VHOST_F_LOG_ALL 26
|
||||
/* vhost-net should add virtio_net_hdr for RX, and strip for TX packets. */
|
||||
#define VHOST_NET_F_VIRTIO_NET_HDR 27
|
||||
|
||||
/* VHOST_SCSI specific definitions */
|
||||
|
||||
/*
|
||||
* Used by QEMU userspace to ensure a consistent vhost-scsi ABI.
|
||||
*
|
||||
* ABI Rev 0: July 2012 version starting point for v3.6-rc merge candidate +
|
||||
* RFC-v2 vhost-scsi userspace. Add GET_ABI_VERSION ioctl usage
|
||||
* ABI Rev 1: January 2013. Ignore vhost_tpgt filed in struct vhost_scsi_target.
|
||||
* All the targets under vhost_wwpn can be seen and used by guset.
|
||||
*/
|
||||
|
||||
#define VHOST_SCSI_ABI_VERSION 1
|
||||
|
||||
struct vhost_scsi_target {
|
||||
int abi_version;
|
||||
char vhost_wwpn[224]; /* TRANSPORT_IQN_LEN */
|
||||
unsigned short vhost_tpgt;
|
||||
unsigned short reserved;
|
||||
};
|
||||
/* VHOST_SCSI specific defines */
|
||||
|
||||
#define VHOST_SCSI_SET_ENDPOINT _IOW(VHOST_VIRTIO, 0x40, struct vhost_scsi_target)
|
||||
#define VHOST_SCSI_CLEAR_ENDPOINT _IOW(VHOST_VIRTIO, 0x41, struct vhost_scsi_target)
|
||||
|
|
|
@ -194,13 +194,13 @@ void tep_set_page_size(struct tep_handle *pevent, int _page_size)
|
|||
}
|
||||
|
||||
/**
|
||||
* tep_is_file_bigendian - get if the file is in big endian order
|
||||
* tep_file_bigendian - get if the file is in big endian order
|
||||
* @pevent: a handle to the tep_handle
|
||||
*
|
||||
* This returns if the file is in big endian order
|
||||
* If @pevent is NULL, 0 is returned.
|
||||
*/
|
||||
int tep_is_file_bigendian(struct tep_handle *pevent)
|
||||
int tep_file_bigendian(struct tep_handle *pevent)
|
||||
{
|
||||
if(pevent)
|
||||
return pevent->file_bigendian;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#ifndef _PARSE_EVENTS_INT_H
|
||||
#define _PARSE_EVENTS_INT_H
|
||||
|
||||
struct cmdline;
|
||||
struct tep_cmdline;
|
||||
struct cmdline_list;
|
||||
struct func_map;
|
||||
struct func_list;
|
||||
|
@ -36,7 +36,7 @@ struct tep_handle {
|
|||
int long_size;
|
||||
int page_size;
|
||||
|
||||
struct cmdline *cmdlines;
|
||||
struct tep_cmdline *cmdlines;
|
||||
struct cmdline_list *cmdlist;
|
||||
int cmdline_count;
|
||||
|
||||
|
|
|
@ -124,15 +124,15 @@ struct tep_print_arg *alloc_arg(void)
|
|||
return calloc(1, sizeof(struct tep_print_arg));
|
||||
}
|
||||
|
||||
struct cmdline {
|
||||
struct tep_cmdline {
|
||||
char *comm;
|
||||
int pid;
|
||||
};
|
||||
|
||||
static int cmdline_cmp(const void *a, const void *b)
|
||||
{
|
||||
const struct cmdline *ca = a;
|
||||
const struct cmdline *cb = b;
|
||||
const struct tep_cmdline *ca = a;
|
||||
const struct tep_cmdline *cb = b;
|
||||
|
||||
if (ca->pid < cb->pid)
|
||||
return -1;
|
||||
|
@ -152,7 +152,7 @@ static int cmdline_init(struct tep_handle *pevent)
|
|||
{
|
||||
struct cmdline_list *cmdlist = pevent->cmdlist;
|
||||
struct cmdline_list *item;
|
||||
struct cmdline *cmdlines;
|
||||
struct tep_cmdline *cmdlines;
|
||||
int i;
|
||||
|
||||
cmdlines = malloc(sizeof(*cmdlines) * pevent->cmdline_count);
|
||||
|
@ -179,8 +179,8 @@ static int cmdline_init(struct tep_handle *pevent)
|
|||
|
||||
static const char *find_cmdline(struct tep_handle *pevent, int pid)
|
||||
{
|
||||
const struct cmdline *comm;
|
||||
struct cmdline key;
|
||||
const struct tep_cmdline *comm;
|
||||
struct tep_cmdline key;
|
||||
|
||||
if (!pid)
|
||||
return "<idle>";
|
||||
|
@ -208,8 +208,8 @@ static const char *find_cmdline(struct tep_handle *pevent, int pid)
|
|||
*/
|
||||
int tep_pid_is_registered(struct tep_handle *pevent, int pid)
|
||||
{
|
||||
const struct cmdline *comm;
|
||||
struct cmdline key;
|
||||
const struct tep_cmdline *comm;
|
||||
struct tep_cmdline key;
|
||||
|
||||
if (!pid)
|
||||
return 1;
|
||||
|
@ -232,11 +232,13 @@ int tep_pid_is_registered(struct tep_handle *pevent, int pid)
|
|||
* we must add this pid. This is much slower than when cmdlines
|
||||
* are added before the array is initialized.
|
||||
*/
|
||||
static int add_new_comm(struct tep_handle *pevent, const char *comm, int pid)
|
||||
static int add_new_comm(struct tep_handle *pevent,
|
||||
const char *comm, int pid, bool override)
|
||||
{
|
||||
struct cmdline *cmdlines = pevent->cmdlines;
|
||||
const struct cmdline *cmdline;
|
||||
struct cmdline key;
|
||||
struct tep_cmdline *cmdlines = pevent->cmdlines;
|
||||
struct tep_cmdline *cmdline;
|
||||
struct tep_cmdline key;
|
||||
char *new_comm;
|
||||
|
||||
if (!pid)
|
||||
return 0;
|
||||
|
@ -247,8 +249,19 @@ static int add_new_comm(struct tep_handle *pevent, const char *comm, int pid)
|
|||
cmdline = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
|
||||
sizeof(*pevent->cmdlines), cmdline_cmp);
|
||||
if (cmdline) {
|
||||
errno = EEXIST;
|
||||
return -1;
|
||||
if (!override) {
|
||||
errno = EEXIST;
|
||||
return -1;
|
||||
}
|
||||
new_comm = strdup(comm);
|
||||
if (!new_comm) {
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
free(cmdline->comm);
|
||||
cmdline->comm = new_comm;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (pevent->cmdline_count + 1));
|
||||
|
@ -275,21 +288,13 @@ static int add_new_comm(struct tep_handle *pevent, const char *comm, int pid)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* tep_register_comm - register a pid / comm mapping
|
||||
* @pevent: handle for the pevent
|
||||
* @comm: the command line to register
|
||||
* @pid: the pid to map the command line to
|
||||
*
|
||||
* This adds a mapping to search for command line names with
|
||||
* a given pid. The comm is duplicated.
|
||||
*/
|
||||
int tep_register_comm(struct tep_handle *pevent, const char *comm, int pid)
|
||||
static int _tep_register_comm(struct tep_handle *pevent,
|
||||
const char *comm, int pid, bool override)
|
||||
{
|
||||
struct cmdline_list *item;
|
||||
|
||||
if (pevent->cmdlines)
|
||||
return add_new_comm(pevent, comm, pid);
|
||||
return add_new_comm(pevent, comm, pid, override);
|
||||
|
||||
item = malloc(sizeof(*item));
|
||||
if (!item)
|
||||
|
@ -312,6 +317,40 @@ int tep_register_comm(struct tep_handle *pevent, const char *comm, int pid)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* tep_register_comm - register a pid / comm mapping
|
||||
* @pevent: handle for the pevent
|
||||
* @comm: the command line to register
|
||||
* @pid: the pid to map the command line to
|
||||
*
|
||||
* This adds a mapping to search for command line names with
|
||||
* a given pid. The comm is duplicated. If a command with the same pid
|
||||
* already exist, -1 is returned and errno is set to EEXIST
|
||||
*/
|
||||
int tep_register_comm(struct tep_handle *pevent, const char *comm, int pid)
|
||||
{
|
||||
return _tep_register_comm(pevent, comm, pid, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* tep_override_comm - register a pid / comm mapping
|
||||
* @pevent: handle for the pevent
|
||||
* @comm: the command line to register
|
||||
* @pid: the pid to map the command line to
|
||||
*
|
||||
* This adds a mapping to search for command line names with
|
||||
* a given pid. The comm is duplicated. If a command with the same pid
|
||||
* already exist, the command string is udapted with the new one
|
||||
*/
|
||||
int tep_override_comm(struct tep_handle *pevent, const char *comm, int pid)
|
||||
{
|
||||
if (!pevent->cmdlines && cmdline_init(pevent)) {
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
return _tep_register_comm(pevent, comm, pid, true);
|
||||
}
|
||||
|
||||
int tep_register_trace_clock(struct tep_handle *pevent, const char *trace_clock)
|
||||
{
|
||||
pevent->trace_clock = strdup(trace_clock);
|
||||
|
@ -5226,18 +5265,6 @@ int tep_data_type(struct tep_handle *pevent, struct tep_record *rec)
|
|||
return trace_parse_common_type(pevent, rec->data);
|
||||
}
|
||||
|
||||
/**
|
||||
* tep_data_event_from_type - find the event by a given type
|
||||
* @pevent: a handle to the pevent
|
||||
* @type: the type of the event.
|
||||
*
|
||||
* This returns the event form a given @type;
|
||||
*/
|
||||
struct tep_event *tep_data_event_from_type(struct tep_handle *pevent, int type)
|
||||
{
|
||||
return tep_find_event(pevent, type);
|
||||
}
|
||||
|
||||
/**
|
||||
* tep_data_pid - parse the PID from record
|
||||
* @pevent: a handle to the pevent
|
||||
|
@ -5292,8 +5319,8 @@ const char *tep_data_comm_from_pid(struct tep_handle *pevent, int pid)
|
|||
return comm;
|
||||
}
|
||||
|
||||
static struct cmdline *
|
||||
pid_from_cmdlist(struct tep_handle *pevent, const char *comm, struct cmdline *next)
|
||||
static struct tep_cmdline *
|
||||
pid_from_cmdlist(struct tep_handle *pevent, const char *comm, struct tep_cmdline *next)
|
||||
{
|
||||
struct cmdline_list *cmdlist = (struct cmdline_list *)next;
|
||||
|
||||
|
@ -5305,7 +5332,7 @@ pid_from_cmdlist(struct tep_handle *pevent, const char *comm, struct cmdline *ne
|
|||
while (cmdlist && strcmp(cmdlist->comm, comm) != 0)
|
||||
cmdlist = cmdlist->next;
|
||||
|
||||
return (struct cmdline *)cmdlist;
|
||||
return (struct tep_cmdline *)cmdlist;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -5321,10 +5348,10 @@ pid_from_cmdlist(struct tep_handle *pevent, const char *comm, struct cmdline *ne
|
|||
* next pid.
|
||||
* Also, it does a linear search, so it may be slow.
|
||||
*/
|
||||
struct cmdline *tep_data_pid_from_comm(struct tep_handle *pevent, const char *comm,
|
||||
struct cmdline *next)
|
||||
struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *pevent, const char *comm,
|
||||
struct tep_cmdline *next)
|
||||
{
|
||||
struct cmdline *cmdline;
|
||||
struct tep_cmdline *cmdline;
|
||||
|
||||
/*
|
||||
* If the cmdlines have not been converted yet, then use
|
||||
|
@ -5363,7 +5390,7 @@ struct cmdline *tep_data_pid_from_comm(struct tep_handle *pevent, const char *co
|
|||
* Returns the pid for a give cmdline. If @cmdline is NULL, then
|
||||
* -1 is returned.
|
||||
*/
|
||||
int tep_cmdline_pid(struct tep_handle *pevent, struct cmdline *cmdline)
|
||||
int tep_cmdline_pid(struct tep_handle *pevent, struct tep_cmdline *cmdline)
|
||||
{
|
||||
struct cmdline_list *cmdlist = (struct cmdline_list *)cmdline;
|
||||
|
||||
|
@ -6593,6 +6620,12 @@ static struct tep_event *search_event(struct tep_handle *pevent, int id,
|
|||
*
|
||||
* If @id is >= 0, then it is used to find the event.
|
||||
* else @sys_name and @event_name are used.
|
||||
*
|
||||
* Returns:
|
||||
* TEP_REGISTER_SUCCESS_OVERWRITE if an existing handler is overwritten
|
||||
* TEP_REGISTER_SUCCESS if a new handler is registered successfully
|
||||
* negative TEP_ERRNO_... in case of an error
|
||||
*
|
||||
*/
|
||||
int tep_register_event_handler(struct tep_handle *pevent, int id,
|
||||
const char *sys_name, const char *event_name,
|
||||
|
@ -6610,7 +6643,7 @@ int tep_register_event_handler(struct tep_handle *pevent, int id,
|
|||
|
||||
event->handler = func;
|
||||
event->context = context;
|
||||
return 0;
|
||||
return TEP_REGISTER_SUCCESS_OVERWRITE;
|
||||
|
||||
not_found:
|
||||
/* Save for later use. */
|
||||
|
@ -6640,7 +6673,7 @@ int tep_register_event_handler(struct tep_handle *pevent, int id,
|
|||
pevent->handlers = handle;
|
||||
handle->context = context;
|
||||
|
||||
return -1;
|
||||
return TEP_REGISTER_SUCCESS;
|
||||
}
|
||||
|
||||
static int handle_matches(struct event_handler *handler, int id,
|
||||
|
@ -6723,8 +6756,10 @@ struct tep_handle *tep_alloc(void)
|
|||
{
|
||||
struct tep_handle *pevent = calloc(1, sizeof(*pevent));
|
||||
|
||||
if (pevent)
|
||||
if (pevent) {
|
||||
pevent->ref_count = 1;
|
||||
pevent->host_bigendian = tep_host_bigendian();
|
||||
}
|
||||
|
||||
return pevent;
|
||||
}
|
||||
|
|
|
@ -432,6 +432,7 @@ int tep_set_function_resolver(struct tep_handle *pevent,
|
|||
tep_func_resolver_t *func, void *priv);
|
||||
void tep_reset_function_resolver(struct tep_handle *pevent);
|
||||
int tep_register_comm(struct tep_handle *pevent, const char *comm, int pid);
|
||||
int tep_override_comm(struct tep_handle *pevent, const char *comm, int pid);
|
||||
int tep_register_trace_clock(struct tep_handle *pevent, const char *trace_clock);
|
||||
int tep_register_function(struct tep_handle *pevent, char *name,
|
||||
unsigned long long addr, char *mod);
|
||||
|
@ -484,6 +485,11 @@ int tep_print_func_field(struct trace_seq *s, const char *fmt,
|
|||
struct tep_event *event, const char *name,
|
||||
struct tep_record *record, int err);
|
||||
|
||||
enum tep_reg_handler {
|
||||
TEP_REGISTER_SUCCESS = 0,
|
||||
TEP_REGISTER_SUCCESS_OVERWRITE,
|
||||
};
|
||||
|
||||
int tep_register_event_handler(struct tep_handle *pevent, int id,
|
||||
const char *sys_name, const char *event_name,
|
||||
tep_event_handler_func func, void *context);
|
||||
|
@ -520,15 +526,14 @@ tep_find_event_by_record(struct tep_handle *pevent, struct tep_record *record);
|
|||
void tep_data_lat_fmt(struct tep_handle *pevent,
|
||||
struct trace_seq *s, struct tep_record *record);
|
||||
int tep_data_type(struct tep_handle *pevent, struct tep_record *rec);
|
||||
struct tep_event *tep_data_event_from_type(struct tep_handle *pevent, int type);
|
||||
int tep_data_pid(struct tep_handle *pevent, struct tep_record *rec);
|
||||
int tep_data_preempt_count(struct tep_handle *pevent, struct tep_record *rec);
|
||||
int tep_data_flags(struct tep_handle *pevent, struct tep_record *rec);
|
||||
const char *tep_data_comm_from_pid(struct tep_handle *pevent, int pid);
|
||||
struct cmdline;
|
||||
struct cmdline *tep_data_pid_from_comm(struct tep_handle *pevent, const char *comm,
|
||||
struct cmdline *next);
|
||||
int tep_cmdline_pid(struct tep_handle *pevent, struct cmdline *cmdline);
|
||||
struct tep_cmdline;
|
||||
struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *pevent, const char *comm,
|
||||
struct tep_cmdline *next);
|
||||
int tep_cmdline_pid(struct tep_handle *pevent, struct tep_cmdline *cmdline);
|
||||
|
||||
void tep_print_field(struct trace_seq *s, void *data,
|
||||
struct tep_format_field *field);
|
||||
|
@ -553,7 +558,7 @@ int tep_get_long_size(struct tep_handle *pevent);
|
|||
void tep_set_long_size(struct tep_handle *pevent, int long_size);
|
||||
int tep_get_page_size(struct tep_handle *pevent);
|
||||
void tep_set_page_size(struct tep_handle *pevent, int _page_size);
|
||||
int tep_is_file_bigendian(struct tep_handle *pevent);
|
||||
int tep_file_bigendian(struct tep_handle *pevent);
|
||||
void tep_set_file_bigendian(struct tep_handle *pevent, enum tep_endian endian);
|
||||
int tep_is_host_bigendian(struct tep_handle *pevent);
|
||||
void tep_set_host_bigendian(struct tep_handle *pevent, enum tep_endian endian);
|
||||
|
|
|
@ -389,7 +389,7 @@ static int kvm_mmu_print_role(struct trace_seq *s, struct tep_record *record,
|
|||
* We can only use the structure if file is of the same
|
||||
* endianness.
|
||||
*/
|
||||
if (tep_is_file_bigendian(event->pevent) ==
|
||||
if (tep_file_bigendian(event->pevent) ==
|
||||
tep_is_host_bigendian(event->pevent)) {
|
||||
|
||||
trace_seq_printf(s, "%u q%u%s %s%s %spae %snxe %swp%s%s%s",
|
||||
|
|
|
@ -100,7 +100,8 @@ static void expand_buffer(struct trace_seq *s)
|
|||
* @fmt: printf format string
|
||||
*
|
||||
* It returns 0 if the trace oversizes the buffer's free
|
||||
* space, 1 otherwise.
|
||||
* space, the number of characters printed, or a negative
|
||||
* value in case of an error.
|
||||
*
|
||||
* The tracer may use either sequence operations or its own
|
||||
* copy to user routines. To simplify formating of a trace
|
||||
|
@ -129,9 +130,10 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
|
|||
goto try_again;
|
||||
}
|
||||
|
||||
s->len += ret;
|
||||
if (ret > 0)
|
||||
s->len += ret;
|
||||
|
||||
return 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -139,6 +141,10 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
|
|||
* @s: trace sequence descriptor
|
||||
* @fmt: printf format string
|
||||
*
|
||||
* It returns 0 if the trace oversizes the buffer's free
|
||||
* space, the number of characters printed, or a negative
|
||||
* value in case of an error.
|
||||
* *
|
||||
* The tracer may use either sequence operations or its own
|
||||
* copy to user routines. To simplify formating of a trace
|
||||
* trace_seq_printf is used to store strings into a special
|
||||
|
@ -163,9 +169,10 @@ trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
|
|||
goto try_again;
|
||||
}
|
||||
|
||||
s->len += ret;
|
||||
if (ret > 0)
|
||||
s->len += ret;
|
||||
|
||||
return len;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -662,12 +662,12 @@ $(OUTPUT)perf-%: %.o $(PERFLIBS)
|
|||
$(QUIET_LINK)$(CC) $(CFLAGS) -o $@ $(LDFLAGS) $(filter %.o,$^) $(LIBS)
|
||||
|
||||
ifndef NO_PERF_READ_VDSO32
|
||||
$(OUTPUT)perf-read-vdso32: perf-read-vdso.c util/find-vdso-map.c
|
||||
$(OUTPUT)perf-read-vdso32: perf-read-vdso.c util/find-map.c
|
||||
$(QUIET_CC)$(CC) -m32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c
|
||||
endif
|
||||
|
||||
ifndef NO_PERF_READ_VDSOX32
|
||||
$(OUTPUT)perf-read-vdsox32: perf-read-vdso.c util/find-vdso-map.c
|
||||
$(OUTPUT)perf-read-vdsox32: perf-read-vdso.c util/find-map.c
|
||||
$(QUIET_CC)$(CC) -mx32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c
|
||||
endif
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
libperf-y += regs_load.o
|
||||
libperf-y += dwarf-unwind.o
|
||||
libperf-y += vectors-page.o
|
||||
|
||||
libperf-y += arch-tests.o
|
||||
|
|
|
@ -10,6 +10,10 @@ struct test arch_tests[] = {
|
|||
.func = test__dwarf_unwind,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.desc = "Vectors page",
|
||||
.func = test__vectors_page,
|
||||
},
|
||||
{
|
||||
.func = NULL,
|
||||
},
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "tests/tests.h"
|
||||
#include "util/find-map.c"
|
||||
|
||||
#define VECTORS__MAP_NAME "[vectors]"
|
||||
|
||||
int test__vectors_page(struct test *test __maybe_unused,
|
||||
int subtest __maybe_unused)
|
||||
{
|
||||
void *start, *end;
|
||||
|
||||
if (find_map(&start, &end, VECTORS__MAP_NAME)) {
|
||||
pr_err("%s not found, is CONFIG_KUSER_HELPERS enabled?\n",
|
||||
VECTORS__MAP_NAME);
|
||||
return TEST_FAIL;
|
||||
}
|
||||
|
||||
return TEST_OK;
|
||||
}
|
|
@ -1028,12 +1028,7 @@ static int perf_top__start_counters(struct perf_top *top)
|
|||
|
||||
static int callchain_param__setup_sample_type(struct callchain_param *callchain)
|
||||
{
|
||||
if (!perf_hpp_list.sym) {
|
||||
if (callchain->enabled) {
|
||||
ui__error("Selected -g but \"sym\" not present in --sort/-s.");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (callchain->mode != CHAIN_NONE) {
|
||||
if (callchain->mode != CHAIN_NONE) {
|
||||
if (callchain_register_param(callchain) < 0) {
|
||||
ui__error("Can't register callchain params.\n");
|
||||
return -EINVAL;
|
||||
|
|
|
@ -1758,6 +1758,7 @@ static int trace__printf_interrupted_entry(struct trace *trace)
|
|||
{
|
||||
struct thread_trace *ttrace;
|
||||
size_t printed;
|
||||
int len;
|
||||
|
||||
if (trace->failure_only || trace->current == NULL)
|
||||
return 0;
|
||||
|
@ -1768,9 +1769,14 @@ static int trace__printf_interrupted_entry(struct trace *trace)
|
|||
return 0;
|
||||
|
||||
printed = trace__fprintf_entry_head(trace, trace->current, 0, false, ttrace->entry_time, trace->output);
|
||||
printed += fprintf(trace->output, ")%-*s ...\n", trace->args_alignment, ttrace->entry_str);
|
||||
ttrace->entry_pending = false;
|
||||
printed += len = fprintf(trace->output, "%s)", ttrace->entry_str);
|
||||
|
||||
if (len < trace->args_alignment - 4)
|
||||
printed += fprintf(trace->output, "%-*s", trace->args_alignment - 4 - len, " ");
|
||||
|
||||
printed += fprintf(trace->output, " ...\n");
|
||||
|
||||
ttrace->entry_pending = false;
|
||||
++trace->nr_events_printed;
|
||||
|
||||
return printed;
|
||||
|
@ -2026,9 +2032,10 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
|
|||
if (ttrace->entry_pending) {
|
||||
printed = fprintf(trace->output, "%s", ttrace->entry_str);
|
||||
} else {
|
||||
fprintf(trace->output, " ... [");
|
||||
printed += fprintf(trace->output, " ... [");
|
||||
color_fprintf(trace->output, PERF_COLOR_YELLOW, "continued");
|
||||
fprintf(trace->output, "]: %s()", sc->name);
|
||||
printed += 9;
|
||||
printed += fprintf(trace->output, "]: %s()", sc->name);
|
||||
}
|
||||
|
||||
printed++; /* the closing ')' */
|
||||
|
|
|
@ -10,6 +10,7 @@ include/uapi/linux/fs.h
|
|||
include/uapi/linux/kcmp.h
|
||||
include/uapi/linux/kvm.h
|
||||
include/uapi/linux/in.h
|
||||
include/uapi/linux/mount.h
|
||||
include/uapi/linux/perf_event.h
|
||||
include/uapi/linux/prctl.h
|
||||
include/uapi/linux/sched.h
|
||||
|
|
|
@ -5,17 +5,17 @@
|
|||
#define VDSO__MAP_NAME "[vdso]"
|
||||
|
||||
/*
|
||||
* Include definition of find_vdso_map() also used in util/vdso.c for
|
||||
* Include definition of find_map() also used in util/vdso.c for
|
||||
* building perf.
|
||||
*/
|
||||
#include "util/find-vdso-map.c"
|
||||
#include "util/find-map.c"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
void *start, *end;
|
||||
size_t size, written;
|
||||
|
||||
if (find_vdso_map(&start, &end))
|
||||
if (find_map(&start, &end, VDSO__MAP_NAME))
|
||||
return 1;
|
||||
|
||||
size = end - start;
|
||||
|
|
|
@ -119,4 +119,9 @@ int test__arch_unwind_sample(struct perf_sample *sample,
|
|||
struct thread *thread);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__arm__)
|
||||
int test__vectors_page(struct test *test, int subtest);
|
||||
#endif
|
||||
|
||||
#endif /* TESTS_H */
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
|
||||
printf "static const char *mount_flags[] = {\n"
|
||||
regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+MS_([[:alnum:]_]+)[[:space:]]+([[:digit:]]+)[[:space:]]*.*'
|
||||
egrep $regex ${header_dir}/fs.h | egrep -v '(MSK|VERBOSE|MGC_VAL)\>' | \
|
||||
egrep $regex ${header_dir}/mount.h | egrep -v '(MSK|VERBOSE|MGC_VAL)\>' | \
|
||||
sed -r "s/$regex/\2 \2 \1/g" | sort -n | \
|
||||
xargs printf "\t[%s ? (ilog2(%s) + 1) : 0] = \"%s\",\n"
|
||||
regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+MS_([[:alnum:]_]+)[[:space:]]+\(1<<([[:digit:]]+)\)[[:space:]]*.*'
|
||||
egrep $regex ${header_dir}/fs.h | \
|
||||
egrep $regex ${header_dir}/mount.h | \
|
||||
sed -r "s/$regex/\2 \1/g" | \
|
||||
xargs printf "\t[%s + 1] = \"%s\",\n"
|
||||
printf "};\n"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
static int find_vdso_map(void **start, void **end)
|
||||
static int find_map(void **start, void **end, const char *name)
|
||||
{
|
||||
FILE *maps;
|
||||
char line[128];
|
||||
|
@ -7,7 +7,7 @@ static int find_vdso_map(void **start, void **end)
|
|||
|
||||
maps = fopen("/proc/self/maps", "r");
|
||||
if (!maps) {
|
||||
fprintf(stderr, "vdso: cannot open maps\n");
|
||||
fprintf(stderr, "cannot open maps\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -21,8 +21,7 @@ static int find_vdso_map(void **start, void **end)
|
|||
if (m < 0)
|
||||
continue;
|
||||
|
||||
if (!strncmp(&line[m], VDSO__MAP_NAME,
|
||||
sizeof(VDSO__MAP_NAME) - 1))
|
||||
if (!strncmp(&line[m], name, strlen(name)))
|
||||
found = 1;
|
||||
}
|
||||
|
|
@ -18,10 +18,10 @@
|
|||
#include "debug.h"
|
||||
|
||||
/*
|
||||
* Include definition of find_vdso_map() also used in perf-read-vdso.c for
|
||||
* Include definition of find_map() also used in perf-read-vdso.c for
|
||||
* building perf-read-vdso32 and perf-read-vdsox32.
|
||||
*/
|
||||
#include "find-vdso-map.c"
|
||||
#include "find-map.c"
|
||||
|
||||
#define VDSO__TEMP_FILE_NAME "/tmp/perf-vdso.so-XXXXXX"
|
||||
|
||||
|
@ -76,7 +76,7 @@ static char *get_file(struct vdso_file *vdso_file)
|
|||
if (vdso_file->found)
|
||||
return vdso_file->temp_file_name;
|
||||
|
||||
if (vdso_file->error || find_vdso_map(&start, &end))
|
||||
if (vdso_file->error || find_map(&start, &end, VDSO__MAP_NAME))
|
||||
return NULL;
|
||||
|
||||
size = end - start;
|
||||
|
|
Loading…
Reference in New Issue