aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/blktrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/blktrace.c')
-rw-r--r--kernel/trace/blktrace.c128
1 files changed, 48 insertions, 80 deletions
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
index 959f8d6c8cc1..6957aa298dfa 100644
--- a/kernel/trace/blktrace.c
+++ b/kernel/trace/blktrace.c
@@ -23,7 +23,6 @@
23#include <linux/mutex.h> 23#include <linux/mutex.h>
24#include <linux/slab.h> 24#include <linux/slab.h>
25#include <linux/debugfs.h> 25#include <linux/debugfs.h>
26#include <linux/smp_lock.h>
27#include <linux/time.h> 26#include <linux/time.h>
28#include <linux/uaccess.h> 27#include <linux/uaccess.h>
29 28
@@ -139,6 +138,13 @@ void __trace_note_message(struct blk_trace *bt, const char *fmt, ...)
139 !blk_tracer_enabled)) 138 !blk_tracer_enabled))
140 return; 139 return;
141 140
141 /*
142 * If the BLK_TC_NOTIFY action mask isn't set, don't send any note
143 * message to the trace.
144 */
145 if (!(bt->act_mask & BLK_TC_NOTIFY))
146 return;
147
142 local_irq_save(flags); 148 local_irq_save(flags);
143 buf = per_cpu_ptr(bt->msg_data, smp_processor_id()); 149 buf = per_cpu_ptr(bt->msg_data, smp_processor_id());
144 va_start(args, fmt); 150 va_start(args, fmt);
@@ -169,7 +175,6 @@ static int act_log_check(struct blk_trace *bt, u32 what, sector_t sector,
169static const u32 ddir_act[2] = { BLK_TC_ACT(BLK_TC_READ), 175static const u32 ddir_act[2] = { BLK_TC_ACT(BLK_TC_READ),
170 BLK_TC_ACT(BLK_TC_WRITE) }; 176 BLK_TC_ACT(BLK_TC_WRITE) };
171 177
172#define BLK_TC_HARDBARRIER BLK_TC_BARRIER
173#define BLK_TC_RAHEAD BLK_TC_AHEAD 178#define BLK_TC_RAHEAD BLK_TC_AHEAD
174 179
175/* The ilog2() calls fall out because they're constant */ 180/* The ilog2() calls fall out because they're constant */
@@ -197,7 +202,6 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
197 return; 202 return;
198 203
199 what |= ddir_act[rw & WRITE]; 204 what |= ddir_act[rw & WRITE];
200 what |= MASK_TC_BIT(rw, HARDBARRIER);
201 what |= MASK_TC_BIT(rw, SYNC); 205 what |= MASK_TC_BIT(rw, SYNC);
202 what |= MASK_TC_BIT(rw, RAHEAD); 206 what |= MASK_TC_BIT(rw, RAHEAD);
203 what |= MASK_TC_BIT(rw, META); 207 what |= MASK_TC_BIT(rw, META);
@@ -326,6 +330,7 @@ static const struct file_operations blk_dropped_fops = {
326 .owner = THIS_MODULE, 330 .owner = THIS_MODULE,
327 .open = blk_dropped_open, 331 .open = blk_dropped_open,
328 .read = blk_dropped_read, 332 .read = blk_dropped_read,
333 .llseek = default_llseek,
329}; 334};
330 335
331static int blk_msg_open(struct inode *inode, struct file *filp) 336static int blk_msg_open(struct inode *inode, struct file *filp)
@@ -365,6 +370,7 @@ static const struct file_operations blk_msg_fops = {
365 .owner = THIS_MODULE, 370 .owner = THIS_MODULE,
366 .open = blk_msg_open, 371 .open = blk_msg_open,
367 .write = blk_msg_write, 372 .write = blk_msg_write,
373 .llseek = noop_llseek,
368}; 374};
369 375
370/* 376/*
@@ -639,7 +645,6 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
639 if (!q) 645 if (!q)
640 return -ENXIO; 646 return -ENXIO;
641 647
642 lock_kernel();
643 mutex_lock(&bdev->bd_mutex); 648 mutex_lock(&bdev->bd_mutex);
644 649
645 switch (cmd) { 650 switch (cmd) {
@@ -667,7 +672,6 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
667 } 672 }
668 673
669 mutex_unlock(&bdev->bd_mutex); 674 mutex_unlock(&bdev->bd_mutex);
670 unlock_kernel();
671 return ret; 675 return ret;
672} 676}
673 677
@@ -699,28 +703,21 @@ void blk_trace_shutdown(struct request_queue *q)
699 * 703 *
700 **/ 704 **/
701static void blk_add_trace_rq(struct request_queue *q, struct request *rq, 705static void blk_add_trace_rq(struct request_queue *q, struct request *rq,
702 u32 what) 706 u32 what)
703{ 707{
704 struct blk_trace *bt = q->blk_trace; 708 struct blk_trace *bt = q->blk_trace;
705 int rw = rq->cmd_flags & 0x03;
706 709
707 if (likely(!bt)) 710 if (likely(!bt))
708 return; 711 return;
709 712
710 if (rq->cmd_flags & REQ_DISCARD)
711 rw |= REQ_DISCARD;
712
713 if (rq->cmd_flags & REQ_SECURE)
714 rw |= REQ_SECURE;
715
716 if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { 713 if (rq->cmd_type == REQ_TYPE_BLOCK_PC) {
717 what |= BLK_TC_ACT(BLK_TC_PC); 714 what |= BLK_TC_ACT(BLK_TC_PC);
718 __blk_add_trace(bt, 0, blk_rq_bytes(rq), rw, 715 __blk_add_trace(bt, 0, blk_rq_bytes(rq), rq->cmd_flags,
719 what, rq->errors, rq->cmd_len, rq->cmd); 716 what, rq->errors, rq->cmd_len, rq->cmd);
720 } else { 717 } else {
721 what |= BLK_TC_ACT(BLK_TC_FS); 718 what |= BLK_TC_ACT(BLK_TC_FS);
722 __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), rw, 719 __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq),
723 what, rq->errors, 0, NULL); 720 rq->cmd_flags, what, rq->errors, 0, NULL);
724 } 721 }
725} 722}
726 723
@@ -761,53 +758,58 @@ static void blk_add_trace_rq_complete(void *ignore,
761 * @q: queue the io is for 758 * @q: queue the io is for
762 * @bio: the source bio 759 * @bio: the source bio
763 * @what: the action 760 * @what: the action
761 * @error: error, if any
764 * 762 *
765 * Description: 763 * Description:
766 * Records an action against a bio. Will log the bio offset + size. 764 * Records an action against a bio. Will log the bio offset + size.
767 * 765 *
768 **/ 766 **/
769static void blk_add_trace_bio(struct request_queue *q, struct bio *bio, 767static void blk_add_trace_bio(struct request_queue *q, struct bio *bio,
770 u32 what) 768 u32 what, int error)
771{ 769{
772 struct blk_trace *bt = q->blk_trace; 770 struct blk_trace *bt = q->blk_trace;
773 771
774 if (likely(!bt)) 772 if (likely(!bt))
775 return; 773 return;
776 774
775 if (!error && !bio_flagged(bio, BIO_UPTODATE))
776 error = EIO;
777
777 __blk_add_trace(bt, bio->bi_sector, bio->bi_size, bio->bi_rw, what, 778 __blk_add_trace(bt, bio->bi_sector, bio->bi_size, bio->bi_rw, what,
778 !bio_flagged(bio, BIO_UPTODATE), 0, NULL); 779 error, 0, NULL);
779} 780}
780 781
781static void blk_add_trace_bio_bounce(void *ignore, 782static void blk_add_trace_bio_bounce(void *ignore,
782 struct request_queue *q, struct bio *bio) 783 struct request_queue *q, struct bio *bio)
783{ 784{
784 blk_add_trace_bio(q, bio, BLK_TA_BOUNCE); 785 blk_add_trace_bio(q, bio, BLK_TA_BOUNCE, 0);
785} 786}
786 787
787static void blk_add_trace_bio_complete(void *ignore, 788static void blk_add_trace_bio_complete(void *ignore,
788 struct request_queue *q, struct bio *bio) 789 struct request_queue *q, struct bio *bio,
790 int error)
789{ 791{
790 blk_add_trace_bio(q, bio, BLK_TA_COMPLETE); 792 blk_add_trace_bio(q, bio, BLK_TA_COMPLETE, error);
791} 793}
792 794
793static void blk_add_trace_bio_backmerge(void *ignore, 795static void blk_add_trace_bio_backmerge(void *ignore,
794 struct request_queue *q, 796 struct request_queue *q,
795 struct bio *bio) 797 struct bio *bio)
796{ 798{
797 blk_add_trace_bio(q, bio, BLK_TA_BACKMERGE); 799 blk_add_trace_bio(q, bio, BLK_TA_BACKMERGE, 0);
798} 800}
799 801
800static void blk_add_trace_bio_frontmerge(void *ignore, 802static void blk_add_trace_bio_frontmerge(void *ignore,
801 struct request_queue *q, 803 struct request_queue *q,
802 struct bio *bio) 804 struct bio *bio)
803{ 805{
804 blk_add_trace_bio(q, bio, BLK_TA_FRONTMERGE); 806 blk_add_trace_bio(q, bio, BLK_TA_FRONTMERGE, 0);
805} 807}
806 808
807static void blk_add_trace_bio_queue(void *ignore, 809static void blk_add_trace_bio_queue(void *ignore,
808 struct request_queue *q, struct bio *bio) 810 struct request_queue *q, struct bio *bio)
809{ 811{
810 blk_add_trace_bio(q, bio, BLK_TA_QUEUE); 812 blk_add_trace_bio(q, bio, BLK_TA_QUEUE, 0);
811} 813}
812 814
813static void blk_add_trace_getrq(void *ignore, 815static void blk_add_trace_getrq(void *ignore,
@@ -815,7 +817,7 @@ static void blk_add_trace_getrq(void *ignore,
815 struct bio *bio, int rw) 817 struct bio *bio, int rw)
816{ 818{
817 if (bio) 819 if (bio)
818 blk_add_trace_bio(q, bio, BLK_TA_GETRQ); 820 blk_add_trace_bio(q, bio, BLK_TA_GETRQ, 0);
819 else { 821 else {
820 struct blk_trace *bt = q->blk_trace; 822 struct blk_trace *bt = q->blk_trace;
821 823
@@ -830,7 +832,7 @@ static void blk_add_trace_sleeprq(void *ignore,
830 struct bio *bio, int rw) 832 struct bio *bio, int rw)
831{ 833{
832 if (bio) 834 if (bio)
833 blk_add_trace_bio(q, bio, BLK_TA_SLEEPRQ); 835 blk_add_trace_bio(q, bio, BLK_TA_SLEEPRQ, 0);
834 else { 836 else {
835 struct blk_trace *bt = q->blk_trace; 837 struct blk_trace *bt = q->blk_trace;
836 838
@@ -848,29 +850,21 @@ static void blk_add_trace_plug(void *ignore, struct request_queue *q)
848 __blk_add_trace(bt, 0, 0, 0, BLK_TA_PLUG, 0, 0, NULL); 850 __blk_add_trace(bt, 0, 0, 0, BLK_TA_PLUG, 0, 0, NULL);
849} 851}
850 852
851static void blk_add_trace_unplug_io(void *ignore, struct request_queue *q) 853static void blk_add_trace_unplug(void *ignore, struct request_queue *q,
854 unsigned int depth, bool explicit)
852{ 855{
853 struct blk_trace *bt = q->blk_trace; 856 struct blk_trace *bt = q->blk_trace;
854 857
855 if (bt) { 858 if (bt) {
856 unsigned int pdu = q->rq.count[READ] + q->rq.count[WRITE]; 859 __be64 rpdu = cpu_to_be64(depth);
857 __be64 rpdu = cpu_to_be64(pdu); 860 u32 what;
858 861
859 __blk_add_trace(bt, 0, 0, 0, BLK_TA_UNPLUG_IO, 0, 862 if (explicit)
860 sizeof(rpdu), &rpdu); 863 what = BLK_TA_UNPLUG_IO;
861 } 864 else
862} 865 what = BLK_TA_UNPLUG_TIMER;
863
864static void blk_add_trace_unplug_timer(void *ignore, struct request_queue *q)
865{
866 struct blk_trace *bt = q->blk_trace;
867
868 if (bt) {
869 unsigned int pdu = q->rq.count[READ] + q->rq.count[WRITE];
870 __be64 rpdu = cpu_to_be64(pdu);
871 866
872 __blk_add_trace(bt, 0, 0, 0, BLK_TA_UNPLUG_TIMER, 0, 867 __blk_add_trace(bt, 0, 0, 0, what, 0, sizeof(rpdu), &rpdu);
873 sizeof(rpdu), &rpdu);
874 } 868 }
875} 869}
876 870
@@ -890,7 +884,7 @@ static void blk_add_trace_split(void *ignore,
890} 884}
891 885
892/** 886/**
893 * blk_add_trace_remap - Add a trace for a remap operation 887 * blk_add_trace_bio_remap - Add a trace for a bio-remap operation
894 * @ignore: trace callback data parameter (not used) 888 * @ignore: trace callback data parameter (not used)
895 * @q: queue the io is for 889 * @q: queue the io is for
896 * @bio: the source bio 890 * @bio: the source bio
@@ -902,9 +896,9 @@ static void blk_add_trace_split(void *ignore,
902 * it spans a stripe (or similar). Add a trace for that action. 896 * it spans a stripe (or similar). Add a trace for that action.
903 * 897 *
904 **/ 898 **/
905static void blk_add_trace_remap(void *ignore, 899static void blk_add_trace_bio_remap(void *ignore,
906 struct request_queue *q, struct bio *bio, 900 struct request_queue *q, struct bio *bio,
907 dev_t dev, sector_t from) 901 dev_t dev, sector_t from)
908{ 902{
909 struct blk_trace *bt = q->blk_trace; 903 struct blk_trace *bt = q->blk_trace;
910 struct blk_io_trace_remap r; 904 struct blk_io_trace_remap r;
@@ -1013,13 +1007,11 @@ static void blk_register_tracepoints(void)
1013 WARN_ON(ret); 1007 WARN_ON(ret);
1014 ret = register_trace_block_plug(blk_add_trace_plug, NULL); 1008 ret = register_trace_block_plug(blk_add_trace_plug, NULL);
1015 WARN_ON(ret); 1009 WARN_ON(ret);
1016 ret = register_trace_block_unplug_timer(blk_add_trace_unplug_timer, NULL); 1010 ret = register_trace_block_unplug(blk_add_trace_unplug, NULL);
1017 WARN_ON(ret);
1018 ret = register_trace_block_unplug_io(blk_add_trace_unplug_io, NULL);
1019 WARN_ON(ret); 1011 WARN_ON(ret);
1020 ret = register_trace_block_split(blk_add_trace_split, NULL); 1012 ret = register_trace_block_split(blk_add_trace_split, NULL);
1021 WARN_ON(ret); 1013 WARN_ON(ret);
1022 ret = register_trace_block_remap(blk_add_trace_remap, NULL); 1014 ret = register_trace_block_bio_remap(blk_add_trace_bio_remap, NULL);
1023 WARN_ON(ret); 1015 WARN_ON(ret);
1024 ret = register_trace_block_rq_remap(blk_add_trace_rq_remap, NULL); 1016 ret = register_trace_block_rq_remap(blk_add_trace_rq_remap, NULL);
1025 WARN_ON(ret); 1017 WARN_ON(ret);
@@ -1028,10 +1020,9 @@ static void blk_register_tracepoints(void)
1028static void blk_unregister_tracepoints(void) 1020static void blk_unregister_tracepoints(void)
1029{ 1021{
1030 unregister_trace_block_rq_remap(blk_add_trace_rq_remap, NULL); 1022 unregister_trace_block_rq_remap(blk_add_trace_rq_remap, NULL);
1031 unregister_trace_block_remap(blk_add_trace_remap, NULL); 1023 unregister_trace_block_bio_remap(blk_add_trace_bio_remap, NULL);
1032 unregister_trace_block_split(blk_add_trace_split, NULL); 1024 unregister_trace_block_split(blk_add_trace_split, NULL);
1033 unregister_trace_block_unplug_io(blk_add_trace_unplug_io, NULL); 1025 unregister_trace_block_unplug(blk_add_trace_unplug, NULL);
1034 unregister_trace_block_unplug_timer(blk_add_trace_unplug_timer, NULL);
1035 unregister_trace_block_plug(blk_add_trace_plug, NULL); 1026 unregister_trace_block_plug(blk_add_trace_plug, NULL);
1036 unregister_trace_block_sleeprq(blk_add_trace_sleeprq, NULL); 1027 unregister_trace_block_sleeprq(blk_add_trace_sleeprq, NULL);
1037 unregister_trace_block_getrq(blk_add_trace_getrq, NULL); 1028 unregister_trace_block_getrq(blk_add_trace_getrq, NULL);
@@ -1652,10 +1643,9 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev,
1652 struct block_device *bdev; 1643 struct block_device *bdev;
1653 ssize_t ret = -ENXIO; 1644 ssize_t ret = -ENXIO;
1654 1645
1655 lock_kernel();
1656 bdev = bdget(part_devt(p)); 1646 bdev = bdget(part_devt(p));
1657 if (bdev == NULL) 1647 if (bdev == NULL)
1658 goto out_unlock_kernel; 1648 goto out;
1659 1649
1660 q = blk_trace_get_queue(bdev); 1650 q = blk_trace_get_queue(bdev);
1661 if (q == NULL) 1651 if (q == NULL)
@@ -1683,8 +1673,7 @@ out_unlock_bdev:
1683 mutex_unlock(&bdev->bd_mutex); 1673 mutex_unlock(&bdev->bd_mutex);
1684out_bdput: 1674out_bdput:
1685 bdput(bdev); 1675 bdput(bdev);
1686out_unlock_kernel: 1676out:
1687 unlock_kernel();
1688 return ret; 1677 return ret;
1689} 1678}
1690 1679
@@ -1714,11 +1703,10 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev,
1714 1703
1715 ret = -ENXIO; 1704 ret = -ENXIO;
1716 1705
1717 lock_kernel();
1718 p = dev_to_part(dev); 1706 p = dev_to_part(dev);
1719 bdev = bdget(part_devt(p)); 1707 bdev = bdget(part_devt(p));
1720 if (bdev == NULL) 1708 if (bdev == NULL)
1721 goto out_unlock_kernel; 1709 goto out;
1722 1710
1723 q = blk_trace_get_queue(bdev); 1711 q = blk_trace_get_queue(bdev);
1724 if (q == NULL) 1712 if (q == NULL)
@@ -1753,8 +1741,6 @@ out_unlock_bdev:
1753 mutex_unlock(&bdev->bd_mutex); 1741 mutex_unlock(&bdev->bd_mutex);
1754out_bdput: 1742out_bdput:
1755 bdput(bdev); 1743 bdput(bdev);
1756out_unlock_kernel:
1757 unlock_kernel();
1758out: 1744out:
1759 return ret ? ret : count; 1745 return ret ? ret : count;
1760} 1746}
@@ -1813,8 +1799,6 @@ void blk_fill_rwbs(char *rwbs, u32 rw, int bytes)
1813 1799
1814 if (rw & REQ_RAHEAD) 1800 if (rw & REQ_RAHEAD)
1815 rwbs[i++] = 'A'; 1801 rwbs[i++] = 'A';
1816 if (rw & REQ_HARDBARRIER)
1817 rwbs[i++] = 'B';
1818 if (rw & REQ_SYNC) 1802 if (rw & REQ_SYNC)
1819 rwbs[i++] = 'S'; 1803 rwbs[i++] = 'S';
1820 if (rw & REQ_META) 1804 if (rw & REQ_META)
@@ -1825,21 +1809,5 @@ void blk_fill_rwbs(char *rwbs, u32 rw, int bytes)
1825 rwbs[i] = '\0'; 1809 rwbs[i] = '\0';
1826} 1810}
1827 1811
1828void blk_fill_rwbs_rq(char *rwbs, struct request *rq)
1829{
1830 int rw = rq->cmd_flags & 0x03;
1831 int bytes;
1832
1833 if (rq->cmd_flags & REQ_DISCARD)
1834 rw |= REQ_DISCARD;
1835
1836 if (rq->cmd_flags & REQ_SECURE)
1837 rw |= REQ_SECURE;
1838
1839 bytes = blk_rq_bytes(rq);
1840
1841 blk_fill_rwbs(rwbs, rw, bytes);
1842}
1843
1844#endif /* CONFIG_EVENT_TRACING */ 1812#endif /* CONFIG_EVENT_TRACING */
1845 1813