diff options
Diffstat (limited to 'kernel/trace/blktrace.c')
| -rw-r--r-- | kernel/trace/blktrace.c | 88 |
1 files changed, 71 insertions, 17 deletions
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 638711c17504..959f8d6c8cc1 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
| @@ -169,9 +169,12 @@ static int act_log_check(struct blk_trace *bt, u32 what, sector_t sector, | |||
| 169 | static const u32 ddir_act[2] = { BLK_TC_ACT(BLK_TC_READ), | 169 | static const u32 ddir_act[2] = { BLK_TC_ACT(BLK_TC_READ), |
| 170 | BLK_TC_ACT(BLK_TC_WRITE) }; | 170 | BLK_TC_ACT(BLK_TC_WRITE) }; |
| 171 | 171 | ||
| 172 | #define BLK_TC_HARDBARRIER BLK_TC_BARRIER | ||
| 173 | #define BLK_TC_RAHEAD BLK_TC_AHEAD | ||
| 174 | |||
| 172 | /* The ilog2() calls fall out because they're constant */ | 175 | /* The ilog2() calls fall out because they're constant */ |
| 173 | #define MASK_TC_BIT(rw, __name) ((rw & (1 << BIO_RW_ ## __name)) << \ | 176 | #define MASK_TC_BIT(rw, __name) ((rw & REQ_ ## __name) << \ |
| 174 | (ilog2(BLK_TC_ ## __name) + BLK_TC_SHIFT - BIO_RW_ ## __name)) | 177 | (ilog2(BLK_TC_ ## __name) + BLK_TC_SHIFT - __REQ_ ## __name)) |
| 175 | 178 | ||
| 176 | /* | 179 | /* |
| 177 | * The worker for the various blk_add_trace*() types. Fills out a | 180 | * The worker for the various blk_add_trace*() types. Fills out a |
| @@ -194,9 +197,9 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, | |||
| 194 | return; | 197 | return; |
| 195 | 198 | ||
| 196 | what |= ddir_act[rw & WRITE]; | 199 | what |= ddir_act[rw & WRITE]; |
| 197 | what |= MASK_TC_BIT(rw, BARRIER); | 200 | what |= MASK_TC_BIT(rw, HARDBARRIER); |
| 198 | what |= MASK_TC_BIT(rw, SYNCIO); | 201 | what |= MASK_TC_BIT(rw, SYNC); |
| 199 | what |= MASK_TC_BIT(rw, AHEAD); | 202 | what |= MASK_TC_BIT(rw, RAHEAD); |
| 200 | what |= MASK_TC_BIT(rw, META); | 203 | what |= MASK_TC_BIT(rw, META); |
| 201 | what |= MASK_TC_BIT(rw, DISCARD); | 204 | what |= MASK_TC_BIT(rw, DISCARD); |
| 202 | 205 | ||
| @@ -549,6 +552,41 @@ int blk_trace_setup(struct request_queue *q, char *name, dev_t dev, | |||
| 549 | } | 552 | } |
| 550 | EXPORT_SYMBOL_GPL(blk_trace_setup); | 553 | EXPORT_SYMBOL_GPL(blk_trace_setup); |
| 551 | 554 | ||
| 555 | #if defined(CONFIG_COMPAT) && defined(CONFIG_X86_64) | ||
| 556 | static int compat_blk_trace_setup(struct request_queue *q, char *name, | ||
| 557 | dev_t dev, struct block_device *bdev, | ||
| 558 | char __user *arg) | ||
| 559 | { | ||
| 560 | struct blk_user_trace_setup buts; | ||
| 561 | struct compat_blk_user_trace_setup cbuts; | ||
| 562 | int ret; | ||
| 563 | |||
| 564 | if (copy_from_user(&cbuts, arg, sizeof(cbuts))) | ||
| 565 | return -EFAULT; | ||
| 566 | |||
| 567 | buts = (struct blk_user_trace_setup) { | ||
| 568 | .act_mask = cbuts.act_mask, | ||
| 569 | .buf_size = cbuts.buf_size, | ||
| 570 | .buf_nr = cbuts.buf_nr, | ||
| 571 | .start_lba = cbuts.start_lba, | ||
| 572 | .end_lba = cbuts.end_lba, | ||
| 573 | .pid = cbuts.pid, | ||
| 574 | }; | ||
| 575 | memcpy(&buts.name, &cbuts.name, 32); | ||
| 576 | |||
| 577 | ret = do_blk_trace_setup(q, name, dev, bdev, &buts); | ||
| 578 | if (ret) | ||
| 579 | return ret; | ||
| 580 | |||
| 581 | if (copy_to_user(arg, &buts.name, 32)) { | ||
| 582 | blk_trace_remove(q); | ||
| 583 | return -EFAULT; | ||
| 584 | } | ||
| 585 | |||
| 586 | return 0; | ||
| 587 | } | ||
| 588 | #endif | ||
| 589 | |||
| 552 | int blk_trace_startstop(struct request_queue *q, int start) | 590 | int blk_trace_startstop(struct request_queue *q, int start) |
| 553 | { | 591 | { |
| 554 | int ret; | 592 | int ret; |
| @@ -601,6 +639,7 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg) | |||
| 601 | if (!q) | 639 | if (!q) |
| 602 | return -ENXIO; | 640 | return -ENXIO; |
| 603 | 641 | ||
| 642 | lock_kernel(); | ||
| 604 | mutex_lock(&bdev->bd_mutex); | 643 | mutex_lock(&bdev->bd_mutex); |
| 605 | 644 | ||
| 606 | switch (cmd) { | 645 | switch (cmd) { |
| @@ -608,6 +647,12 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg) | |||
| 608 | bdevname(bdev, b); | 647 | bdevname(bdev, b); |
| 609 | ret = blk_trace_setup(q, b, bdev->bd_dev, bdev, arg); | 648 | ret = blk_trace_setup(q, b, bdev->bd_dev, bdev, arg); |
| 610 | break; | 649 | break; |
| 650 | #if defined(CONFIG_COMPAT) && defined(CONFIG_X86_64) | ||
| 651 | case BLKTRACESETUP32: | ||
| 652 | bdevname(bdev, b); | ||
| 653 | ret = compat_blk_trace_setup(q, b, bdev->bd_dev, bdev, arg); | ||
| 654 | break; | ||
| 655 | #endif | ||
| 611 | case BLKTRACESTART: | 656 | case BLKTRACESTART: |
| 612 | start = 1; | 657 | start = 1; |
| 613 | case BLKTRACESTOP: | 658 | case BLKTRACESTOP: |
| @@ -622,6 +667,7 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg) | |||
| 622 | } | 667 | } |
| 623 | 668 | ||
| 624 | mutex_unlock(&bdev->bd_mutex); | 669 | mutex_unlock(&bdev->bd_mutex); |
| 670 | unlock_kernel(); | ||
| 625 | return ret; | 671 | return ret; |
| 626 | } | 672 | } |
| 627 | 673 | ||
| @@ -661,10 +707,13 @@ static void blk_add_trace_rq(struct request_queue *q, struct request *rq, | |||
| 661 | if (likely(!bt)) | 707 | if (likely(!bt)) |
| 662 | return; | 708 | return; |
| 663 | 709 | ||
| 664 | if (blk_discard_rq(rq)) | 710 | if (rq->cmd_flags & REQ_DISCARD) |
| 665 | rw |= (1 << BIO_RW_DISCARD); | 711 | rw |= REQ_DISCARD; |
| 712 | |||
| 713 | if (rq->cmd_flags & REQ_SECURE) | ||
| 714 | rw |= REQ_SECURE; | ||
| 666 | 715 | ||
| 667 | if (blk_pc_request(rq)) { | 716 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { |
| 668 | what |= BLK_TC_ACT(BLK_TC_PC); | 717 | what |= BLK_TC_ACT(BLK_TC_PC); |
| 669 | __blk_add_trace(bt, 0, blk_rq_bytes(rq), rw, | 718 | __blk_add_trace(bt, 0, blk_rq_bytes(rq), rw, |
| 670 | what, rq->errors, rq->cmd_len, rq->cmd); | 719 | what, rq->errors, rq->cmd_len, rq->cmd); |
| @@ -925,7 +974,7 @@ void blk_add_driver_data(struct request_queue *q, | |||
| 925 | if (likely(!bt)) | 974 | if (likely(!bt)) |
| 926 | return; | 975 | return; |
| 927 | 976 | ||
| 928 | if (blk_pc_request(rq)) | 977 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) |
| 929 | __blk_add_trace(bt, 0, blk_rq_bytes(rq), 0, | 978 | __blk_add_trace(bt, 0, blk_rq_bytes(rq), 0, |
| 930 | BLK_TA_DRV_DATA, rq->errors, len, data); | 979 | BLK_TA_DRV_DATA, rq->errors, len, data); |
| 931 | else | 980 | else |
| @@ -1730,7 +1779,7 @@ void blk_dump_cmd(char *buf, struct request *rq) | |||
| 1730 | int len = rq->cmd_len; | 1779 | int len = rq->cmd_len; |
| 1731 | unsigned char *cmd = rq->cmd; | 1780 | unsigned char *cmd = rq->cmd; |
| 1732 | 1781 | ||
| 1733 | if (!blk_pc_request(rq)) { | 1782 | if (rq->cmd_type != REQ_TYPE_BLOCK_PC) { |
| 1734 | buf[0] = '\0'; | 1783 | buf[0] = '\0'; |
| 1735 | return; | 1784 | return; |
| 1736 | } | 1785 | } |
| @@ -1755,21 +1804,23 @@ void blk_fill_rwbs(char *rwbs, u32 rw, int bytes) | |||
| 1755 | 1804 | ||
| 1756 | if (rw & WRITE) | 1805 | if (rw & WRITE) |
| 1757 | rwbs[i++] = 'W'; | 1806 | rwbs[i++] = 'W'; |
| 1758 | else if (rw & 1 << BIO_RW_DISCARD) | 1807 | else if (rw & REQ_DISCARD) |
| 1759 | rwbs[i++] = 'D'; | 1808 | rwbs[i++] = 'D'; |
| 1760 | else if (bytes) | 1809 | else if (bytes) |
| 1761 | rwbs[i++] = 'R'; | 1810 | rwbs[i++] = 'R'; |
| 1762 | else | 1811 | else |
| 1763 | rwbs[i++] = 'N'; | 1812 | rwbs[i++] = 'N'; |
| 1764 | 1813 | ||
| 1765 | if (rw & 1 << BIO_RW_AHEAD) | 1814 | if (rw & REQ_RAHEAD) |
| 1766 | rwbs[i++] = 'A'; | 1815 | rwbs[i++] = 'A'; |
| 1767 | if (rw & 1 << BIO_RW_BARRIER) | 1816 | if (rw & REQ_HARDBARRIER) |
| 1768 | rwbs[i++] = 'B'; | 1817 | rwbs[i++] = 'B'; |
| 1769 | if (rw & 1 << BIO_RW_SYNCIO) | 1818 | if (rw & REQ_SYNC) |
| 1770 | rwbs[i++] = 'S'; | 1819 | rwbs[i++] = 'S'; |
| 1771 | if (rw & 1 << BIO_RW_META) | 1820 | if (rw & REQ_META) |
| 1772 | rwbs[i++] = 'M'; | 1821 | rwbs[i++] = 'M'; |
| 1822 | if (rw & REQ_SECURE) | ||
| 1823 | rwbs[i++] = 'E'; | ||
| 1773 | 1824 | ||
| 1774 | rwbs[i] = '\0'; | 1825 | rwbs[i] = '\0'; |
| 1775 | } | 1826 | } |
| @@ -1779,8 +1830,11 @@ void blk_fill_rwbs_rq(char *rwbs, struct request *rq) | |||
| 1779 | int rw = rq->cmd_flags & 0x03; | 1830 | int rw = rq->cmd_flags & 0x03; |
| 1780 | int bytes; | 1831 | int bytes; |
| 1781 | 1832 | ||
| 1782 | if (blk_discard_rq(rq)) | 1833 | if (rq->cmd_flags & REQ_DISCARD) |
| 1783 | rw |= (1 << BIO_RW_DISCARD); | 1834 | rw |= REQ_DISCARD; |
| 1835 | |||
| 1836 | if (rq->cmd_flags & REQ_SECURE) | ||
| 1837 | rw |= REQ_SECURE; | ||
| 1784 | 1838 | ||
| 1785 | bytes = blk_rq_bytes(rq); | 1839 | bytes = blk_rq_bytes(rq); |
| 1786 | 1840 | ||
