cbbfa7615c
* refs/heads/tmp-47d86d5: Linux 4.19.88 net: fec: fix clock count mis-match platform/x86: hp-wmi: Fix ACPI errors caused by passing 0 as input size platform/x86: hp-wmi: Fix ACPI errors caused by too small buffer dmaengine: stm32-dma: check whether length is aligned on FIFO threshold ASoC: stm32: sai: add missing put_device() ASoC: stm32: i2s: fix IRQ clearing ASoC: stm32: i2s: fix 16 bit format support ASoC: stm32: i2s: fix dma configuration pinctrl: stm32: fix memory leak issue mailbox: mailbox-test: fix null pointer if no mmio clk: stm32mp1: parent clocks update clk: stm32mp1: add CLK_SET_RATE_NO_REPARENT to Kernel clocks clk: stm32mp1: fix mcu divider table clk: stm32mp1: fix HSI divider flag hwrng: stm32 - fix unbalanced pm_runtime_enable media: stm32-dcmi: fix check of pm_runtime_get_sync return value media: stm32-dcmi: fix DMA corruption when stopping streaming crypto: stm32/hash - Fix hmac issue more than 256 bytes HID: core: check whether Usage Page item is after Usage ID items tcp: exit if nothing to retransmit on RTO timeout mailbox: stm32_ipcc: add spinlock to fix channels concurrent access drm/atmel-hlcdc: revert shift by 8 mtd: spi-nor: cast to u64 to avoid uint overflows mtd: rawnand: atmel: fix possible object reference leak mtd: rawnand: atmel: Fix spelling mistake in error message net: macb driver, check for SKBTX_HW_TSTAMP net: macb: Fix SUBNS increment and increase resolution watchdog: sama5d4: fix WDD value to be always set to max ext4: add more paranoia checking in ext4_expand_extra_isize handling net: macb: add missed tasklet_kill net: sched: fix `tc -s class show` no bstats on class with nolock subqueues sctp: cache netns in sctp_ep_common tipc: fix link name length check selftests: bpf: test_sockmap: handle file creation failures gracefully openvswitch: remove another BUG_ON() openvswitch: drop unneeded BUG_ON() in ovs_flow_cmd_build_info() slip: Fix use-after-free Read in slip_open sctp: Fix memory leak in sctp_sf_do_5_2_4_dupcook openvswitch: fix flow command message size net: psample: fix skb_over_panic macvlan: schedule bc_work even if error media: atmel: atmel-isc: fix INIT_WORK misplacement media: atmel: atmel-isc: fix asd memory allocation pwm: Clear chip_data in pwm_put() net: macb: fix error format in dev_err() media: v4l2-ctrl: fix flags for DO_WHITE_BALANCE xfrm: Fix memleak on xfrm state destroy thunderbolt: Power cycle the router if NVM authentication fails mei: me: add comet point V device id mei: bus: prefix device names on bus with the bus name USB: serial: ftdi_sio: add device IDs for U-Blox C099-F9P staging: rtl8723bs: Add 024c:0525 to the list of SDIO device-ids staging: rtl8723bs: Drop ACPI device ids staging: rtl8192e: fix potential use after free usb: dwc2: use a longer core rest timeout in dwc2_core_reset() clk: at91: generated: set audio_pll_allowed in at91_clk_register_generated() clk: at91: fix update bit maps on CFG_MOR write mm, gup: add missing refcount overflow checks on s390 mtd: Remove a debug trace in mtdpart.c xdp: fix cpumap redirect SKB creation bug powerpc/pseries/dlpar: Fix a missing check in dlpar_parse_cc_property() ASoC: rt5645: Headphone Jack sense inverts on the LattePanda board RDMA/hns: Use GFP_ATOMIC in hns_roce_v2_modify_qp RDMA/hns: Fix the state of rereg mr RDMA/hns: Bugfix for the scene without receiver queue RDMA/hns: Fix the bug with updating rq head pointer when flush cqe scsi: libsas: Check SMP PHY control function result scsi: hisi_sas: shutdown axi bus to avoid exception CQ returned ACPI / APEI: Switch estatus pool to use vmalloc memory ACPI / APEI: Don't wait to serialise with oops messages when panic()ing scsi: libsas: Support SATA PHY connection rate unmatch fixing during discovery apparmor: delete the dentry in aafs_remove() to avoid a leak iommu/amd: Fix NULL dereference bug in match_hid_uid net: hns3: fix an issue for hns3_update_new_int_gl net: hns3: fix an issue for hclgevf_ae_get_hdev net: hns3: fix PFC not setting problem for DCB module net: hns3: Change fw error code NOT_EXEC to NOT_SUPPORTED bpf: drop refcount if bpf_map_new_fd() fails in map_create() kvm: properly check debugfs dentry before using it net: dev: Use unsigned integer as an argument to left-shift mmc: core: align max segment size with logical block size bpf: decrease usercnt if bpf_map_new_fd() fails in bpf_map_get_fd_by_id() sctp: don't compare hb_timer expire date before starting it net: ip6_gre: do not report erspan_ver for ip6gre or ip6gretap net: ip_gre: do not report erspan_ver for gre or gretap net: fix possible overflow in __sk_mem_raise_allocated() geneve: change NET_UDP_TUNNEL dependency to select sfc: initialise found bitmap in efx_ef10_mtd_probe ASoC: samsung: i2s: Fix prescaler setting for the secondary DAI tipc: fix skb may be leaky in tipc_link_input net/smc: fix byte_order for rx_curs_confirmed blktrace: Show requests without sector net/smc: fix sender_free computation xfs: end sync buffer I/O properly on shutdown error mm/hotplug: invalid PFNs from pfn_to_online_page() net/smc: don't wait for send buffer space when data was already sent net/smc: prevent races between smc_lgr_terminate() and smc_conn_free() decnet: fix DN_IFREQ_SIZE ip_tunnel: Make none-tunnel-dst tunnel port work with lwtunnel sfc: suppress duplicate nvmem partition types in efx_ef10_mtd_probe gpu: ipu-v3: pre: don't trigger update if buffer address doesn't change serial: 8250: Fix serial8250 initialization crash net/core/neighbour: fix kmemleak minimal reference count for hash tables PCI/MSI: Return -ENOSPC from pci_alloc_irq_vectors_affinity() ata: ahci: mvebu: do Armada 38x configuration only on relevant SoCs net/core/neighbour: tell kmemleak about hash tables tipc: fix memory leak in tipc_nl_compat_publ_dump mtd: Check add_mtd_device() ret code lib/genalloc.c: include vmalloc.h drivers/base/platform.c: kmemleak ignore a known leak fork: fix some -Wmissing-prototypes warnings lib/genalloc.c: use vzalloc_node() to allocate the bitmap lib/genalloc.c: fix allocation of aligned buffer from non-aligned chunk firmware: arm_sdei: Fix DT platform device creation firmware: arm_sdei: fix wrong of_node_put() in init function infiniband/qedr: Potential null ptr dereference of qp infiniband: bnxt_re: qplib: Check the return value of send_message xprtrdma: Prevent leak of rpcrdma_rep objects netfilter: nf_tables: fix a missing check of nla_put_failure tools/vm/page-types.c: fix "kpagecount returned fewer pages than expected" failures mm/page_alloc.c: deduplicate __memblock_free_early() and memblock_free() mm/page_alloc.c: use a single function to free page mm/page_alloc.c: free order-0 pages through PCP in page_frag_free() vmscan: return NODE_RECLAIM_NOSCAN in node_reclaim() when CONFIG_NUMA is n ocfs2: clear journal dirty flag after shutdown journal net/wan/fsl_ucc_hdlc: Avoid double free in ucc_hdlc_probe() net: marvell: fix a missing check of acpi_match_device tipc: fix a missing check of genlmsg_put atl1e: checking the status of atl1e_write_phy_reg net: dsa: bcm_sf2: Propagate error value from mdio_write net: stmicro: fix a missing check of clk_prepare net: (cpts) fix a missing check of clk_prepare um: Make GCOV depend on !KCOV um: Include sys/uio.h to have writev() f2fs: fix to dirty inode synchronously f2fs: fix block address for __check_sit_bitmap net/net_namespace: Check the return value of register_pernet_subsys() net/netlink_compat: Fix a missing check of nla_parse_nested pwm: clps711x: Fix period calculation crypto: mxc-scc - fix build warnings on ARM64 powerpc: Fix HMIs on big-endian with CONFIG_RELOCATABLE=y powerpc/pseries: Fix node leak in update_lmb_associativity_index() powerpc/83xx: handle machine check caused by watchdog timer regulator: tps65910: fix a missing check of return value bpf/cpumap: make sure frame_size for build_skb is aligned if headroom isn't IB/rxe: Make counters thread safe drbd: fix print_st_err()'s prototype to match the definition drbd: do not block when adjusting "disk-options" while IO is frozen drbd: reject attach of unsuitable uuids even if connected drbd: ignore "all zero" peer volume sizes in handshake powerpc/powernv/eeh/npu: Fix uninitialized variables in opal_pci_eeh_freeze_status vfio/spapr_tce: Get rid of possible infinite loop powerpc/44x/bamboo: Fix PCI range powerpc/mm: Make NULL pointer deferences explicit on bad page faults. powerpc/prom: fix early DEBUG messages powerpc/32: Avoid unsupported flags with clang powerpc/perf: Fix unit_sel/cache_sel checks ath6kl: Fix off by one error in scan completion ath6kl: Only use match sets when firmware supports it brcmfmac: Fix access point mode scsi: csiostor: fix incorrect dma device in case of vport scsi: qla2xxx: deadlock by configfs_depend_item RDMA/srp: Propagate ib_post_send() failures to the SCSI mid-layer openrisc: Fix broken paths to arch/or32 serial: max310x: Fix tx_empty() callback Bluetooth: hci_bcm: Handle specific unknown packets after firmware loading drivers/regulator: fix a missing check of return value powerpc/xmon: fix dump_segments() powerpc/book3s/32: fix number of bats in p/v_block_mapped() vxlan: Fix error path in __vxlan_dev_create() clocksource/drivers/fttmr010: Fix invalid interrupt register access IB/qib: Fix an error code in qib_sdma_verbs_send() xfs: Fix bulkstat compat ioctls on x32 userspace. xfs: Align compat attrlist_by_handle with native implementation. dm raid: fix false -EBUSY when handling check/repair message gfs2: take jdata unstuff into account in do_grow dm flakey: Properly corrupt multi-page bios. HID: doc: fix wrong data structure reference for UHID_OUTPUT pinctrl: sh-pfc: sh7734: Fix shifted values in IPSR10 pinctrl: sh-pfc: sh7264: Fix PFCR3 and PFCR0 register configuration pinctrl: sh-pfc: r8a77990: Fix MOD_SEL0 SEL_I2C1 field width KVM: s390: unregister debug feature on failing arch init bnxt_en: query force speeds before disabling autoneg mode. bnxt_en: Save ring statistics before reset. bnxt_en: Return linux standard errors in bnxt_ethtool.c exofs_mount(): fix leaks on failure exits netfilter: nf_nat_sip: fix RTP/RTCP source port translations net/mlx5: Continue driver initialization despite debugfs failure pinctrl: xway: fix gpio-hog related boot issues memory: omap-gpmc: Get the header of the enum vfio-mdev/samples: Use u8 instead of char for handle functions kprobes/x86: Show x86-64 specific blacklisted symbols correctly kprobes: Blacklist symbols in arch-defined prohibited area xen/pciback: Check dev_data before using it kprobes/x86/xen: blacklist non-attachable xen interrupt functions serial: 8250: Rate limit serial port rx interrupts during input overruns gpio: raspberrypi-exp: decrease refcount on firmware dt node HID: intel-ish-hid: fixes incorrect error handling serial: sh-sci: Fix crash in rx_timer_fn() on PIO fallback btrfs: only track ref_heads in delayed_ref_updates Btrfs: allow clear_extent_dirty() to receive a cached extent state record btrfs: dev-replace: set result code of cancel by status of scrub btrfs: fix ncopies raid_attr for RAID56 btrfs: Check for missing device before bio submission in btrfs_map_bio usb: ehci-omap: Fix deferred probe for phy handling mtd: rawnand: sunxi: Write pageprog related opcodes to WCMD_SET mmc: meson-gx: make sure the descriptor is stopped on errors VSOCK: bind to random port for VMADDR_PORT_ANY crypto/chelsio/chtls: listen fails with multiadapt Revert "KVM: nVMX: move check_vmentry_postreqs() call to nested_vmx_enter_non_root_mode()" Revert "KVM: nVMX: reset cache/shadows when switching loaded VMCS" kvm: vmx: Set IA32_TSC_AUX for legacy mode guests gpiolib: Fix return value of gpio_to_desc() stub if !GPIOLIB gpio: pca953x: Fix AI overflow on PCAL6524 iwlwifi: pcie: set cmd_len in the correct place iwlwifi: pcie: fix erroneous print iwlwifi: mvm: force TCM re-evaluation on TCM resume iwlwifi: move iwl_nvm_check_version() into dvm microblaze: fix multiple bugs in arch/microblaze/boot/Makefile microblaze: move "... is ready" messages to arch/microblaze/Makefile microblaze: adjust the help to the real behavior ubi: Do not drop UBI device reference before using ubi: Put MTD device after it is not used ubifs: Fix default compression selection in ubifs nvme: fix kernel paging oops xfs: require both realtime inodes to mount bcache: do not mark writeback_running too early bcache: do not check if debug dentry is ERR or NULL explicitly on remove rtl818x: fix potential use after free brcmfmac: set SDIO F1 MesBusyCtrl for CYW4373 brcmfmac: set F2 watermark to 256 for 4373 mwifiex: debugfs: correct histogram spacing, formatting mwifiex: fix potential NULL dereference and use after free arm64: dts: renesas: draak: Fix CVBS input crypto: user - support incremental algorithm dumps s390/zcrypt: make sysfs reset attribute trigger queue reset nvme: provide fallback for discard alloc failure scsi: qla2xxx: Fix for FC-NVMe discovery for NPIV port scsi: qla2xxx: Fix NPIV handling for FC-NVMe scsi: lpfc: Enable Management features for IF_TYPE=6 ACPI / LPSS: Ignore acpi_device_fix_up_power() return value ARM: ks8695: fix section mismatch warning xfs: zero length symlinks are not valid PM / AVS: SmartReflex: NULL check before some freeing functions is not needed RDMA/vmw_pvrdma: Use atomic memory allocation in create AH arm64: preempt: Fix big-endian when checking preempt count in assembly RDMA/hns: Fix the bug while use multi-hop of pbl ARM: OMAP1: fix USB configuration for device-only setups platform/x86: mlx-platform: Fix LED configuration bus: ti-sysc: Check for no-reset and no-idle flags at the child level arm64: smp: Handle errors reported by the firmware arm64: mm: Prevent mismatched 52-bit VA support ARM: dts: Fix hsi gdd range for omap4 parisc: Fix HP SDC hpa address output parisc: Fix serio address output ARM: dts: imx53-voipac-dmm-668: Fix memory node duplication ARM: dts: imx25: Fix memory node duplication ARM: dts: imx27: Fix memory node duplication ARM: dts: imx1: Fix memory node duplication ARM: dts: imx23: Fix memory node duplication ARM: dts: imx50: Fix memory node duplication ARM: dts: imx6sl: Fix memory node duplication ARM: dts: imx6sx: Fix memory node duplication ARM: dts: imx6ul: Fix memory node duplication ARM: dts: imx7: Fix memory node duplication ARM: dts: imx35: Fix memory node duplication ARM: dts: imx31: Fix memory node duplication ARM: dts: imx53: Fix memory node duplication ARM: dts: imx51: Fix memory node duplication ARM: debug-imx: only define DEBUG_IMX_UART_PORT if needed tracing: Lock event_mutex before synth_event_mutex ARM: dts: Fix up SQ201 flash access scsi: lpfc: Fix dif and first burst use in write commands scsi: lpfc: Fix kernel Oops due to null pring pointers scsi: target/tcmu: Fix queue_cmd_ring() declaration pwm: bcm-iproc: Prevent unloading the driver module while in use block: drbd: remove a stray unlock in __drbd_send_protocol() mac80211: fix station inactive_time shortly after boot net/fq_impl: Switch to kvmalloc() for memory allocation ceph: return -EINVAL if given fsc mount option on kernel w/o support net: mscc: ocelot: fix __ocelot_rmw_ix prototype net: bcmgenet: reapply manual settings to the PHY net: bcmgenet: use RGMII loopback for MAC reset scripts/gdb: fix debugging modules compiled with hot/cold partitioning ASoC: stm32: sai: add restriction on mmap support watchdog: meson: Fix the wrong value of left time can: mcp251x: mcp251x_restart_work_handler(): Fix potential force_quit race condition can: flexcan: increase error counters if skb enqueueing via can_rx_offload_queue_sorted() fails can: rx-offload: can_rx_offload_irq_offload_fifo(): continue on error can: rx-offload: can_rx_offload_irq_offload_timestamp(): continue on error can: rx-offload: can_rx_offload_offload_one(): use ERR_PTR() to propagate error value in case of errors can: rx-offload: can_rx_offload_offload_one(): increment rx_fifo_errors on queue overflow or OOM can: rx-offload: can_rx_offload_offload_one(): do not increase the skb_queue beyond skb_queue_len_max can: rx-offload: can_rx_offload_queue_tail(): fix error handling, avoid skb mem leak can: c_can: D_CAN: c_can_chip_config(): perform a sofware reset on open can: peak_usb: report bus recovery as well bridge: ebtables: don't crash when using dnat target in output chains net: fec: add missed clk_disable_unprepare in remove clk: ti: clkctrl: Fix failed to enable error with double udelay timeout clk: ti: dra7-atl-clock: Remove ti_clk_add_alias call x86/resctrl: Prevent NULL pointer dereference when reading mondata idr: Fix idr_alloc_u32 on 32-bit systems idr: Fix integer overflow in idr_for_each_entry powerpc/bpf: Fix tail call implementation samples/bpf: fix build by setting HAVE_ATTR_TEST to zero ARM: dts: sun8i-a83t-tbs-a711: Fix WiFi resume from suspend clk: sunxi-ng: a80: fix the zero'ing of bits 16 and 18 clk: sunxi: Fix operator precedence in sunxi_divs_clk_setup clk: at91: avoid sleeping early reset: fix reset_control_ops kerneldoc comment ARM: dts: imx6qdl-sabreauto: Fix storm of accelerometer interrupts pinctrl: cherryview: Allocate IRQ chip dynamic clk: samsung: exynos5420: Preserve PLL configuration during suspend/resume ASoC: kirkwood: fix device remove ordering ASoC: kirkwood: fix external clock probe defer clk: samsung: exynos5433: Fix error paths reset: Fix memory leak in reset_control_array_put() ASoC: compress: fix unsigned integer overflow check ASoC: msm8916-wcd-analog: Fix RX1 selection in RDAC2 MUX clocksource/drivers/mediatek: Fix error handling clk: meson: gxbb: let sar_adc_clk_div set the parent clock rate Conflicts: drivers/mmc/core/queue.c Change-Id: I17f5829400ece4e39be4c9f6223fff206c710d06 Signed-off-by: Ivaylo Georgiev <irgeorgiev@codeaurora.org>
636 lines
20 KiB
C
636 lines
20 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#ifndef _LINUX_TRACE_EVENT_H
|
|
#define _LINUX_TRACE_EVENT_H
|
|
|
|
#include <linux/ring_buffer.h>
|
|
#include <linux/trace_seq.h>
|
|
#include <linux/percpu.h>
|
|
#include <linux/hardirq.h>
|
|
#include <linux/perf_event.h>
|
|
#include <linux/tracepoint.h>
|
|
#include <linux/coresight-stm.h>
|
|
|
|
struct trace_array;
|
|
struct trace_buffer;
|
|
struct tracer;
|
|
struct dentry;
|
|
struct bpf_prog;
|
|
|
|
const char *trace_print_flags_seq(struct trace_seq *p, const char *delim,
|
|
unsigned long flags,
|
|
const struct trace_print_flags *flag_array);
|
|
|
|
const char *trace_print_symbols_seq(struct trace_seq *p, unsigned long val,
|
|
const struct trace_print_flags *symbol_array);
|
|
|
|
#if BITS_PER_LONG == 32
|
|
const char *trace_print_flags_seq_u64(struct trace_seq *p, const char *delim,
|
|
unsigned long long flags,
|
|
const struct trace_print_flags_u64 *flag_array);
|
|
|
|
const char *trace_print_symbols_seq_u64(struct trace_seq *p,
|
|
unsigned long long val,
|
|
const struct trace_print_flags_u64
|
|
*symbol_array);
|
|
#endif
|
|
|
|
const char *trace_print_bitmask_seq(struct trace_seq *p, void *bitmask_ptr,
|
|
unsigned int bitmask_size);
|
|
|
|
const char *trace_print_hex_seq(struct trace_seq *p,
|
|
const unsigned char *buf, int len,
|
|
bool concatenate);
|
|
|
|
const char *trace_print_array_seq(struct trace_seq *p,
|
|
const void *buf, int count,
|
|
size_t el_size);
|
|
|
|
struct trace_iterator;
|
|
struct trace_event;
|
|
|
|
int trace_raw_output_prep(struct trace_iterator *iter,
|
|
struct trace_event *event);
|
|
|
|
/*
|
|
* The trace entry - the most basic unit of tracing. This is what
|
|
* is printed in the end as a single line in the trace output, such as:
|
|
*
|
|
* bash-15816 [01] 235.197585: idle_cpu <- irq_enter
|
|
*/
|
|
struct trace_entry {
|
|
unsigned short type;
|
|
unsigned char flags;
|
|
unsigned char preempt_count;
|
|
int pid;
|
|
};
|
|
|
|
#define TRACE_EVENT_TYPE_MAX \
|
|
((1 << (sizeof(((struct trace_entry *)0)->type) * 8)) - 1)
|
|
|
|
/*
|
|
* Trace iterator - used by printout routines who present trace
|
|
* results to users and which routines might sleep, etc:
|
|
*/
|
|
struct trace_iterator {
|
|
struct trace_array *tr;
|
|
struct tracer *trace;
|
|
struct trace_buffer *trace_buffer;
|
|
void *private;
|
|
int cpu_file;
|
|
struct mutex mutex;
|
|
struct ring_buffer_iter **buffer_iter;
|
|
unsigned long iter_flags;
|
|
|
|
/* trace_seq for __print_flags() and __print_symbolic() etc. */
|
|
struct trace_seq tmp_seq;
|
|
|
|
cpumask_var_t started;
|
|
|
|
/* it's true when current open file is snapshot */
|
|
bool snapshot;
|
|
|
|
/* The below is zeroed out in pipe_read */
|
|
struct trace_seq seq;
|
|
struct trace_entry *ent;
|
|
unsigned long lost_events;
|
|
int leftover;
|
|
int ent_size;
|
|
int cpu;
|
|
u64 ts;
|
|
|
|
loff_t pos;
|
|
long idx;
|
|
|
|
/* All new field here will be zeroed out in pipe_read */
|
|
};
|
|
|
|
enum trace_iter_flags {
|
|
TRACE_FILE_LAT_FMT = 1,
|
|
TRACE_FILE_ANNOTATE = 2,
|
|
TRACE_FILE_TIME_IN_NS = 4,
|
|
};
|
|
|
|
|
|
typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,
|
|
int flags, struct trace_event *event);
|
|
|
|
struct trace_event_functions {
|
|
trace_print_func trace;
|
|
trace_print_func raw;
|
|
trace_print_func hex;
|
|
trace_print_func binary;
|
|
};
|
|
|
|
struct trace_event {
|
|
struct hlist_node node;
|
|
struct list_head list;
|
|
int type;
|
|
struct trace_event_functions *funcs;
|
|
};
|
|
|
|
extern int register_trace_event(struct trace_event *event);
|
|
extern int unregister_trace_event(struct trace_event *event);
|
|
|
|
/* Return values for print_line callback */
|
|
enum print_line_t {
|
|
TRACE_TYPE_PARTIAL_LINE = 0, /* Retry after flushing the seq */
|
|
TRACE_TYPE_HANDLED = 1,
|
|
TRACE_TYPE_UNHANDLED = 2, /* Relay to other output functions */
|
|
TRACE_TYPE_NO_CONSUME = 3 /* Handled but ask to not consume */
|
|
};
|
|
|
|
enum print_line_t trace_handle_return(struct trace_seq *s);
|
|
|
|
void tracing_generic_entry_update(struct trace_entry *entry,
|
|
unsigned long flags,
|
|
int pc);
|
|
struct trace_event_file;
|
|
|
|
struct ring_buffer_event *
|
|
trace_event_buffer_lock_reserve(struct ring_buffer **current_buffer,
|
|
struct trace_event_file *trace_file,
|
|
int type, unsigned long len,
|
|
unsigned long flags, int pc);
|
|
|
|
#define TRACE_RECORD_CMDLINE BIT(0)
|
|
#define TRACE_RECORD_TGID BIT(1)
|
|
|
|
void tracing_record_taskinfo(struct task_struct *task, int flags);
|
|
void tracing_record_taskinfo_sched_switch(struct task_struct *prev,
|
|
struct task_struct *next, int flags);
|
|
|
|
void tracing_record_cmdline(struct task_struct *task);
|
|
void tracing_record_tgid(struct task_struct *task);
|
|
|
|
int trace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...);
|
|
|
|
struct event_filter;
|
|
|
|
enum trace_reg {
|
|
TRACE_REG_REGISTER,
|
|
TRACE_REG_UNREGISTER,
|
|
#ifdef CONFIG_PERF_EVENTS
|
|
TRACE_REG_PERF_REGISTER,
|
|
TRACE_REG_PERF_UNREGISTER,
|
|
TRACE_REG_PERF_OPEN,
|
|
TRACE_REG_PERF_CLOSE,
|
|
/*
|
|
* These (ADD/DEL) use a 'boolean' return value, where 1 (true) means a
|
|
* custom action was taken and the default action is not to be
|
|
* performed.
|
|
*/
|
|
TRACE_REG_PERF_ADD,
|
|
TRACE_REG_PERF_DEL,
|
|
#endif
|
|
};
|
|
|
|
struct trace_event_call;
|
|
|
|
struct trace_event_class {
|
|
const char *system;
|
|
void *probe;
|
|
#ifdef CONFIG_PERF_EVENTS
|
|
void *perf_probe;
|
|
#endif
|
|
int (*reg)(struct trace_event_call *event,
|
|
enum trace_reg type, void *data);
|
|
int (*define_fields)(struct trace_event_call *);
|
|
struct list_head *(*get_fields)(struct trace_event_call *);
|
|
struct list_head fields;
|
|
int (*raw_init)(struct trace_event_call *);
|
|
};
|
|
|
|
extern int trace_event_reg(struct trace_event_call *event,
|
|
enum trace_reg type, void *data);
|
|
|
|
struct trace_event_buffer {
|
|
struct ring_buffer *buffer;
|
|
struct ring_buffer_event *event;
|
|
struct trace_event_file *trace_file;
|
|
void *entry;
|
|
unsigned long flags;
|
|
int pc;
|
|
};
|
|
|
|
void *trace_event_buffer_reserve(struct trace_event_buffer *fbuffer,
|
|
struct trace_event_file *trace_file,
|
|
unsigned long len);
|
|
|
|
void trace_event_buffer_commit(struct trace_event_buffer *fbuffer,
|
|
unsigned long len);
|
|
|
|
enum {
|
|
TRACE_EVENT_FL_FILTERED_BIT,
|
|
TRACE_EVENT_FL_CAP_ANY_BIT,
|
|
TRACE_EVENT_FL_NO_SET_FILTER_BIT,
|
|
TRACE_EVENT_FL_IGNORE_ENABLE_BIT,
|
|
TRACE_EVENT_FL_TRACEPOINT_BIT,
|
|
TRACE_EVENT_FL_KPROBE_BIT,
|
|
TRACE_EVENT_FL_UPROBE_BIT,
|
|
};
|
|
|
|
/*
|
|
* Event flags:
|
|
* FILTERED - The event has a filter attached
|
|
* CAP_ANY - Any user can enable for perf
|
|
* NO_SET_FILTER - Set when filter has error and is to be ignored
|
|
* IGNORE_ENABLE - For trace internal events, do not enable with debugfs file
|
|
* TRACEPOINT - Event is a tracepoint
|
|
* KPROBE - Event is a kprobe
|
|
* UPROBE - Event is a uprobe
|
|
*/
|
|
enum {
|
|
TRACE_EVENT_FL_FILTERED = (1 << TRACE_EVENT_FL_FILTERED_BIT),
|
|
TRACE_EVENT_FL_CAP_ANY = (1 << TRACE_EVENT_FL_CAP_ANY_BIT),
|
|
TRACE_EVENT_FL_NO_SET_FILTER = (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT),
|
|
TRACE_EVENT_FL_IGNORE_ENABLE = (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT),
|
|
TRACE_EVENT_FL_TRACEPOINT = (1 << TRACE_EVENT_FL_TRACEPOINT_BIT),
|
|
TRACE_EVENT_FL_KPROBE = (1 << TRACE_EVENT_FL_KPROBE_BIT),
|
|
TRACE_EVENT_FL_UPROBE = (1 << TRACE_EVENT_FL_UPROBE_BIT),
|
|
};
|
|
|
|
#define TRACE_EVENT_FL_UKPROBE (TRACE_EVENT_FL_KPROBE | TRACE_EVENT_FL_UPROBE)
|
|
|
|
struct trace_event_call {
|
|
struct list_head list;
|
|
struct trace_event_class *class;
|
|
union {
|
|
char *name;
|
|
/* Set TRACE_EVENT_FL_TRACEPOINT flag when using "tp" */
|
|
struct tracepoint *tp;
|
|
};
|
|
struct trace_event event;
|
|
char *print_fmt;
|
|
struct event_filter *filter;
|
|
void *mod;
|
|
void *data;
|
|
/*
|
|
* bit 0: filter_active
|
|
* bit 1: allow trace by non root (cap any)
|
|
* bit 2: failed to apply filter
|
|
* bit 3: trace internal event (do not enable)
|
|
* bit 4: Event was enabled by module
|
|
* bit 5: use call filter rather than file filter
|
|
* bit 6: Event is a tracepoint
|
|
*/
|
|
int flags; /* static flags of different events */
|
|
|
|
#ifdef CONFIG_PERF_EVENTS
|
|
int perf_refcount;
|
|
struct hlist_head __percpu *perf_events;
|
|
struct bpf_prog_array __rcu *prog_array;
|
|
|
|
int (*perf_perm)(struct trace_event_call *,
|
|
struct perf_event *);
|
|
#endif
|
|
};
|
|
|
|
#ifdef CONFIG_PERF_EVENTS
|
|
static inline bool bpf_prog_array_valid(struct trace_event_call *call)
|
|
{
|
|
/*
|
|
* This inline function checks whether call->prog_array
|
|
* is valid or not. The function is called in various places,
|
|
* outside rcu_read_lock/unlock, as a heuristic to speed up execution.
|
|
*
|
|
* If this function returns true, and later call->prog_array
|
|
* becomes false inside rcu_read_lock/unlock region,
|
|
* we bail out then. If this function return false,
|
|
* there is a risk that we might miss a few events if the checking
|
|
* were delayed until inside rcu_read_lock/unlock region and
|
|
* call->prog_array happened to become non-NULL then.
|
|
*
|
|
* Here, READ_ONCE() is used instead of rcu_access_pointer().
|
|
* rcu_access_pointer() requires the actual definition of
|
|
* "struct bpf_prog_array" while READ_ONCE() only needs
|
|
* a declaration of the same type.
|
|
*/
|
|
return !!READ_ONCE(call->prog_array);
|
|
}
|
|
#endif
|
|
|
|
static inline const char *
|
|
trace_event_name(struct trace_event_call *call)
|
|
{
|
|
if (call->flags & TRACE_EVENT_FL_TRACEPOINT)
|
|
return call->tp ? call->tp->name : NULL;
|
|
else
|
|
return call->name;
|
|
}
|
|
|
|
struct trace_array;
|
|
struct trace_subsystem_dir;
|
|
|
|
enum {
|
|
EVENT_FILE_FL_ENABLED_BIT,
|
|
EVENT_FILE_FL_RECORDED_CMD_BIT,
|
|
EVENT_FILE_FL_RECORDED_TGID_BIT,
|
|
EVENT_FILE_FL_FILTERED_BIT,
|
|
EVENT_FILE_FL_NO_SET_FILTER_BIT,
|
|
EVENT_FILE_FL_SOFT_MODE_BIT,
|
|
EVENT_FILE_FL_SOFT_DISABLED_BIT,
|
|
EVENT_FILE_FL_TRIGGER_MODE_BIT,
|
|
EVENT_FILE_FL_TRIGGER_COND_BIT,
|
|
EVENT_FILE_FL_PID_FILTER_BIT,
|
|
EVENT_FILE_FL_WAS_ENABLED_BIT,
|
|
};
|
|
|
|
/*
|
|
* Event file flags:
|
|
* ENABLED - The event is enabled
|
|
* RECORDED_CMD - The comms should be recorded at sched_switch
|
|
* RECORDED_TGID - The tgids should be recorded at sched_switch
|
|
* FILTERED - The event has a filter attached
|
|
* NO_SET_FILTER - Set when filter has error and is to be ignored
|
|
* SOFT_MODE - The event is enabled/disabled by SOFT_DISABLED
|
|
* SOFT_DISABLED - When set, do not trace the event (even though its
|
|
* tracepoint may be enabled)
|
|
* TRIGGER_MODE - When set, invoke the triggers associated with the event
|
|
* TRIGGER_COND - When set, one or more triggers has an associated filter
|
|
* PID_FILTER - When set, the event is filtered based on pid
|
|
* WAS_ENABLED - Set when enabled to know to clear trace on module removal
|
|
*/
|
|
enum {
|
|
EVENT_FILE_FL_ENABLED = (1 << EVENT_FILE_FL_ENABLED_BIT),
|
|
EVENT_FILE_FL_RECORDED_CMD = (1 << EVENT_FILE_FL_RECORDED_CMD_BIT),
|
|
EVENT_FILE_FL_RECORDED_TGID = (1 << EVENT_FILE_FL_RECORDED_TGID_BIT),
|
|
EVENT_FILE_FL_FILTERED = (1 << EVENT_FILE_FL_FILTERED_BIT),
|
|
EVENT_FILE_FL_NO_SET_FILTER = (1 << EVENT_FILE_FL_NO_SET_FILTER_BIT),
|
|
EVENT_FILE_FL_SOFT_MODE = (1 << EVENT_FILE_FL_SOFT_MODE_BIT),
|
|
EVENT_FILE_FL_SOFT_DISABLED = (1 << EVENT_FILE_FL_SOFT_DISABLED_BIT),
|
|
EVENT_FILE_FL_TRIGGER_MODE = (1 << EVENT_FILE_FL_TRIGGER_MODE_BIT),
|
|
EVENT_FILE_FL_TRIGGER_COND = (1 << EVENT_FILE_FL_TRIGGER_COND_BIT),
|
|
EVENT_FILE_FL_PID_FILTER = (1 << EVENT_FILE_FL_PID_FILTER_BIT),
|
|
EVENT_FILE_FL_WAS_ENABLED = (1 << EVENT_FILE_FL_WAS_ENABLED_BIT),
|
|
};
|
|
|
|
struct trace_event_file {
|
|
struct list_head list;
|
|
struct trace_event_call *event_call;
|
|
struct event_filter __rcu *filter;
|
|
struct dentry *dir;
|
|
struct trace_array *tr;
|
|
struct trace_subsystem_dir *system;
|
|
struct list_head triggers;
|
|
|
|
/*
|
|
* 32 bit flags:
|
|
* bit 0: enabled
|
|
* bit 1: enabled cmd record
|
|
* bit 2: enable/disable with the soft disable bit
|
|
* bit 3: soft disabled
|
|
* bit 4: trigger enabled
|
|
*
|
|
* Note: The bits must be set atomically to prevent races
|
|
* from other writers. Reads of flags do not need to be in
|
|
* sync as they occur in critical sections. But the way flags
|
|
* is currently used, these changes do not affect the code
|
|
* except that when a change is made, it may have a slight
|
|
* delay in propagating the changes to other CPUs due to
|
|
* caching and such. Which is mostly OK ;-)
|
|
*/
|
|
unsigned long flags;
|
|
atomic_t sm_ref; /* soft-mode reference counter */
|
|
atomic_t tm_ref; /* trigger-mode reference counter */
|
|
};
|
|
|
|
#define __TRACE_EVENT_FLAGS(name, value) \
|
|
static int __init trace_init_flags_##name(void) \
|
|
{ \
|
|
event_##name.flags |= value; \
|
|
return 0; \
|
|
} \
|
|
early_initcall(trace_init_flags_##name);
|
|
|
|
#define __TRACE_EVENT_PERF_PERM(name, expr...) \
|
|
static int perf_perm_##name(struct trace_event_call *tp_event, \
|
|
struct perf_event *p_event) \
|
|
{ \
|
|
return ({ expr; }); \
|
|
} \
|
|
static int __init trace_init_perf_perm_##name(void) \
|
|
{ \
|
|
event_##name.perf_perm = &perf_perm_##name; \
|
|
return 0; \
|
|
} \
|
|
early_initcall(trace_init_perf_perm_##name);
|
|
|
|
#define PERF_MAX_TRACE_SIZE 2048
|
|
|
|
#define MAX_FILTER_STR_VAL 256 /* Should handle KSYM_SYMBOL_LEN */
|
|
|
|
enum event_trigger_type {
|
|
ETT_NONE = (0),
|
|
ETT_TRACE_ONOFF = (1 << 0),
|
|
ETT_SNAPSHOT = (1 << 1),
|
|
ETT_STACKTRACE = (1 << 2),
|
|
ETT_EVENT_ENABLE = (1 << 3),
|
|
ETT_EVENT_HIST = (1 << 4),
|
|
ETT_HIST_ENABLE = (1 << 5),
|
|
};
|
|
|
|
extern int filter_match_preds(struct event_filter *filter, void *rec);
|
|
|
|
extern enum event_trigger_type
|
|
event_triggers_call(struct trace_event_file *file, void *rec,
|
|
struct ring_buffer_event *event);
|
|
extern void
|
|
event_triggers_post_call(struct trace_event_file *file,
|
|
enum event_trigger_type tt);
|
|
|
|
bool trace_event_ignore_this_pid(struct trace_event_file *trace_file);
|
|
|
|
/**
|
|
* trace_trigger_soft_disabled - do triggers and test if soft disabled
|
|
* @file: The file pointer of the event to test
|
|
*
|
|
* If any triggers without filters are attached to this event, they
|
|
* will be called here. If the event is soft disabled and has no
|
|
* triggers that require testing the fields, it will return true,
|
|
* otherwise false.
|
|
*/
|
|
static inline bool
|
|
trace_trigger_soft_disabled(struct trace_event_file *file)
|
|
{
|
|
unsigned long eflags = file->flags;
|
|
|
|
if (!(eflags & EVENT_FILE_FL_TRIGGER_COND)) {
|
|
if (eflags & EVENT_FILE_FL_TRIGGER_MODE)
|
|
event_triggers_call(file, NULL, NULL);
|
|
if (eflags & EVENT_FILE_FL_SOFT_DISABLED)
|
|
return true;
|
|
if (eflags & EVENT_FILE_FL_PID_FILTER)
|
|
return trace_event_ignore_this_pid(file);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#ifdef CONFIG_BPF_EVENTS
|
|
unsigned int trace_call_bpf(struct trace_event_call *call, void *ctx);
|
|
int perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog);
|
|
void perf_event_detach_bpf_prog(struct perf_event *event);
|
|
int perf_event_query_prog_array(struct perf_event *event, void __user *info);
|
|
int bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *prog);
|
|
int bpf_probe_unregister(struct bpf_raw_event_map *btp, struct bpf_prog *prog);
|
|
struct bpf_raw_event_map *bpf_find_raw_tracepoint(const char *name);
|
|
int bpf_get_perf_event_info(const struct perf_event *event, u32 *prog_id,
|
|
u32 *fd_type, const char **buf,
|
|
u64 *probe_offset, u64 *probe_addr);
|
|
#else
|
|
static inline unsigned int trace_call_bpf(struct trace_event_call *call, void *ctx)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline int
|
|
perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
static inline void perf_event_detach_bpf_prog(struct perf_event *event) { }
|
|
|
|
static inline int
|
|
perf_event_query_prog_array(struct perf_event *event, void __user *info)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
static inline int bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *p)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
static inline int bpf_probe_unregister(struct bpf_raw_event_map *btp, struct bpf_prog *p)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
static inline struct bpf_raw_event_map *bpf_find_raw_tracepoint(const char *name)
|
|
{
|
|
return NULL;
|
|
}
|
|
static inline int bpf_get_perf_event_info(const struct perf_event *event,
|
|
u32 *prog_id, u32 *fd_type,
|
|
const char **buf, u64 *probe_offset,
|
|
u64 *probe_addr)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
#endif
|
|
|
|
enum {
|
|
FILTER_OTHER = 0,
|
|
FILTER_STATIC_STRING,
|
|
FILTER_DYN_STRING,
|
|
FILTER_PTR_STRING,
|
|
FILTER_TRACE_FN,
|
|
FILTER_COMM,
|
|
FILTER_CPU,
|
|
};
|
|
|
|
extern int trace_event_raw_init(struct trace_event_call *call);
|
|
extern int trace_define_field(struct trace_event_call *call, const char *type,
|
|
const char *name, int offset, int size,
|
|
int is_signed, int filter_type);
|
|
extern int trace_add_event_call_nolock(struct trace_event_call *call);
|
|
extern int trace_remove_event_call_nolock(struct trace_event_call *call);
|
|
extern int trace_add_event_call(struct trace_event_call *call);
|
|
extern int trace_remove_event_call(struct trace_event_call *call);
|
|
extern int trace_event_get_offsets(struct trace_event_call *call);
|
|
|
|
#define is_signed_type(type) (((type)(-1)) < (type)1)
|
|
|
|
int trace_set_clr_event(const char *system, const char *event, int set);
|
|
|
|
/*
|
|
* The double __builtin_constant_p is because gcc will give us an error
|
|
* if we try to allocate the static variable to fmt if it is not a
|
|
* constant. Even with the outer if statement optimizing out.
|
|
*/
|
|
#define event_trace_printk(ip, fmt, args...) \
|
|
do { \
|
|
__trace_printk_check_format(fmt, ##args); \
|
|
tracing_record_cmdline(current); \
|
|
if (__builtin_constant_p(fmt)) { \
|
|
static const char *trace_printk_fmt \
|
|
__attribute__((section("__trace_printk_fmt"))) = \
|
|
__builtin_constant_p(fmt) ? fmt : NULL; \
|
|
\
|
|
__trace_bprintk(ip, trace_printk_fmt, ##args); \
|
|
} else \
|
|
__trace_printk(ip, fmt, ##args); \
|
|
} while (0)
|
|
|
|
#ifdef CONFIG_PERF_EVENTS
|
|
struct perf_event;
|
|
|
|
DECLARE_PER_CPU(struct pt_regs, perf_trace_regs);
|
|
DECLARE_PER_CPU(int, bpf_kprobe_override);
|
|
|
|
extern int perf_trace_init(struct perf_event *event);
|
|
extern void perf_trace_destroy(struct perf_event *event);
|
|
extern int perf_trace_add(struct perf_event *event, int flags);
|
|
extern void perf_trace_del(struct perf_event *event, int flags);
|
|
#ifdef CONFIG_KPROBE_EVENTS
|
|
extern int perf_kprobe_init(struct perf_event *event, bool is_retprobe);
|
|
extern void perf_kprobe_destroy(struct perf_event *event);
|
|
extern int bpf_get_kprobe_info(const struct perf_event *event,
|
|
u32 *fd_type, const char **symbol,
|
|
u64 *probe_offset, u64 *probe_addr,
|
|
bool perf_type_tracepoint);
|
|
#endif
|
|
#ifdef CONFIG_UPROBE_EVENTS
|
|
extern int perf_uprobe_init(struct perf_event *event, bool is_retprobe);
|
|
extern void perf_uprobe_destroy(struct perf_event *event);
|
|
extern int bpf_get_uprobe_info(const struct perf_event *event,
|
|
u32 *fd_type, const char **filename,
|
|
u64 *probe_offset, bool perf_type_tracepoint);
|
|
#endif
|
|
extern int ftrace_profile_set_filter(struct perf_event *event, int event_id,
|
|
char *filter_str);
|
|
extern void ftrace_profile_free_filter(struct perf_event *event);
|
|
void perf_trace_buf_update(void *record, u16 type);
|
|
void *perf_trace_buf_alloc(int size, struct pt_regs **regs, int *rctxp);
|
|
|
|
void bpf_trace_run1(struct bpf_prog *prog, u64 arg1);
|
|
void bpf_trace_run2(struct bpf_prog *prog, u64 arg1, u64 arg2);
|
|
void bpf_trace_run3(struct bpf_prog *prog, u64 arg1, u64 arg2,
|
|
u64 arg3);
|
|
void bpf_trace_run4(struct bpf_prog *prog, u64 arg1, u64 arg2,
|
|
u64 arg3, u64 arg4);
|
|
void bpf_trace_run5(struct bpf_prog *prog, u64 arg1, u64 arg2,
|
|
u64 arg3, u64 arg4, u64 arg5);
|
|
void bpf_trace_run6(struct bpf_prog *prog, u64 arg1, u64 arg2,
|
|
u64 arg3, u64 arg4, u64 arg5, u64 arg6);
|
|
void bpf_trace_run7(struct bpf_prog *prog, u64 arg1, u64 arg2,
|
|
u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7);
|
|
void bpf_trace_run8(struct bpf_prog *prog, u64 arg1, u64 arg2,
|
|
u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
|
|
u64 arg8);
|
|
void bpf_trace_run9(struct bpf_prog *prog, u64 arg1, u64 arg2,
|
|
u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
|
|
u64 arg8, u64 arg9);
|
|
void bpf_trace_run10(struct bpf_prog *prog, u64 arg1, u64 arg2,
|
|
u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
|
|
u64 arg8, u64 arg9, u64 arg10);
|
|
void bpf_trace_run11(struct bpf_prog *prog, u64 arg1, u64 arg2,
|
|
u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
|
|
u64 arg8, u64 arg9, u64 arg10, u64 arg11);
|
|
void bpf_trace_run12(struct bpf_prog *prog, u64 arg1, u64 arg2,
|
|
u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
|
|
u64 arg8, u64 arg9, u64 arg10, u64 arg11, u64 arg12);
|
|
void perf_trace_run_bpf_submit(void *raw_data, int size, int rctx,
|
|
struct trace_event_call *call, u64 count,
|
|
struct pt_regs *regs, struct hlist_head *head,
|
|
struct task_struct *task);
|
|
|
|
static inline void
|
|
perf_trace_buf_submit(void *raw_data, int size, int rctx, u16 type,
|
|
u64 count, struct pt_regs *regs, void *head,
|
|
struct task_struct *task)
|
|
{
|
|
perf_tp_event(type, count, raw_data, size, regs, head, rctx, task);
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* _LINUX_TRACE_EVENT_H */
|