cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

blktrace_api.h (3862B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef BLKTRACE_H
      3#define BLKTRACE_H
      4
      5#include <linux/blk-mq.h>
      6#include <linux/relay.h>
      7#include <linux/compat.h>
      8#include <uapi/linux/blktrace_api.h>
      9#include <linux/list.h>
     10
     11#if defined(CONFIG_BLK_DEV_IO_TRACE)
     12
     13#include <linux/sysfs.h>
     14
     15struct blk_trace {
     16	int trace_state;
     17	struct rchan *rchan;
     18	unsigned long __percpu *sequence;
     19	unsigned char __percpu *msg_data;
     20	u16 act_mask;
     21	u64 start_lba;
     22	u64 end_lba;
     23	u32 pid;
     24	u32 dev;
     25	struct dentry *dir;
     26	struct list_head running_list;
     27	atomic_t dropped;
     28};
     29
     30extern int blk_trace_ioctl(struct block_device *, unsigned, char __user *);
     31extern void blk_trace_shutdown(struct request_queue *);
     32__printf(3, 4) void __blk_trace_note_message(struct blk_trace *bt,
     33		struct cgroup_subsys_state *css, const char *fmt, ...);
     34
     35/**
     36 * blk_add_trace_msg - Add a (simple) message to the blktrace stream
     37 * @q:		queue the io is for
     38 * @fmt:	format to print message in
     39 * args...	Variable argument list for format
     40 *
     41 * Description:
     42 *     Records a (simple) message onto the blktrace stream.
     43 *
     44 *     NOTE: BLK_TN_MAX_MSG characters are output at most.
     45 *     NOTE: Can not use 'static inline' due to presence of var args...
     46 *
     47 **/
     48#define blk_add_cgroup_trace_msg(q, css, fmt, ...)			\
     49	do {								\
     50		struct blk_trace *bt;					\
     51									\
     52		rcu_read_lock();					\
     53		bt = rcu_dereference((q)->blk_trace);			\
     54		if (unlikely(bt))					\
     55			__blk_trace_note_message(bt, css, fmt, ##__VA_ARGS__);\
     56		rcu_read_unlock();					\
     57	} while (0)
     58#define blk_add_trace_msg(q, fmt, ...)					\
     59	blk_add_cgroup_trace_msg(q, NULL, fmt, ##__VA_ARGS__)
     60#define BLK_TN_MAX_MSG		128
     61
     62static inline bool blk_trace_note_message_enabled(struct request_queue *q)
     63{
     64	struct blk_trace *bt;
     65	bool ret;
     66
     67	rcu_read_lock();
     68	bt = rcu_dereference(q->blk_trace);
     69	ret = bt && (bt->act_mask & BLK_TC_NOTIFY);
     70	rcu_read_unlock();
     71	return ret;
     72}
     73
     74extern void blk_add_driver_data(struct request *rq, void *data, size_t len);
     75extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
     76			   struct block_device *bdev,
     77			   char __user *arg);
     78extern int blk_trace_startstop(struct request_queue *q, int start);
     79extern int blk_trace_remove(struct request_queue *q);
     80extern void blk_trace_remove_sysfs(struct device *dev);
     81extern int blk_trace_init_sysfs(struct device *dev);
     82
     83extern struct attribute_group blk_trace_attr_group;
     84
     85#else /* !CONFIG_BLK_DEV_IO_TRACE */
     86# define blk_trace_ioctl(bdev, cmd, arg)		(-ENOTTY)
     87# define blk_trace_shutdown(q)				do { } while (0)
     88# define blk_add_driver_data(rq, data, len)		do {} while (0)
     89# define blk_trace_setup(q, name, dev, bdev, arg)	(-ENOTTY)
     90# define blk_trace_startstop(q, start)			(-ENOTTY)
     91# define blk_trace_remove(q)				(-ENOTTY)
     92# define blk_add_trace_msg(q, fmt, ...)			do { } while (0)
     93# define blk_add_cgroup_trace_msg(q, cg, fmt, ...)	do { } while (0)
     94# define blk_trace_remove_sysfs(dev)			do { } while (0)
     95# define blk_trace_note_message_enabled(q)		(false)
     96static inline int blk_trace_init_sysfs(struct device *dev)
     97{
     98	return 0;
     99}
    100
    101#endif /* CONFIG_BLK_DEV_IO_TRACE */
    102
    103#ifdef CONFIG_COMPAT
    104
    105struct compat_blk_user_trace_setup {
    106	char name[BLKTRACE_BDEV_SIZE];
    107	u16 act_mask;
    108	u32 buf_size;
    109	u32 buf_nr;
    110	compat_u64 start_lba;
    111	compat_u64 end_lba;
    112	u32 pid;
    113};
    114#define BLKTRACESETUP32 _IOWR(0x12, 115, struct compat_blk_user_trace_setup)
    115
    116#endif
    117
    118void blk_fill_rwbs(char *rwbs, unsigned int op);
    119
    120static inline sector_t blk_rq_trace_sector(struct request *rq)
    121{
    122	/*
    123	 * Tracing should ignore starting sector for passthrough requests and
    124	 * requests where starting sector didn't get set.
    125	 */
    126	if (blk_rq_is_passthrough(rq) || blk_rq_pos(rq) == (sector_t)-1)
    127		return 0;
    128	return blk_rq_pos(rq);
    129}
    130
    131static inline unsigned int blk_rq_trace_nr_sectors(struct request *rq)
    132{
    133	return blk_rq_is_passthrough(rq) ? 0 : blk_rq_sectors(rq);
    134}
    135
    136#endif