cregit-Linux how code gets into the kernel

Release 4.15 kernel/trace/blktrace.c

Directory: kernel/trace
/*
 * Copyright (C) 2006 Jens Axboe <axboe@kernel.dk>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */
#include <linux/kernel.h>
#include <linux/blkdev.h>
#include <linux/blktrace_api.h>
#include <linux/percpu.h>
#include <linux/init.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/debugfs.h>
#include <linux/export.h>
#include <linux/time.h>
#include <linux/uaccess.h>
#include <linux/list.h>
#include <linux/blk-cgroup.h>

#include "../../block/blk.h"

#include <trace/events/block.h>

#include "trace_output.h"

#ifdef CONFIG_BLK_DEV_IO_TRACE


static unsigned int blktrace_seq __read_mostly = 1;


static struct trace_array *blk_tr;

static bool blk_tracer_enabled __read_mostly;

static LIST_HEAD(running_trace_list);
static __cacheline_aligned_in_smp DEFINE_SPINLOCK(running_trace_lock);

/* Select an alternative, minimalistic output than the original one */

#define TRACE_BLK_OPT_CLASSIC	0x1

#define TRACE_BLK_OPT_CGROUP	0x2

#define TRACE_BLK_OPT_CGNAME	0x4


static struct tracer_opt blk_tracer_opts[] = {
	/* Default disable the minimalistic output */
	{ TRACER_OPT(blk_classic, TRACE_BLK_OPT_CLASSIC) },
#ifdef CONFIG_BLK_CGROUP
	{ TRACER_OPT(blk_cgroup, TRACE_BLK_OPT_CGROUP) },
	{ TRACER_OPT(blk_cgname, TRACE_BLK_OPT_CGNAME) },
#endif
	{ }
};


static struct tracer_flags blk_tracer_flags = {
	.val  = 0,
	.opts = blk_tracer_opts,
};

/* Global reference count of probes */
static DEFINE_MUTEX(blk_probe_mutex);

static int blk_probes_ref;

static void blk_register_tracepoints(void);
static void blk_unregister_tracepoints(void);

/*
 * Send out a notify message.
 */

static void trace_note(struct blk_trace *bt, pid_t pid, int action, const void *data, size_t len, union kernfs_node_id *cgid) { struct blk_io_trace *t; struct ring_buffer_event *event = NULL; struct ring_buffer *buffer = NULL; int pc = 0; int cpu = smp_processor_id(); bool blk_tracer = blk_tracer_enabled; ssize_t cgid_len = cgid ? sizeof(*cgid) : 0; if (blk_tracer) { buffer = blk_tr->trace_buffer.buffer; pc = preempt_count(); event = trace_buffer_lock_reserve(buffer, TRACE_BLK, sizeof(*t) + len + cgid_len, 0, pc); if (!event) return; t = ring_buffer_event_data(event); goto record_it; } if (!bt->rchan) return; t = relay_reserve(bt->rchan, sizeof(*t) + len + cgid_len); if (t) { t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; t->time = ktime_to_ns(ktime_get()); record_it: t->device = bt->dev; t->action = action | (cgid ? __BLK_TN_CGROUP : 0); t->pid = pid; t->cpu = cpu; t->pdu_len = len + cgid_len; if (cgid) memcpy((void *)t + sizeof(*t), cgid, cgid_len); memcpy((void *) t + sizeof(*t) + cgid_len, data, len); if (blk_tracer) trace_buffer_unlock_commit(blk_tr, buffer, event, 0, pc); } }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe9231.51%325.00%
Li Zefan8629.45%18.33%
Shaohua Li5719.52%18.33%
Olaf Kirch268.90%18.33%
Steven Rostedt196.51%325.00%
Arnaldo Carvalho de Melo82.74%18.33%
Ingo Molnar41.37%216.67%
Total292100.00%12100.00%

/* * Send out a notify for this process, if we haven't done so since a trace * started */
static void trace_note_tsk(struct task_struct *tsk) { unsigned long flags; struct blk_trace *bt; tsk->btrace_seq = blktrace_seq; spin_lock_irqsave(&running_trace_lock, flags); list_for_each_entry(bt, &running_trace_list, running_list) { trace_note(bt, tsk->pid, BLK_TN_PROCESS, tsk->comm, sizeof(tsk->comm), NULL); } spin_unlock_irqrestore(&running_trace_lock, flags); }

Contributors

PersonTokensPropCommitsCommitProp
Jan Kara3546.05%120.00%
Olaf Kirch3140.79%120.00%
Jens Axboe810.53%240.00%
Shaohua Li22.63%120.00%
Total76100.00%5100.00%


static void trace_note_time(struct blk_trace *bt) { struct timespec64 now; unsigned long flags; u32 words[2]; /* need to check user space to see if this breaks in y2038 or y2106 */ ktime_get_real_ts64(&now); words[0] = (u32)now.tv_sec; words[1] = now.tv_nsec; local_irq_save(flags); trace_note(bt, 0, BLK_TN_TIMESTAMP, words, sizeof(words), NULL); local_irq_restore(flags); }

Contributors

PersonTokensPropCommitsCommitProp
Olaf Kirch7288.89%125.00%
Arnd Bergmann67.41%125.00%
Shaohua Li22.47%125.00%
Jens Axboe11.23%125.00%
Total81100.00%4100.00%


void __trace_note_message(struct blk_trace *bt, struct blkcg *blkcg, const char *fmt, ...) { int n; va_list args; unsigned long flags; char *buf; if (unlikely(bt->trace_state != Blktrace_running && !blk_tracer_enabled)) return; /* * If the BLK_TC_NOTIFY action mask isn't set, don't send any note * message to the trace. */ if (!(bt->act_mask & BLK_TC_NOTIFY)) return; local_irq_save(flags); buf = this_cpu_ptr(bt->msg_data); va_start(args, fmt); n = vscnprintf(buf, BLK_TN_MAX_MSG, fmt, args); va_end(args); if (!(blk_tracer_flags.val & TRACE_BLK_OPT_CGROUP)) blkcg = NULL; #ifdef CONFIG_BLK_CGROUP trace_note(bt, 0, BLK_TN_MESSAGE, buf, n, blkcg ? cgroup_get_kernfs_id(blkcg->css.cgroup) : NULL); #else trace_note(bt, 0, BLK_TN_MESSAGE, buf, n, NULL); #endif local_irq_restore(flags); }

Contributors

PersonTokensPropCommitsCommitProp
Alan D. Brunelle6135.67%111.11%
Shaohua Li5532.16%222.22%
Jens Axboe148.19%111.11%
Tao Ma137.60%111.11%
Carl Henrik Lunde127.02%111.11%
Li Zefan84.68%111.11%
Arnaldo Carvalho de Melo74.09%111.11%
Shan Wei10.58%111.11%
Total171100.00%9100.00%

EXPORT_SYMBOL_GPL(__trace_note_message);
static int act_log_check(struct blk_trace *bt, u32 what, sector_t sector, pid_t pid) { if (((bt->act_mask << BLK_TC_SHIFT) & what) == 0) return 1; if (sector && (sector < bt->start_lba || sector > bt->end_lba)) return 1; if (bt->pid && pid != bt->pid) return 1; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe7494.87%150.00%
Shawn Du45.13%150.00%
Total78100.00%2100.00%

/* * Data direction bit lookup */ static const u32 ddir_act[2] = { BLK_TC_ACT(BLK_TC_READ), BLK_TC_ACT(BLK_TC_WRITE) }; #define BLK_TC_RAHEAD BLK_TC_AHEAD #define BLK_TC_PREFLUSH BLK_TC_FLUSH /* The ilog2() calls fall out because they're constant */ #define MASK_TC_BIT(rw, __name) ((rw & REQ_ ## __name) << \ (ilog2(BLK_TC_ ## __name) + BLK_TC_SHIFT - __REQ_ ## __name)) /* * The worker for the various blk_add_trace*() types. Fills out a * blk_io_trace structure and places it in a per-cpu subbuffer. */
static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, int op, int op_flags, u32 what, int error, int pdu_len, void *pdu_data, union kernfs_node_id *cgid) { struct task_struct *tsk = current; struct ring_buffer_event *event = NULL; struct ring_buffer *buffer = NULL; struct blk_io_trace *t; unsigned long flags = 0; unsigned long *sequence; pid_t pid; int cpu, pc = 0; bool blk_tracer = blk_tracer_enabled; ssize_t cgid_len = cgid ? sizeof(*cgid) : 0; if (unlikely(bt->trace_state != Blktrace_running && !blk_tracer)) return; what |= ddir_act[op_is_write(op) ? WRITE : READ]; what |= MASK_TC_BIT(op_flags, SYNC); what |= MASK_TC_BIT(op_flags, RAHEAD); what |= MASK_TC_BIT(op_flags, META); what |= MASK_TC_BIT(op_flags, PREFLUSH); what |= MASK_TC_BIT(op_flags, FUA); if (op == REQ_OP_DISCARD || op == REQ_OP_SECURE_ERASE) what |= BLK_TC_ACT(BLK_TC_DISCARD); if (op == REQ_OP_FLUSH) what |= BLK_TC_ACT(BLK_TC_FLUSH); if (cgid) what |= __BLK_TA_CGROUP; pid = tsk->pid; if (act_log_check(bt, what, sector, pid)) return; cpu = raw_smp_processor_id(); if (blk_tracer) { tracing_record_cmdline(current); buffer = blk_tr->trace_buffer.buffer; pc = preempt_count(); event = trace_buffer_lock_reserve(buffer, TRACE_BLK, sizeof(*t) + pdu_len + cgid_len, 0, pc); if (!event) return; t = ring_buffer_event_data(event); goto record_it; } if (unlikely(tsk->btrace_seq != blktrace_seq)) trace_note_tsk(tsk); /* * A word about the locking here - we disable interrupts to reserve * some space in the relay per-cpu buffer, to prevent an irq * from coming in and stepping on our toes. */ local_irq_save(flags); t = relay_reserve(bt->rchan, sizeof(*t) + pdu_len + cgid_len); if (t) { sequence = per_cpu_ptr(bt->sequence, cpu); t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; t->sequence = ++(*sequence); t->time = ktime_to_ns(ktime_get()); record_it: /* * These two are not needed in ftrace as they are in the * generic trace_entry, filled by tracing_generic_entry_update, * but for the trace_event->bin() synthesizer benefit we do it * here too. */ t->cpu = cpu; t->pid = pid; t->sector = sector; t->bytes = bytes; t->action = what; t->device = bt->dev; t->error = error; t->pdu_len = pdu_len + cgid_len; if (cgid_len) memcpy((void *)t + sizeof(*t), cgid, cgid_len); if (pdu_len) memcpy((void *)t + sizeof(*t) + cgid_len, pdu_data, pdu_len); if (blk_tracer) { trace_buffer_unlock_commit(blk_tr, buffer, event, 0, pc); return; } } local_irq_restore(flags); }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe24747.50%27.69%
Arnaldo Carvalho de Melo10219.62%623.08%
Shaohua Li5710.96%13.85%
Michael Christie397.50%311.54%
Steven Rostedt193.65%311.54%
David Woodhouse142.69%27.69%
Namhyung Kim122.31%13.85%
Li Zefan91.73%27.69%
Jan Kara61.15%13.85%
Nathan Scott50.96%13.85%
Adrian Hunter40.77%13.85%
Ingo Molnar40.77%27.69%
Christoph Hellwig20.38%13.85%
Total520100.00%26100.00%


static void blk_trace_free(struct blk_trace *bt) { debugfs_remove(bt->msg_file); debugfs_remove(bt->dropped_file); relay_close(bt->rchan); debugfs_remove(bt->dir); free_percpu(bt->sequence); free_percpu(bt->msg_data); kfree(bt); }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe4068.97%233.33%
Alan D. Brunelle1118.97%233.33%
Stefan Raspl58.62%116.67%
Li Zefan23.45%116.67%
Total58100.00%6100.00%


static void get_probe_ref(void) { mutex_lock(&blk_probe_mutex); if (++blk_probes_ref == 1) blk_register_tracepoints(); mutex_unlock(&blk_probe_mutex); }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe30100.00%1100.00%
Total30100.00%1100.00%


static void put_probe_ref(void) { mutex_lock(&blk_probe_mutex); if (!--blk_probes_ref) blk_unregister_tracepoints(); mutex_unlock(&blk_probe_mutex); }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe29100.00%1100.00%
Total29100.00%1100.00%


static void blk_trace_cleanup(struct blk_trace *bt) { blk_trace_free(bt); put_probe_ref(); }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan1578.95%125.00%
Arnaldo Carvalho de Melo210.53%125.00%
Jens Axboe210.53%250.00%
Total19100.00%4100.00%


static int __blk_trace_remove(struct request_queue *q) { struct blk_trace *bt; bt = xchg(&q->blk_trace, NULL); if (!bt) return -EINVAL; if (bt->trace_state != Blktrace_running) blk_trace_cleanup(bt); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe5196.23%375.00%
Li Zefan23.77%125.00%
Total53100.00%4100.00%


int blk_trace_remove(struct request_queue *q) { int ret; mutex_lock(&q->blk_trace_mutex); ret = __blk_trace_remove(q); mutex_unlock(&q->blk_trace_mutex); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe39100.00%1100.00%
Total39100.00%1100.00%

EXPORT_SYMBOL_GPL(blk_trace_remove);
static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, size_t count, loff_t *ppos) { struct blk_trace *bt = filp->private_data; char buf[16]; snprintf(buf, sizeof(buf), "%u\n", atomic_read(&bt->dropped)); return simple_read_from_buffer(buffer, count, ppos, buf, strlen(buf)); }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe75100.00%1100.00%
Total75100.00%1100.00%

static const struct file_operations blk_dropped_fops = { .owner = THIS_MODULE, .open = simple_open, .read = blk_dropped_read, .llseek = default_llseek, };
static ssize_t blk_msg_write(struct file *filp, const char __user *buffer, size_t count, loff_t *ppos) { char *msg; struct blk_trace *bt; if (count >= BLK_TN_MAX_MSG) return -EINVAL; msg = memdup_user_nul(buffer, count); if (IS_ERR(msg)) return PTR_ERR(msg); bt = filp->private_data; __trace_note_message(bt, NULL, "%s", msg); kfree(msg); return count; }

Contributors

PersonTokensPropCommitsCommitProp
Alan D. Brunelle8190.00%125.00%
Al Viro66.67%125.00%
Shaohua Li22.22%125.00%
Li Zefan11.11%125.00%
Total90100.00%4100.00%

static const struct file_operations blk_msg_fops = { .owner = THIS_MODULE, .open = simple_open, .write = blk_msg_write, .llseek = noop_llseek, }; /* * Keep track of how many times we encountered a full subbuffer, to aid * the user space app in telling how many lost events there were. */
static int blk_subbuf_start_callback(struct rchan_buf *buf, void *subbuf, void *prev_subbuf, size_t prev_padding) { struct blk_trace *bt; if (!relay_buf_full(buf)) return 1; bt = buf->chan->private_data; atomic_inc(&bt->dropped); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe57100.00%1100.00%
Total57100.00%1100.00%


static int blk_remove_buf_file_callback(struct dentry *dentry) { debugfs_remove(dentry); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe19100.00%1100.00%
Total19100.00%1100.00%


static struct dentry *blk_create_buf_file_callback(const char *filename, struct dentry *parent, umode_t mode, struct rchan_buf *buf, int *is_global) { return debugfs_create_file(filename, mode, parent, buf, &relay_file_operations); }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe4497.78%150.00%
Al Viro12.22%150.00%
Total45100.00%2100.00%

static struct rchan_callbacks blk_relay_callbacks = { .subbuf_start = blk_subbuf_start_callback, .create_buf_file = blk_create_buf_file_callback, .remove_buf_file = blk_remove_buf_file_callback, };
static void blk_trace_setup_lba(struct blk_trace *bt, struct block_device *bdev) { struct hd_struct *part = NULL; if (bdev) part = bdev->bd_part; if (part) { bt->start_lba = part->start_sect; bt->end_lba = part->start_sect + part->nr_sects; } else { bt->start_lba = 0; bt->end_lba = -1ULL; } }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan75100.00%1100.00%
Total75100.00%1100.00%

/* * Setup everything required to start tracing */
static int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, struct block_device *bdev, struct blk_user_trace_setup *buts) { struct blk_trace *bt = NULL; struct dentry *dir = NULL; int ret; if (!buts->buf_size || !buts->buf_nr) return -EINVAL; strncpy(buts->name, name, BLKTRACE_BDEV_SIZE); buts->name[BLKTRACE_BDEV_SIZE - 1] = '\0'; /* * some device names have larger paths - convert the slashes * to underscores for this to work as expected */ strreplace(buts->name, '/', '_'); bt = kzalloc(sizeof(*bt), GFP_KERNEL); if (!bt) return -ENOMEM; ret = -ENOMEM; bt->sequence = alloc_percpu(unsigned long); if (!bt->sequence) goto err; bt->msg_data = __alloc_percpu(BLK_TN_MAX_MSG, __alignof__(char)); if (!bt->msg_data) goto err; ret = -ENOENT; if (!blk_debugfs_root) goto err; dir = debugfs_lookup(buts->name, blk_debugfs_root); if (!dir) bt->dir = dir = debugfs_create_dir(buts->name, blk_debugfs_root); if (!dir) goto err; bt->dev = dev; atomic_set(&bt->dropped, 0); INIT_LIST_HEAD(&bt->running_list); ret = -EIO; bt->dropped_file = debugfs_create_file("dropped", 0444, dir, bt, &blk_dropped_fops); if (!bt->dropped_file) goto err; bt->msg_file = debugfs_create_file("msg", 0222, dir, bt, &blk_msg_fops); if (!bt->msg_file) goto err; bt->rchan = relay_open("trace", dir, buts->buf_size, buts->buf_nr, &blk_relay_callbacks, bt); if (!bt->rchan) goto err; bt->act_mask = buts->act_mask; if (!bt->act_mask) bt->act_mask = (u16) -1; blk_trace_setup_lba(bt, bdev); /* overwrite with user settings */ if (buts->start_lba) bt->start_lba = buts->start_lba; if (buts->end_lba) bt->end_lba = buts->end_lba; bt->pid = buts->pid; bt->trace_state = Blktrace_setup; ret = -EBUSY; if (cmpxchg(&q->blk_trace, NULL, bt)) goto err; get_probe_ref(); ret = 0; err: if (dir && !bt->dir) dput(dir); if (ret) blk_trace_free(bt); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe30665.38%627.27%
Omar Sandoval428.97%313.64%
Alan D. Brunelle326.84%14.55%
Shawn Du245.13%14.55%
Li Zefan204.27%418.18%
Arnd Bergmann132.78%14.55%
Jan Kara81.71%14.55%
Christof Schmitt71.50%14.55%
Rusty Russell51.07%14.55%
Davidlohr Bueso A51.07%14.55%
Rasmus Villemoes40.85%14.55%
Mathieu Desnoyers20.43%14.55%
Total468100.00%22100.00%


static int __blk_trace_setup(struct request_queue *q, char *name, dev_t dev, struct block_device *bdev, char __user *arg) { struct blk_user_trace_setup buts; int ret; ret = copy_from_user(&buts, arg, sizeof(buts)); if (ret) return -EFAULT; ret = do_blk_trace_setup(q, name, dev, bdev, &buts); if (ret) return ret; if (copy_to_user(arg, &buts, sizeof(buts))) { __blk_trace_remove(q); return -EFAULT; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Arnd Bergmann8678.18%116.67%
Christof Schmitt87.27%116.67%
Shawn Du76.36%116.67%
Dmitriy Monakhov65.45%116.67%
Jens Axboe32.73%233.33%
Total110100.00%6100.00%


int blk_trace_setup(struct request_queue *q, char *name, dev_t dev, struct block_device *bdev, char __user *arg) { int ret; mutex_lock(&q->blk_trace_mutex); ret = __blk_trace_setup(q, name, dev, bdev, arg); mutex_unlock(&q->blk_trace_mutex); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe64100.00%1100.00%
Total64100.00%1100.00%

EXPORT_SYMBOL_GPL(blk_trace_setup); #if defined(CONFIG_COMPAT) && defined(CONFIG_X86_64)
static int compat_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, struct block_device *bdev, char __user *arg) { struct blk_user_trace_setup buts; struct compat_blk_user_trace_setup cbuts; int ret; if (copy_from_user(&cbuts, arg, sizeof(cbuts))) return -EFAULT; buts = (struct blk_user_trace_setup) { .act_mask = cbuts.act_mask, .buf_size = cbuts.buf_size, .buf_nr = cbuts.buf_nr, .start_lba = cbuts.start_lba, .end_lba = cbuts.end_lba, .pid = cbuts.pid, }; ret = do_blk_trace_setup(q, name, dev, bdev, &buts); if (ret) return ret; if (copy_to_user(arg, &buts.name, ARRAY_SIZE(buts.name))) { __blk_trace_remove(q); return -EFAULT; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Arnd Bergmann15795.73%133.33%
Chen Gang S63.66%133.33%
Jens Axboe10.61%133.33%
Total164100.00%3100.00%

#endif
static int __blk_trace_startstop(struct request_queue *q, int start) { int ret; struct blk_trace *bt = q->blk_trace; if (bt == NULL) return -EINVAL; /* * For starting a trace, we can transition from a setup or stopped * trace. For stopping a trace, the state must be running */ ret = -EINVAL; if (start) { if (bt->trace_state == Blktrace_setup || bt->trace_state == Blktrace_stopped) { blktrace_seq++; smp_mb(); bt->trace_state = Blktrace_running; spin_lock_irq(&running_trace_lock); list_add(&bt->running_list, &running_trace_list); spin_unlock_irq(&running_trace_lock); trace_note_time(bt); ret = 0; } } else { if (bt->trace_state == Blktrace_running) { bt->trace_state = Blktrace_stopped; spin_lock_irq(&running_trace_lock); list_del_init(&bt->running_list); spin_unlock_irq(&running_trace_lock); relay_flush(bt->rchan); ret = 0; } } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe10665.84%350.00%
Jan Kara4326.71%116.67%
Arnaldo Carvalho de Melo74.35%116.67%
Olaf Kirch53.11%116.67%
Total161100.00%6100.00%


int blk_trace_startstop(struct request_queue *q, int start) { int ret; mutex_lock(&q->blk_trace_mutex); ret = __blk_trace_startstop(q, start); mutex_unlock(&q->blk_trace_mutex); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe44100.00%1100.00%
Total44100.00%1100.00%

EXPORT_SYMBOL_GPL(blk_trace_startstop); /* * When reading or writing the blktrace sysfs files, the references to the * opened sysfs or device files should prevent the underlying block device * from being removed. So no further delete protection is really needed. */ /** * blk_trace_ioctl: - handle the ioctls associated with tracing * @bdev: the block device * @cmd: the ioctl cmd * @arg: the argument data, if any * **/
int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg) { struct request_queue *q; int ret, start = 0; char b[BDEVNAME_SIZE]; q = bdev_get_queue(bdev); if (!q) return -ENXIO; mutex_lock(&q->blk_trace_mutex); switch (cmd) { case BLKTRACESETUP: bdevname(bdev, b); ret = __blk_trace_setup(q, b, bdev->bd_dev, bdev, arg); break; #if defined(CONFIG_COMPAT) && defined(CONFIG_X86_64) case BLKTRACESETUP32: bdevname(bdev, b); ret = compat_blk_trace_setup(q, b, bdev->bd_dev, bdev, arg); break; #endif case BLKTRACESTART: start = 1; case BLKTRACESTOP: ret = __blk_trace_startstop(q, start); break; case BLKTRACETEARDOWN: ret = __blk_trace_remove(q); break; default: ret = -ENOTTY; break; } mutex_unlock(&q->blk_trace_mutex); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe12065.22%342.86%
Arnd Bergmann4122.28%114.29%
Christof Schmitt179.24%114.29%
Waiman Long42.17%114.29%
Shawn Du21.09%114.29%
Total184100.00%7100.00%

/** * blk_trace_shutdown: - stop and cleanup trace structures * @q: the request queue associated with the device * **/
void blk_trace_shutdown(struct request_queue *q) { mutex_lock(&q->blk_trace_mutex); if (q->blk_trace) { __blk_trace_startstop(q, 0); __blk_trace_remove(q); } mutex_unlock(&q->blk_trace_mutex); }

Contributors

PersonTokensPropCommitsCommitProp
Jens Axboe3882.61%375.00%
Alexey Dobriyan817.39%125.00%
Total46100.00%4100.00%

#ifdef CONFIG_BLK_CGROUP
static union kernfs_node_id * blk_trace_bio_get_cgid(struct request_queue *q, struct bio *bio) { struct blk_trace *bt = q->blk_trace; if (!bt || !(blk_tracer_flags.val & TRACE_BLK_OPT_CGROUP)) return NULL; if (!bio->bi_css) return NULL; return cgroup_get_kernfs_id(bio->bi_css->cgroup); }

Contributors

PersonTokensPropCommitsCommitProp
Shaohua Li64100.00%1100.00%
Total64100.00%1100.00%

#else
static union kernfs_node_id * blk_trace_bio_get_cgid(struct request_queue *q, struct bio *bio) { return NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Shaohua Li21100.00%1100.00%
Total21100.00%1100.00%

#endif
static union kernfs_node_id * blk_trace_request_get_cgid(struct request_queue *q, struct request *rq) { if (!rq->bio) return NULL; /* Use the first bio */ return blk_trace_bio_get_cgid(q, rq->bio); }

Contributors

PersonTokensPropCommitsCommitProp
Shaohua Li39100.00%1100.00%
Total39100.00%1100.00%

/* * blktrace probes */ /** * blk_add_trace_rq - Add a trace for a request oriented action * @rq: the source request * @error: return status to log * @nr_bytes: number of completed bytes * @what: the action * @cgid: the cgroup info * * Description: * Records an action against a request. Will log the bio offset + size. * **/
static void blk_add_trace_rq(struct request *rq, int error, unsigned int nr_bytes, u32 what, union kernfs_node_id *cgid) { struct blk_trace *bt = rq->q->blk_trace; if (likely(!bt)) return; if (blk_rq_is_passthrough(rq)) what |= BLK_TC_ACT(BLK_TC_PC); else what |= BLK_TC_ACT(BLK_TC_FS); __blk_add_trace(bt, blk_rq_trace_sector(rq), nr_bytes, req_op(rq), rq->cmd_flags, what, error, 0, NULL, cgid); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo6767.68%111.11%
Christoph Hellwig1010.10%333.33%
Shaohua Li77.07%111.11%
Michael Christie55.05%111.11%
Roman Peniaev55.05%111.11%
Tao Ma33.03%111.11%
Tejun Heo22.02%111.11%
Total99100.00%9100.00%


static void blk_add_trace_rq_insert(void *ignore, struct request_queue *q, struct request *rq) { blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_INSERT, blk_trace_request_get_cgid(q, rq)); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2356.10%120.00%
Shaohua Li717.07%120.00%
Roman Peniaev512.20%120.00%
Steven Rostedt49.76%120.00%
Christoph Hellwig24.88%120.00%
Total41100.00%5100.00%


static void blk_add_trace_rq_issue(void *ignore, struct request_queue *q, struct request *rq) { blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_ISSUE, blk_trace_request_get_cgid(q, rq)); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2356.10%120.00%
Shaohua Li717.07%120.00%
Roman Peniaev512.20%120.00%
Steven Rostedt49.76%120.00%
Christoph Hellwig24.88%120.00%
Total41100.00%5100.00%


static void blk_add_trace_rq_requeue(void *ignore, struct request_queue *q, struct request *rq) { blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_REQUEUE, blk_trace_request_get_cgid(q, rq)); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2151.22%120.00%
Shaohua Li921.95%120.00%
Roman Peniaev512.20%120.00%
Steven Rostedt49.76%120.00%
Christoph Hellwig24.88%120.00%
Total41100.00%5100.00%


static void blk_add_trace_rq_complete(void *ignore, struct request *rq, int error, unsigned int nr_bytes) { blk_add_trace_rq(rq, error, nr_bytes, BLK_TA_COMPLETE, blk_trace_request_get_cgid(rq->q, rq)); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1842.86%120.00%
Shaohua Li921.43%120.00%
Roman Peniaev614.29%120.00%
Christoph Hellwig511.90%120.00%
Steven Rostedt49.52%120.00%
Total42100.00%5100.00%

/** * blk_add_trace_bio - Add a trace for a bio oriented action * @q: queue the io is for * @bio: the source bio * @what: the action * @error: error, if any * * Description: * Records an action against a bio. Will log the bio offset + size. * **/
static void blk_add_trace_bio(struct request_queue *q, struct bio *bio, u32 what, int error) { struct blk_trace *bt = q->blk_trace; if (likely(!bt)) return; __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, bio_op(bio), bio->bi_opf, what, error, 0, NULL, blk_trace_bio_get_cgid(q, bio)); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo6074.07%114.29%
Marcos Paulo de Souza67.41%114.29%
Jens Axboe56.17%228.57%
Michael Christie56.17%114.29%
Kent Overstreet44.94%114.29%
Shaohua Li11.23%114.29%
Total81100.00%7100.00%


static void blk_add_trace_bio_bounce(void *ignore, struct request_queue *q, struct bio *bio) { blk_add_trace_bio(q, bio, BLK_TA_BOUNCE, 0); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2580.65%133.33%
Steven Rostedt412.90%133.33%
Jens Axboe26.45%133.33%
Total31100.00%3100.00%


static void blk_add_trace_bio_complete(void *ignore, struct request_queue *q, struct bio *bio, int error) { blk_add_trace_bio(q, bio, BLK_TA_COMPLETE, error); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2058.82%120.00%
Linus Torvalds514.71%120.00%
Steven Rostedt411.76%120.00%
Mathieu Desnoyers38.82%120.00%
Jens Axboe25.88%120.00%
Total34100.00%5100.00%


static void blk_add_trace_bio_backmerge(void *ignore, struct request_queue *q, struct request *rq, struct bio *bio) { blk_add_trace_bio(q, bio, BLK_TA_BACKMERGE, 0); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2569.44%125.00%
Tejun Heo513.89%125.00%
Steven Rostedt411.11%125.00%
Jens Axboe25.56%125.00%
Total36100.00%4100.00%


static void blk_add_trace_bio_frontmerge(void *ignore, struct request_queue *q, struct request *rq, struct bio *bio) { blk_add_trace_bio(q, bio, BLK_TA_FRONTMERGE, 0); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2569.44%125.00%
Tejun Heo513.89%125.00%
Steven Rostedt411.11%125.00%
Jens Axboe25.56%125.00%
Total36100.00%4100.00%


static void blk_add_trace_bio_queue(void *ignore, struct request_queue *q, struct bio *bio) { blk_add_trace_bio(q, bio, BLK_TA_QUEUE, 0); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2580.65%133.33%
Steven Rostedt412.90%133.33%
Jens Axboe26.45%133.33%
Total31100.00%3100.00%


static void blk_add_trace_getrq(void *ignore, struct request_queue *q, struct bio *bio, int rw) { if (bio) blk_add_trace_bio(q, bio, BLK_TA_GETRQ, 0); else { struct blk_trace *bt = q->blk_trace; if (bt) __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_GETRQ, 0, 0, NULL, NULL); } }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo6787.01%120.00%
Steven Rostedt45.19%120.00%
Jens Axboe22.60%120.00%
Shaohua Li22.60%120.00%
Michael Christie22.60%120.00%
Total77100.00%5100.00%


static void blk_add_trace_sleeprq(void *ignore, struct request_queue *q, struct bio *bio, int rw) { if (bio) blk_add_trace_bio(q, bio, BLK_TA_SLEEPRQ, 0); else { struct blk_trace *bt = q->blk_trace; if (bt) __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_SLEEPRQ, 0, 0, NULL, NULL); } }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo6787.01%120.00%
Steven Rostedt45.19%120.00%
Michael Christie22.60%120.00%
Shaohua Li22.60%120.00%
Jens Axboe22.60%120.00%
Total77100.00%5100.00%


static void blk_add_trace_plug(void *ignore, struct request_queue *q) { struct blk_trace *bt = q->blk_trace; if (bt) __blk_add_trace(bt, 0, 0, 0, 0, BLK_TA_PLUG, 0, 0, NULL, NULL); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo4384.31%125.00%
Steven Rostedt47.84%125.00%
Michael Christie23.92%125.00%
Shaohua Li23.92%125.00%
Total51100.00%4100.00%


static void blk_add_trace_unplug(void *ignore, struct request_queue *q, unsigned int depth, bool explicit) { struct blk_trace *bt = q->blk_trace; if (bt) { __be64 rpdu = cpu_to_be64(depth); u32 what; if (explicit) what = BLK_TA_UNPLUG_IO; else what = BLK_TA_UNPLUG_TIMER; __blk_add_trace(bt, 0, 0, 0, 0, what, 0, sizeof(rpdu), &rpdu, NULL); } }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo5461.36%116.67%
Jens Axboe2629.55%233.33%
Steven Rostedt44.55%116.67%
Michael Christie22.27%116.67%
Shaohua Li22.27%116.67%
Total88100.00%6100.00%


static void blk_add_trace_split(void *ignore, struct request_queue *q, struct bio *bio, unsigned int pdu) { struct blk_trace *bt = q->blk_trace; if (bt) { __be64 rpdu = cpu_to_be64(pdu); __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, bio_op(bio), bio->bi_opf, BLK_TA_SPLIT, bio->bi_status, sizeof(rpdu), &rpdu, blk_trace_bio_get_cgid(q, bio)); } }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo7175.53%112.50%
Shaohua Li77.45%112.50%
Michael Christie55.32%112.50%
Kent Overstreet44.26%112.50%
Steven Rostedt44.26%112.50%
Christoph Hellwig22.13%225.00%
Jens Axboe11.06%112.50%
Total94100.00%8100.00%

/** * blk_add_trace_bio_remap - Add a trace for a bio-remap operation * @ignore: trace callback data parameter (not used) * @q: queue the io is for * @bio: the source bio * @dev: target device * @from: source sector * * Description: * Device mapper or raid target sometimes need to split a bio because * it spans a stripe (or similar). Add a trace for that action. * **/
static void blk_add_trace_bio_remap(void *ignore, struct request_queue *q, struct bio *bio, dev_t dev, sector_t from) { struct blk_trace *bt = q->blk_trace; struct blk_io_trace_remap r; if (likely(!bt)) return; r.device_from = cpu_to_be32(dev); r.device_to = cpu_to_be32(bio_dev(bio)); r.sector_from = cpu_to_be64(from); __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, bio_op(bio), bio->bi_opf, BLK_TA_REMAP, bio->bi_status, sizeof(r), &r, blk_trace_bio_get_cgid(q, bio)); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo9072.00%18.33%
Alan D. Brunelle86.40%216.67%
Shaohua Li75.60%18.33%
Michael Christie54.00%18.33%
Christoph Hellwig54.00%325.00%
Steven Rostedt43.20%18.33%
Kent Overstreet43.20%18.33%
Jens Axboe10.80%18.33%
Mike Snitzer10.80%18.33%
Total125100.00%12100.00%

/** * blk_add_trace_rq_remap - Add a trace for a request-remap operation * @ignore: trace callback data parameter (not used) * @q: queue the io is for * @rq: the source request * @dev: target device * @from: source sector * * Description: * Device mapper remaps request to other devices. * Add a trace for that action. * **/
static void blk_add_trace_rq_remap(void *ignore, struct request_queue *q, struct request *rq, dev_t dev, sector_t from) { struct blk_trace *bt = q->blk_trace; struct blk_io_trace_remap r; if (likely(!bt)) return; r.device_from = cpu_to_be32(dev); r.device_to = cpu_to_be32(disk_devt(rq->rq_disk)); r.sector_from = cpu_to_be64(from); __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), rq_data_dir(rq), 0, BLK_TA_REMAP, 0, sizeof(r), &r, blk_trace_request_get_cgid(q, rq)); }

Contributors

PersonTokensPropCommitsCommitProp
Jun'ichi Nomura10788.43%120.00%
Shaohua Li75.79%120.00%
Steven Rostedt43.31%120.00%
Michael Christie21.65%120.00%
Christoph Hellwig10.83%120.00%
Total121100.00%5100.00%

/** * blk_add_driver_data - Add binary message with driver-specific data * @q: queue the io is for * @rq: io request * @data: driver-specific data * @len: length of driver-specific data * * Description: * Some drivers might want to write driver-specific data per request. * **/
void blk_add_driver_data(struct request_queue *q, struct request *rq, void *data, size_t len) { struct blk_trace *bt = q->blk_trace; if (likely(!bt)) return; __blk_add_trace(bt, blk_rq_trace_sector(rq), blk_rq_bytes(rq), 0, 0, BLK_TA_DRV_DATA, 0, len, data, blk_trace_request_get_cgid(q, rq)); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo5878.38%114.29%
Shaohua Li79.46%114.29%
Tejun Heo56.76%228.57%
Christoph Hellwig22.70%228.57%
Michael Christie22.70%114.29%
Total74100.00%7100.00%

EXPORT_SYMBOL_GPL(blk_add_driver_data);
static void blk_register_tracepoints(void) { int ret; ret = register_trace_block_rq_insert(blk_add_trace_rq_insert, NULL); WARN_ON(ret); ret = register_trace_block_rq_issue(blk_add_trace_rq_issue, NULL); WARN_ON(ret); ret = register_trace_block_rq_requeue(blk_add_trace_rq_requeue, NULL); WARN_ON(ret); ret = register_trace_block_rq_complete(blk_add_trace_rq_complete, NULL); WARN_ON(ret); ret = register_trace_block_bio_bounce(blk_add_trace_bio_bounce, NULL); WARN_ON(ret); ret = register_trace_block_bio_complete(blk_add_trace_bio_complete, NULL); WARN_ON(ret); ret = register_trace_block_bio_backmerge(blk_add_trace_bio_backmerge, NULL); WARN_ON(ret); ret = register_trace_block_bio_frontmerge(blk_add_trace_bio_frontmerge, NULL); WARN_ON(ret); ret = register_trace_block_bio_queue(blk_add_trace_bio_queue, NULL); WARN_ON(ret); ret = register_trace_block_getrq(blk_add_trace_getrq, NULL); WARN_ON(ret); ret = register_trace_block_sleeprq(blk_add_trace_sleeprq, NULL); WARN_ON(ret); ret = register_trace_block_plug(blk_add_trace_plug, NULL); WARN_ON(ret); ret = register_trace_block_unplug(blk_add_trace_unplug, NULL); WARN_ON(ret); ret = register_trace_block_split(blk_add_trace_split, NULL); WARN_ON(ret); ret = register_trace_block_bio_remap(blk_add_trace_bio_remap, NULL); WARN_ON(ret); ret = register_trace_block_rq_remap(blk_add_trace_rq_remap, NULL); WARN_ON(ret); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo18679.15%116.67%
Steven Rostedt3213.62%116.67%
Jun'ichi Nomura125.11%116.67%
Jens Axboe20.85%116.67%
Mike Snitzer20.85%116.67%
Li Zefan10.43%116.67%
Total235100.00%6100.00%


static void blk_unregister_tracepoints(void) { unregister_trace_block_rq_remap(blk_add_trace_rq_remap, NULL); unregister_trace_block_bio_remap(blk_add_trace_bio_remap, NULL); unregister_trace_block_split(blk_add_trace_split, NULL); unregister_trace_block_unplug(blk_add_trace_unplug, NULL); unregister_trace_block_plug(blk_add_trace_plug, NULL); unregister_trace_block_sleeprq(blk_add_trace_sleeprq, NULL); unregister_trace_block_getrq(blk_add_trace_getrq, NULL); unregister_trace_block_bio_queue(blk_add_trace_bio_queue, NULL); unregister_trace_block_bio_frontmerge(blk_add_trace_bio_frontmerge, NULL); unregister_trace_block_bio_backmerge(blk_add_trace_bio_backmerge, NULL); unregister_trace_block_bio_complete(blk_add_trace_bio_complete, NULL); unregister_trace_block_bio_bounce(blk_add_trace_bio_bounce, NULL); unregister_trace_block_rq_complete(blk_add_trace_rq_complete, NULL); unregister_trace_block_rq_requeue(blk_add_trace_rq_requeue, NULL); unregister_trace_block_rq_issue(blk_add_trace_rq_issue, NULL); unregister_trace_block_rq_insert(blk_add_trace_rq_insert, NULL); tracepoint_synchronize_unregister(); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo8266.67%120.00%
Steven Rostedt3226.02%120.00%
Jun'ichi Nomura54.07%120.00%
Jens Axboe21.63%120.00%
Mike Snitzer21.63%120.00%
Total123100.00%5100.00%

/* * struct blk_io_tracer formatting routines */
static void fill_rwbs(char *rwbs, const struct blk_io_trace *t) { int i = 0; int tc = t->action >> BLK_TC_SHIFT; if ((t->action & ~__BLK_TN_CGROUP) == BLK_TN_MESSAGE) { rwbs[i++] = 'N'; goto out; } if (tc & BLK_TC_FLUSH) rwbs[i++] = 'F'; if (tc & BLK_TC_DISCARD) rwbs[i++] = 'D'; else if (tc & BLK_TC_WRITE) rwbs[i++] = 'W'; else if (t->bytes) rwbs[i++] = 'R'; else rwbs[i++] = 'N'; if (tc & BLK_TC_FUA) rwbs[i++] = 'F'; if (tc & BLK_TC_AHEAD) rwbs[i++] = 'A'; if (tc & BLK_TC_SYNC) rwbs[i++] = 'S'; if (tc & BLK_TC_META) rwbs[i++] = 'M'; out: rwbs[i] = '\0'; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo12868.09%120.00%
Li Zefan3719.68%240.00%
Namhyung Kim189.57%120.00%
Shaohua Li52.66%120.00%
Total188100.00%5100.00%


static inline const struct blk_io_trace *te_blk_io_trace(const struct trace_entry *ent) { return (const struct blk_io_trace *)ent; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo25100.00%1100.00%
Total25100.00%1100.00%


static inline const void *pdu_start(const struct trace_entry *ent, bool has_cg) { return (void *)(te_blk_io_trace(ent) + 1) + (has_cg ? sizeof(union kernfs_node_id) : 0); }

Contributors

PersonTokensPropCommitsCommitProp
Shaohua Li2352.27%150.00%
Arnaldo Carvalho de Melo2147.73%150.00%
Total44100.00%2100.00%


static inline const void *cgid_start(const struct trace_entry *ent) { return (void *)(te_blk_io_trace(ent) + 1); }

Contributors

PersonTokensPropCommitsCommitProp
Shaohua Li29100.00%1100.00%
Total29100.00%1100.00%


static inline int pdu_real_len(const struct trace_entry *ent, bool has_cg) { return te_blk_io_trace(ent)->pdu_len - (has_cg ? sizeof(union kernfs_node_id) : 0); }

Contributors

PersonTokensPropCommitsCommitProp
Shaohua Li3494.44%150.00%
Arnaldo Carvalho de Melo25.56%150.00%
Total36100.00%2100.00%


static inline u32 t_action(const struct trace_entry *ent) { return te_blk_io_trace(ent)->action; }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan21100.00%1100.00%
Total21100.00%1100.00%


static inline u32 t_bytes(const struct trace_entry *ent) { return te_blk_io_trace(ent)->bytes; }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan21100.00%1100.00%
Total21100.00%1100.00%


static inline u32 t_sec(const struct trace_entry *ent) { return te_blk_io_trace(ent)->bytes >> 9; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo23100.00%1100.00%
Total23100.00%1100.00%


static inline unsigned long long t_sector(const struct trace_entry *ent) { return te_blk_io_trace(ent)->sector; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo23100.00%1100.00%
Total23100.00%1100.00%


static inline __u16 t_error(const struct trace_entry *ent) { return te_blk_io_trace(ent)->error; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2095.24%150.00%
Li Zefan14.76%150.00%
Total21100.00%2100.00%


static __u64 get_pdu_int(const struct trace_entry *ent, bool has_cg) { const __u64 *val = pdu_start(ent, has_cg); return be64_to_cpu(*val); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2985.29%150.00%
Shaohua Li514.71%150.00%
Total34100.00%2100.00%


static void get_pdu_remap(const struct trace_entry *ent, struct blk_io_trace_remap *r, bool has_cg) { const struct blk_io_trace_remap *__r = pdu_start(ent, has_cg); __u64 sector_from = __r->sector_from; r->device_from = be32_to_cpu(__r->device_from); r->device_to = be32_to_cpu(__r->device_to); r->sector_from = be64_to_cpu(sector_from); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo5881.69%133.33%
Alan D. Brunelle811.27%133.33%
Shaohua Li57.04%133.33%
Total71100.00%3100.00%

typedef void (blk_log_action_t) (struct trace_iterator *iter, const char *act, bool has_cg);
static void blk_log_action_classic(struct trace_iterator *iter, const char *act, bool has_cg) { char rwbs[RWBS_LEN]; unsigned long long ts = iter->ts; unsigned long nsec_rem = do_div(ts, NSEC_PER_SEC); unsigned secs = (unsigned long)ts; const struct blk_io_trace *t = te_blk_io_trace(iter->ent); fill_rwbs(rwbs, t); trace_seq_printf(&iter->seq, "%3d,%-3d %2d %5d.%09lu %5u %2s %3s ", MAJOR(t->device), MINOR(t->device), iter->cpu, secs, nsec_rem, iter->ent->pid, act, rwbs); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo9884.48%116.67%
Li Zefan1210.34%233.33%
Shaohua Li32.59%116.67%
Steven Rostedt21.72%116.67%
Namhyung Kim10.86%116.67%
Total116100.00%6100.00%


static void blk_log_action(struct trace_iterator *iter, const char *act, bool has_cg) { char rwbs[RWBS_LEN]; const struct blk_io_trace *t = te_blk_io_trace(iter->ent); fill_rwbs(rwbs, t); if (has_cg) { const union kernfs_node_id *id = cgid_start(iter->ent); if (blk_tracer_flags.val & TRACE_BLK_OPT_CGNAME) { char blkcg_name_buf[NAME_MAX + 1] = "<...>"; cgroup_path_from_kernfs_id(id, blkcg_name_buf, sizeof(blkcg_name_buf)); trace_seq_printf(&iter->seq, "%3d,%-3d %s %2s %3s ", MAJOR(t->device), MINOR(t->device), blkcg_name_buf, act, rwbs); } else trace_seq_printf(&iter->seq, "%3d,%-3d %x,%-x %2s %3s ", MAJOR(t->device), MINOR(t->device), id->ino, id->generation, act, rwbs); } else trace_seq_printf(&iter->seq, "%3d,%-3d %2s %3s ", MAJOR(t->device), MINOR(t->device), act, rwbs); }

Contributors

PersonTokensPropCommitsCommitProp
Shaohua Li12263.54%233.33%
Arnaldo Carvalho de Melo4724.48%116.67%
Li Zefan2010.42%116.67%
Steven Rostedt21.04%116.67%
Namhyung Kim10.52%116.67%
Total192100.00%6100.00%


static void blk_log_dump_pdu(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) { const unsigned char *pdu_buf; int pdu_len; int i, end; pdu_buf = pdu_start(ent, has_cg); pdu_len = pdu_real_len(ent, has_cg); if (!pdu_len) return; /* find the last zero that needs to be printed */ for (end = pdu_len - 1; end >= 0; end--) if (pdu_buf[end]) break; end++; trace_seq_putc(s, '('); for (i = 0; i < pdu_len; i++) { trace_seq_printf(s, "%s%02x", i == 0 ? "" : " ", pdu_buf[i]); /* * stop when the rest is just zeroes and indicate so * with a ".." appended */ if (i == end && end != pdu_len - 1) { trace_seq_puts(s, " ..) "); return; } } trace_seq_puts(s, ") "); }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan14189.81%250.00%
Steven Rostedt85.10%125.00%
Shaohua Li85.10%125.00%
Total157100.00%4100.00%


static void blk_log_generic(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) { char cmd[TASK_COMM_LEN]; trace_find_cmdline(ent->pid, cmd); if (t_action(ent) & BLK_TC_ACT(BLK_TC_PC)) { trace_seq_printf(s, "%u ", t_bytes(ent)); blk_log_dump_pdu(s, ent, has_cg); trace_seq_printf(s, "[%s]\n", cmd); } else { if (t_sec(ent)) trace_seq_printf(s, "%llu + %u [%s]\n", t_sector(ent), t_sec(ent), cmd); else trace_seq_printf(s, "[%s]\n", cmd); } }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo5748.31%120.00%
Li Zefan4437.29%120.00%
Steven Rostedt1210.17%240.00%
Shaohua Li54.24%120.00%
Total118100.00%5100.00%


static void blk_log_with_error(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) { if (t_action(ent) & BLK_TC_ACT(BLK_TC_PC)) { blk_log_dump_pdu(s, ent, has_cg); trace_seq_printf(s, "[%d]\n", t_error(ent)); } else { if (t_sec(ent)) trace_seq_printf(s, "%llu + %u [%d]\n", t_sector(ent), t_sec(ent), t_error(ent)); else trace_seq_printf(s, "%llu [%d]\n", t_sector(ent), t_error(ent)); } }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo6057.14%125.00%
Li Zefan3533.33%125.00%
Shaohua Li54.76%125.00%
Steven Rostedt54.76%125.00%
Total105100.00%4100.00%


static void blk_log_remap(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) { struct blk_io_trace_remap r = { .device_from = 0, }; get_pdu_remap(ent, &r, has_cg); trace_seq_printf(s, "%llu + %u <- (%d,%d) %llu\n", t_sector(ent), t_sec(ent), MAJOR(r.device_from), MINOR(r.device_from), (unsigned long long)r.sector_from); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo7086.42%125.00%
Shaohua Li56.17%125.00%
Alan D. Brunelle44.94%125.00%
Steven Rostedt22.47%125.00%
Total81100.00%4100.00%


static void blk_log_plug(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) { char cmd[TASK_COMM_LEN]; trace_find_cmdline(ent->pid, cmd); trace_seq_printf(s, "[%s]\n", cmd); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2352.27%125.00%
Steven Rostedt1840.91%250.00%
Shaohua Li36.82%125.00%
Total44100.00%4100.00%


static void blk_log_unplug(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) { char cmd[TASK_COMM_LEN]; trace_find_cmdline(ent->pid, cmd); trace_seq_printf(s, "[%s] %llu\n", cmd, get_pdu_int(ent, has_cg)); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2854.90%125.00%
Steven Rostedt1835.29%250.00%
Shaohua Li59.80%125.00%
Total51100.00%4100.00%


static void blk_log_split(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) { char cmd[TASK_COMM_LEN]; trace_find_cmdline(ent->pid, cmd); trace_seq_printf(s, "%llu / %llu [%s]\n", t_sector(ent), get_pdu_int(ent, has_cg), cmd); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo3358.93%125.00%
Steven Rostedt1832.14%250.00%
Shaohua Li58.93%125.00%
Total56100.00%4100.00%


static void blk_log_msg(struct trace_seq *s, const struct trace_entry *ent, bool has_cg) { trace_seq_putmem(s, pdu_start(ent, has_cg), pdu_real_len(ent, has_cg)); trace_seq_putc(s, '\n'); }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan2963.04%133.33%
Shaohua Li1532.61%133.33%
Steven Rostedt24.35%133.33%
Total46100.00%3100.00%

/* * struct tracer operations */
static void blk_tracer_print_header(struct seq_file *m) { if (!(blk_tracer_flags.val & TRACE_BLK_OPT_CLASSIC)) return; seq_puts(m, "# DEV CPU TIMESTAMP PID ACT FLG\n" "# | | | | | |\n"); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo31100.00%1100.00%
Total31100.00%1100.00%


static void blk_tracer_start(struct trace_array *tr) { blk_tracer_enabled = true; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1173.33%150.00%
Li Zefan426.67%150.00%
Total15100.00%2100.00%


static int blk_tracer_init(struct trace_array *tr) { blk_tr = tr; blk_tracer_start(tr); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo23100.00%1100.00%
Total23100.00%1100.00%


static void blk_tracer_stop(struct trace_array *tr) { blk_tracer_enabled = false; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1173.33%150.00%
Li Zefan426.67%150.00%
Total15100.00%2100.00%


static void blk_tracer_reset(struct trace_array *tr) { blk_tracer_stop(tr); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo16100.00%1100.00%
Total16100.00%1100.00%

static const struct { const char *act[2]; void (*print)(struct trace_seq *s, const struct trace_entry *ent, bool has_cg); } what2act[] = { [__BLK_TA_QUEUE] = {{ "Q", "queue" }, blk_log_generic }, [__BLK_TA_BACKMERGE] = {{ "M", "backmerge" }, blk_log_generic }, [__BLK_TA_FRONTMERGE] = {{ "F", "frontmerge" }, blk_log_generic }, [__BLK_TA_GETRQ] = {{ "G", "getrq" }, blk_log_generic }, [__BLK_TA_SLEEPRQ] = {{ "S", "sleeprq" }, blk_log_generic }, [__BLK_TA_REQUEUE] = {{ "R", "requeue" }, blk_log_with_error }, [__BLK_TA_ISSUE] = {{ "D", "issue" }, blk_log_generic }, [__BLK_TA_COMPLETE] = {{ "C", "complete" }, blk_log_with_error }, [__BLK_TA_PLUG] = {{ "P", "plug" }, blk_log_plug }, [__BLK_TA_UNPLUG_IO] = {{ "U", "unplug_io" }, blk_log_unplug }, [__BLK_TA_UNPLUG_TIMER] = {{ "UT", "unplug_timer" }, blk_log_unplug }, [__BLK_TA_INSERT] = {{ "I", "insert" }, blk_log_generic }, [__BLK_TA_SPLIT] = {{ "X", "split" }, blk_log_split }, [__BLK_TA_BOUNCE] = {{ "B", "bounce" }, blk_log_generic }, [__BLK_TA_REMAP] = {{ "A", "remap" }, blk_log_remap }, };
static enum print_line_t print_one_line(struct trace_iterator *iter, bool classic) { struct trace_array *tr = iter->tr; struct trace_seq *s = &iter->seq; const struct blk_io_trace *t; u16 what; bool long_act; blk_log_action_t *log_action; bool has_cg; t = te_blk_io_trace(iter->ent); what = (t->action & ((1 << BLK_TC_SHIFT) - 1)) & ~__BLK_TA_CGROUP; long_act = !!(tr->trace_flags & TRACE_ITER_VERBOSE); log_action = classic ? &blk_log_action_classic : &blk_log_action; has_cg = t->action & __BLK_TA_CGROUP; if ((t->action & ~__BLK_TN_CGROUP) == BLK_TN_MESSAGE) { log_action(iter, long_act ? "message" : "m", has_cg); blk_log_msg(s, iter->ent, has_cg); return trace_handle_return(s); } if (unlikely(what == 0 || what >= ARRAY_SIZE(what2act))) trace_seq_printf(s, "Unknown action %x\n", what); else { log_action(iter, what2act[what].act[long_act], has_cg); what2act[what].print(s, iter->ent, has_cg); } return trace_handle_return(s); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo10044.44%538.46%
Li Zefan7533.33%430.77%
Shaohua Li3515.56%215.38%
Steven Rostedt156.67%215.38%
Total225100.00%13100.00%


static enum print_line_t blk_trace_event_print(struct trace_iterator *iter, int flags, struct trace_event *event) { return print_one_line(iter, false); }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan2382.14%150.00%
Steven Rostedt517.86%150.00%
Total28100.00%2100.00%


static void blk_trace_synthesize_old_trace(struct trace_iterator *iter) { struct trace_seq *s = &iter->seq; struct blk_io_trace *t = (struct blk_io_trace *)iter->ent; const int offset = offsetof(struct blk_io_trace, sector); struct blk_io_trace old = { .magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION, .time = iter->ts, }; trace_seq_putmem(s, &old, offset); trace_seq_putmem(s, &t->sector, sizeof(old) - offset + t->pdu_len); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo9596.94%150.00%
Steven Rostedt33.06%150.00%
Total98100.00%2100.00%


static enum print_line_t blk_trace_event_print_binary(struct trace_iterator *iter, int flags, struct trace_event *event) { blk_trace_synthesize_old_trace(iter); return trace_handle_return(&iter->seq); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2058.82%250.00%
Steven Rostedt1441.18%250.00%
Total34100.00%4100.00%


static enum print_line_t blk_tracer_print_line(struct trace_iterator *iter) { if (!(blk_tracer_flags.val & TRACE_BLK_OPT_CLASSIC)) return TRACE_TYPE_UNHANDLED; return print_one_line(iter, true); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo3191.18%150.00%
Li Zefan38.82%150.00%
Total34100.00%2100.00%


static int blk_tracer_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int set) { /* don't output context-info for blk_classic output */ if (bit == TRACE_BLK_OPT_CLASSIC) { if (set) tr->trace_flags &= ~TRACE_ITER_CONTEXT_INFO; else tr->trace_flags |= TRACE_ITER_CONTEXT_INFO; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan4182.00%133.33%
Steven Rostedt918.00%266.67%
Total50100.00%3100.00%

static struct tracer blk_tracer __read_mostly = { .name = "blk", .init = blk_tracer_init, .reset = blk_tracer_reset, .start = blk_tracer_start, .stop = blk_tracer_stop, .print_header = blk_tracer_print_header, .print_line = blk_tracer_print_line, .flags = &blk_tracer_flags, .set_flag = blk_tracer_set_flag, }; static struct trace_event_functions trace_blk_event_funcs = { .trace = blk_trace_event_print, .binary = blk_trace_event_print_binary, }; static struct trace_event trace_blk_event = { .type = TRACE_BLK, .funcs = &trace_blk_event_funcs, };
static int __init init_blk_tracer(void) { if (!register_trace_event(&trace_blk_event)) { pr_warn("Warning: could not register block events\n"); return 1; } if (register_tracer(&blk_tracer) != 0) { pr_warn("Warning: could not register the block tracer\n"); unregister_trace_event(&trace_blk_event); return 1; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo5392.98%133.33%
Joe Perches23.51%133.33%
Steven Rostedt23.51%133.33%
Total57100.00%3100.00%

device_initcall(init_blk_tracer);
static int blk_trace_remove_queue(struct request_queue *q) { struct blk_trace *bt; bt = xchg(&q->blk_trace, NULL); if (bt == NULL) return -EINVAL; put_probe_ref(); blk_trace_free(bt); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo4591.84%125.00%
Li Zefan36.12%250.00%
Jens Axboe12.04%125.00%
Total49100.00%4100.00%

/* * Setup everything required to start tracing */
static int blk_trace_setup_queue(struct request_queue *q, struct block_device *bdev) { struct blk_trace *bt = NULL; int ret = -ENOMEM; bt = kzalloc(sizeof(*bt), GFP_KERNEL); if (!bt) return -ENOMEM; bt->msg_data = __alloc_percpu(BLK_TN_MAX_MSG, __alignof__(char)); if (!bt->msg_data) goto free_bt; bt->dev = bdev->bd_dev; bt->act_mask = (u16)-1; blk_trace_setup_lba(bt, bdev); ret = -EBUSY; if (cmpxchg(&q->blk_trace, NULL, bt)) goto free_bt; get_probe_ref(); return 0; free_bt: blk_trace_free(bt); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo6849.28%114.29%
Li Zefan6144.20%457.14%
Davidlohr Bueso A85.80%114.29%
Jens Axboe10.72%114.29%
Total138100.00%7100.00%

/* * sysfs interface to enable and configure tracing */ static ssize_t sysfs_blk_trace_attr_show(struct device *dev, struct device_attribute *attr, char *buf); static ssize_t sysfs_blk_trace_attr_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); #define BLK_TRACE_DEVICE_ATTR(_name) \ DEVICE_ATTR(_name, S_IRUGO | S_IWUSR, \ sysfs_blk_trace_attr_show, \ sysfs_blk_trace_attr_store) static BLK_TRACE_DEVICE_ATTR(enable); static BLK_TRACE_DEVICE_ATTR(act_mask); static BLK_TRACE_DEVICE_ATTR(pid); static BLK_TRACE_DEVICE_ATTR(start_lba); static BLK_TRACE_DEVICE_ATTR(end_lba); static struct attribute *blk_trace_attrs[] = { &dev_attr_enable.attr, &dev_attr_act_mask.attr, &dev_attr_pid.attr, &dev_attr_start_lba.attr, &dev_attr_end_lba.attr, NULL }; struct attribute_group blk_trace_attr_group = { .name = "trace", .attrs = blk_trace_attrs, }; static const struct { int mask; const char *str; } mask_maps[] = { { BLK_TC_READ, "read" }, { BLK_TC_WRITE, "write" }, { BLK_TC_FLUSH, "flush" }, { BLK_TC_SYNC, "sync" }, { BLK_TC_QUEUE, "queue" }, { BLK_TC_REQUEUE, "requeue" }, { BLK_TC_ISSUE, "issue" }, { BLK_TC_COMPLETE, "complete" }, { BLK_TC_FS, "fs" }, { BLK_TC_PC, "pc" }, { BLK_TC_NOTIFY, "notify" }, { BLK_TC_AHEAD, "ahead" }, { BLK_TC_META, "meta" }, { BLK_TC_DISCARD, "discard" }, { BLK_TC_DRV_DATA, "drv_data" }, { BLK_TC_FUA, "fua" }, };
static int blk_trace_str2mask(const char *str) { int i; int mask = 0; char *buf, *s, *token; buf = kstrdup(str, GFP_KERNEL); if (buf == NULL) return -ENOMEM; s = strstrip(buf); while (1) { token = strsep(&s, ","); if (token == NULL) break; if (*token == '\0') continue; for (i = 0; i < ARRAY_SIZE(mask_maps); i++) { if (strcasecmp(token, mask_maps[i].str) == 0) { mask |= mask_maps[i].mask; break; } } if (i == ARRAY_SIZE(mask_maps)) { mask = -EINVAL; break; } } kfree(buf); return mask; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo8050.96%133.33%
Li Zefan7749.04%266.67%
Total157100.00%3100.00%


static ssize_t blk_trace_mask2str(char *buf, int mask) { int i; char *p = buf; for (i = 0; i < ARRAY_SIZE(mask_maps); i++) { if (mask & mask_maps[i].mask) { p += sprintf(p, "%s%s", (p == buf) ? "" : ",", mask_maps[i].str); } } *p++ = '\n'; return p - buf; }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan7583.33%150.00%
Arnaldo Carvalho de Melo1516.67%150.00%
Total90100.00%2100.00%


static struct request_queue *blk_trace_get_queue(struct block_device *bdev) { if (bdev->bd_disk == NULL) return NULL; return bdev_get_queue(bdev); }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan30100.00%1100.00%
Total30100.00%1100.00%


static ssize_t sysfs_blk_trace_attr_show(struct device *dev, struct device_attribute *attr, char *buf) { struct hd_struct *p = dev_to_part(dev); struct request_queue *q; struct block_device *bdev; ssize_t ret = -ENXIO; bdev = bdget(part_devt(p)); if (bdev == NULL) goto out; q = blk_trace_get_queue(bdev); if (q == NULL) goto out_bdput; mutex_lock(&q->blk_trace_mutex); if (attr == &dev_attr_enable) { ret = sprintf(buf, "%u\n", !!q->blk_trace); goto out_unlock_bdev; } if (q->blk_trace == NULL) ret = sprintf(buf, "disabled\n"); else if (attr == &dev_attr_act_mask) ret = blk_trace_mask2str(buf, q->blk_trace->act_mask); else if (attr == &dev_attr_pid) ret = sprintf(buf, "%u\n", q->blk_trace->pid); else if (attr == &dev_attr_start_lba) ret = sprintf(buf, "%llu\n", q->blk_trace->start_lba); else if (attr == &dev_attr_end_lba) ret = sprintf(buf, "%llu\n", q->blk_trace->end_lba); out_unlock_bdev: mutex_unlock(&q->blk_trace_mutex); out_bdput: bdput(bdev); out: return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo20884.90%116.67%
Li Zefan3112.65%350.00%
Waiman Long41.63%116.67%
Arnd Bergmann20.82%116.67%
Total245100.00%6100.00%


static ssize_t sysfs_blk_trace_attr_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct block_device *bdev; struct request_queue *q; struct hd_struct *p; u64 value; ssize_t ret = -EINVAL; if (count == 0) goto out; if (attr == &dev_attr_act_mask) { if (kstrtoull(buf, 0, &value)) { /* Assume it is a list of trace category names */ ret = blk_trace_str2mask(buf); if (ret < 0) goto out; value = ret; } } else if (kstrtoull(buf, 0, &value)) goto out; ret = -ENXIO; p = dev_to_part(dev); bdev = bdget(part_devt(p)); if (bdev == NULL) goto out; q = blk_trace_get_queue(bdev); if (q == NULL) goto out_bdput; mutex_lock(&q->blk_trace_mutex); if (attr == &dev_attr_enable) { if (value) ret = blk_trace_setup_queue(q, bdev); else ret = blk_trace_remove_queue(q); goto out_unlock_bdev; } ret = 0; if (q->blk_trace == NULL) ret = blk_trace_setup_queue(q, bdev); if (ret == 0) { if (attr == &dev_attr_act_mask) q->blk_trace->act_mask = value; else if (attr == &dev_attr_pid) q->blk_trace->pid = value; else if (attr == &dev_attr_start_lba) q->blk_trace->start_lba = value; else if (attr == &dev_attr_end_lba) q->blk_trace->end_lba = value; } out_unlock_bdev: mutex_unlock(&q->blk_trace_mutex); out_bdput: bdput(bdev); out: return ret ? ret : count; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo26180.80%114.29%
Li Zefan5316.41%342.86%
Shaohua Li41.24%114.29%
Waiman Long41.24%114.29%
Arnd Bergmann10.31%114.29%
Total323100.00%7100.00%


int blk_trace_init_sysfs(struct device *dev) { return sysfs_create_group(&dev->kobj, &blk_trace_attr_group); }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan22100.00%1100.00%
Total22100.00%1100.00%


void blk_trace_remove_sysfs(struct device *dev) { sysfs_remove_group(&dev->kobj, &blk_trace_attr_group); }

Contributors

PersonTokensPropCommitsCommitProp
Zdenek Kabelac21100.00%1100.00%
Total21100.00%1100.00%

#endif /* CONFIG_BLK_DEV_IO_TRACE */ #ifdef CONFIG_EVENT_TRACING
void blk_fill_rwbs(char *rwbs, unsigned int op, int bytes) { int i = 0; if (op & REQ_PREFLUSH) rwbs[i++] = 'F'; switch (op & REQ_OP_MASK) { case REQ_OP_WRITE: case REQ_OP_WRITE_SAME: rwbs[i++] = 'W'; break; case REQ_OP_DISCARD: rwbs[i++] = 'D'; break; case REQ_OP_SECURE_ERASE: rwbs[i++] = 'D'; rwbs[i++] = 'E'; break; case REQ_OP_FLUSH: rwbs[i++] = 'F'; break; case REQ_OP_READ: rwbs[i++] = 'R'; break; default: rwbs[i++] = 'N'; } if (op & REQ_FUA) rwbs[i++] = 'F'; if (op & REQ_RAHEAD) rwbs[i++] = 'A'; if (op & REQ_SYNC) rwbs[i++] = 'S'; if (op & REQ_META) rwbs[i++] = 'M'; rwbs[i] = '\0'; }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan9651.61%112.50%
Michael Christie3619.35%337.50%
Christoph Hellwig3116.67%337.50%
Namhyung Kim2312.37%112.50%
Total186100.00%8100.00%

EXPORT_SYMBOL_GPL(blk_fill_rwbs); #endif /* CONFIG_EVENT_TRACING */

Overall Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo350238.38%96.47%
Jens Axboe168018.41%1611.51%
Li Zefan131914.46%2719.42%
Shaohua Li7458.17%64.32%
Arnd Bergmann3293.61%53.60%
Steven Rostedt3243.55%117.91%
Alan D. Brunelle2322.54%53.60%
Olaf Kirch1391.52%10.72%
Jun'ichi Nomura1241.36%10.72%
Michael Christie1111.22%32.16%
Jan Kara1081.18%10.72%
Christoph Hellwig690.76%96.47%
Namhyung Kim630.69%10.72%
Christof Schmitt470.52%10.72%
Omar Sandoval450.49%32.16%
Shawn Du370.41%10.72%
Roman Peniaev260.28%10.72%
David Woodhouse210.23%21.44%
Zdenek Kabelac210.23%10.72%
Tejun Heo200.22%42.88%
Kent Overstreet170.19%21.44%
Tao Ma160.18%21.44%
Davidlohr Bueso A130.14%10.72%
Waiman Long130.14%10.72%
Carl Henrik Lunde120.13%10.72%
Alexey Dobriyan80.09%10.72%
Ingo Molnar80.09%21.44%
Al Viro70.08%21.44%
Marcos Paulo de Souza60.07%10.72%
Mike Snitzer60.07%10.72%
Chen Gang S60.07%10.72%
Dmitriy Monakhov60.07%10.72%
Stefan Raspl50.05%10.72%
Rusty Russell50.05%10.72%
Mathieu Desnoyers50.05%21.44%
Linus Torvalds50.05%10.72%
Nathan Scott50.05%10.72%
Adrian Hunter40.04%10.72%
Rasmus Villemoes40.04%10.72%
Paul Gortmaker30.03%10.72%
Stephen Boyd20.02%10.72%
Joe Perches20.02%10.72%
Arjan van de Ven10.01%10.72%
Shan Wei10.01%10.72%
Frédéric Weisbecker10.01%10.72%
Randy Dunlap10.01%10.72%
Total9124100.00%139100.00%
Directory: kernel/trace
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.