22 May, 2010

2 commits


11 May, 2010

1 commit

  • blk_init_queue() allocates the request_queue structure and then
    initializes it as needed (request_fn, elevator, etc).

    Split initialization out to blk_init_allocated_queue_node.
    Introduce blk_init_allocated_queue wrapper function to model existing
    blk_init_queue and blk_init_queue_node interfaces.

    Export elv_register_queue to allow a newly added elevator to be
    registered with sysfs. Export elv_unregister_queue for symmetry.

    These changes allow DM to initialize a device's request_queue with more
    precision. In particular, DM no longer unconditionally initializes a
    full request_queue (elevator et al). It only does so for a
    request-based DM device.

    Signed-off-by: Mike Snitzer
    Signed-off-by: Jens Axboe

    Mike Snitzer
     

07 May, 2010

1 commit

  • with CONFIG_PROVE_RCU=y, a warning can be triggered:

    # mount -t cgroup -o blkio xxx /mnt
    # mkdir /mnt/subgroup

    ...
    kernel/cgroup.c:4442 invoked rcu_dereference_check() without protection!
    ...

    To fix this, we avoid caling css_depth() here, which is a bit simpler
    than the original code.

    Signed-off-by: Li Zefan
    Acked-by: Vivek Goyal
    Signed-off-by: Jens Axboe

    Li Zefan
     

06 May, 2010

1 commit

  • It is necessary to be in an RCU read-side critical section when invoking
    css_id(), so this patch adds one to blkiocg_add_blkio_group(). This is
    actually a false positive, because this is called at initialization time
    and hence always refers to the root cgroup, which cannot go away.

    [ 103.790505] ===================================================
    [ 103.790509] [ INFO: suspicious rcu_dereference_check() usage. ]
    [ 103.790511] ---------------------------------------------------
    [ 103.790514] kernel/cgroup.c:4432 invoked rcu_dereference_check() without protection!
    [ 103.790517]
    [ 103.790517] other info that might help us debug this:
    [ 103.790519]
    [ 103.790521]
    [ 103.790521] rcu_scheduler_active = 1, debug_locks = 1
    [ 103.790524] 4 locks held by bash/4422:
    [ 103.790526] #0: (&buffer->mutex){+.+.+.}, at: [] sysfs_write_file+0x3c/0x144
    [ 103.790537] #1: (s_active#102){.+.+.+}, at: [] sysfs_write_file+0xe7/0x144
    [ 103.790544] #2: (&q->sysfs_lock){+.+.+.}, at: [] queue_attr_store+0x49/0x8f
    [ 103.790552] #3: (&(&blkcg->lock)->rlock){......}, at: [] blkiocg_add_blkio_group+0x2b/0xad
    [ 103.790560]
    [ 103.790561] stack backtrace:
    [ 103.790564] Pid: 4422, comm: bash Not tainted 2.6.34-rc4-blkio-second-crash #81
    [ 103.790567] Call Trace:
    [ 103.790572] [] lockdep_rcu_dereference+0x9d/0xa5
    [ 103.790577] [] css_id+0x44/0x57
    [ 103.790581] [] blkiocg_add_blkio_group+0x53/0xad
    [ 103.790586] [] cfq_init_queue+0x139/0x32c
    [ 103.790591] [] elv_iosched_store+0xbf/0x1bf
    [ 103.790595] [] queue_attr_store+0x70/0x8f
    [ 103.790599] [] ? sysfs_write_file+0xe7/0x144
    [ 103.790603] [] sysfs_write_file+0x108/0x144
    [ 103.790609] [] vfs_write+0xae/0x10b
    [ 103.790612] [] ? trace_hardirqs_on_caller+0x10c/0x130
    [ 103.790616] [] sys_write+0x4a/0x6e
    [ 103.790622] [] system_call_fastpath+0x16/0x1b
    [ 103.790625]

    Located-by: Miles Lane
    Signed-off-by: Vivek Goyal
    Signed-off-by: Paul E. McKenney
    Signed-off-by: Ingo Molnar
    Signed-off-by: Jens Axboe

    Vivek Goyal
     

03 May, 2010

1 commit


29 Apr, 2010

6 commits


27 Apr, 2010

2 commits

  • This patch fixes few usability and configurability issues.

    o All the cgroup based controller options are configurable from
    "Genral Setup/Control Group Support/" menu. blkio is the only exception.
    Hence make this option visible in above menu and make it configurable from
    there to bring it inline with rest of the cgroup based controllers.

    o Get rid of CONFIG_DEBUG_CFQ_IOSCHED.

    This option currently does two things.

    - Enable printing of cgroup paths in blktrace
    - Enables CONFIG_DEBUG_BLK_CGROUP, which in turn displays additional stat
    files in cgroup.

    If we are using group scheduling, blktrace data is of not really much use
    if cgroup information is not present. To get this data, currently one has to
    also enable CONFIG_DEBUG_CFQ_IOSCHED, which in turn brings the overhead of
    all the additional debug stat files which is not desired.

    Hence, this patch moves printing of cgroup paths under
    CONFIG_CFQ_GROUP_IOSCHED.

    This allows us to get rid of CONFIG_DEBUG_CFQ_IOSCHED completely. Now all
    the debug stat files are controlled only by CONFIG_DEBUG_BLK_CGROUP which
    can be enabled through config menu.

    Signed-off-by: Vivek Goyal
    Acked-by: Divyesh Shah
    Reviewed-by: Gui Jianfeng
    Signed-off-by: Jens Axboe

    Vivek Goyal
     
  • o Once in a while, I was hitting a BUG_ON() in blkio code. empty_time was
    assuming that upon slice expiry, group can't be marked empty already (except
    forced dispatch).

    But this assumption is broken if cfqq can move (group_isolation=0) across
    groups after receiving a request.

    I think most likely in this case we got a request in a cfqq and accounted
    the rq in one group, later while adding the cfqq to tree, we moved the queue
    to a different group which was already marked empty and after dispatch from
    slice we found group already marked empty and raised alarm.

    This patch does not error out if group is already marked empty. This can
    introduce some empty_time stat error only in case of group_isolation=0. This
    is better than crashing. In case of group_isolation=1 we should still get
    same stats as before this patch.

    [ 222.308546] ------------[ cut here ]------------
    [ 222.309311] kernel BUG at block/blk-cgroup.c:236!
    [ 222.309311] invalid opcode: 0000 [#1] SMP
    [ 222.309311] last sysfs file: /sys/devices/virtual/block/dm-3/queue/scheduler
    [ 222.309311] CPU 1
    [ 222.309311] Modules linked in: dm_round_robin dm_multipath qla2xxx scsi_transport_fc dm_zero dm_mirror dm_region_hash dm_log dm_mod [last unloaded: scsi_wait_scan]
    [ 222.309311]
    [ 222.309311] Pid: 4780, comm: fio Not tainted 2.6.34-rc4-blkio-config #68 0A98h/HP xw8600 Workstation
    [ 222.309311] RIP: 0010:[] [] blkiocg_set_start_empty_time+0x50/0x83
    [ 222.309311] RSP: 0018:ffff8800ba6e79f8 EFLAGS: 00010002
    [ 222.309311] RAX: 0000000000000082 RBX: ffff8800a13b7990 RCX: ffff8800a13b7808
    [ 222.309311] RDX: 0000000000002121 RSI: 0000000000000082 RDI: ffff8800a13b7a30
    [ 222.309311] RBP: ffff8800ba6e7a18 R08: 0000000000000000 R09: 0000000000000001
    [ 222.309311] R10: 000000000002f8c8 R11: ffff8800ba6e7ad8 R12: ffff8800a13b78ff
    [ 222.309311] R13: ffff8800a13b7990 R14: 0000000000000001 R15: ffff8800a13b7808
    [ 222.309311] FS: 00007f3beec476f0(0000) GS:ffff880001e40000(0000) knlGS:0000000000000000
    [ 222.309311] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 222.309311] CR2: 000000000040e7f0 CR3: 00000000a12d5000 CR4: 00000000000006e0
    [ 222.309311] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 222.309311] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    [ 222.309311] Process fio (pid: 4780, threadinfo ffff8800ba6e6000, task ffff8800b3d6bf00)
    [ 222.309311] Stack:
    [ 222.309311] 0000000000000001 ffff8800bab17a48 ffff8800bab17a48 ffff8800a13b7800
    [ 222.309311] ffff8800ba6e7a68 ffffffff8121da35 ffff880000000001 00ff8800ba5c5698
    [ 222.309311] ffff8800ba6e7a68 ffff8800a13b7800 0000000000000000 ffff8800bab17a48
    [ 222.309311] Call Trace:
    [ 222.309311] [] __cfq_slice_expired+0x2af/0x3ec
    [ 222.309311] [] cfq_dispatch_requests+0x2c8/0x8e8
    [ 222.309311] [] ? spin_unlock_irqrestore+0xe/0x10
    [ 222.309311] [] ? blk_insert_cloned_request+0x70/0x7b
    [ 222.309311] [] blk_peek_request+0x191/0x1a7
    [ 222.309311] [] dm_request_fn+0x38/0x14c [dm_mod]
    [ 222.309311] [] ? sync_page_killable+0x0/0x35
    [ 222.309311] [] __generic_unplug_device+0x32/0x37
    [ 222.309311] [] generic_unplug_device+0x2e/0x3c
    [ 222.309311] [] dm_unplug_all+0x42/0x5b [dm_mod]
    [ 222.309311] [] blk_unplug+0x29/0x2d
    [ 222.309311] [] blk_backing_dev_unplug+0x12/0x14
    [ 222.309311] [] block_sync_page+0x35/0x39
    [ 222.309311] [] sync_page+0x41/0x4a
    [ 222.309311] [] sync_page_killable+0xe/0x35
    [ 222.309311] [] __wait_on_bit_lock+0x46/0x8f
    [ 222.309311] [] __lock_page_killable+0x66/0x6d
    [ 222.309311] [] ? wake_bit_function+0x0/0x33
    [ 222.309311] [] lock_page_killable+0x2c/0x2e
    [ 222.309311] [] generic_file_aio_read+0x361/0x4f0
    [ 222.309311] [] do_sync_read+0xcb/0x108
    [ 222.309311] [] ? security_file_permission+0x16/0x18
    [ 222.309311] [] vfs_read+0xab/0x108
    [ 222.309311] [] sys_read+0x4a/0x6e
    [ 222.309311] [] system_call_fastpath+0x16/0x1b
    [ 222.309311] Code: 58 01 00 00 00 48 89 c6 75 0a 48 83 bb 60 01 00 00 00 74 09 48 8d bb a0 00 00 00 eb 35 41 fe cc 74 0d f6 83 c0 01 00 00 04 74 04 0b eb fe 48 89 75 e8 e8 be e0 de ff 66 83 8b c0 01 00 00 04
    [ 222.309311] RIP [] blkiocg_set_start_empty_time+0x50/0x83
    [ 222.309311] RSP
    [ 222.309311] ---[ end trace 32b4f71dffc15712 ]---

    Signed-off-by: Vivek Goyal
    Acked-by: Divyesh Shah
    Signed-off-by: Jens Axboe

    Vivek Goyal
     

21 Apr, 2010

2 commits

  • blkio + cfq was crashing even when two sequential readers were put in two
    separate cgroups (group_isolation=0).

    The reason being that cfqq can migrate across groups based on its being
    sync-noidle or not, it can happen that at request insertion time, cfqq
    belonged to one cfqg and at request dispatch time, it belonged to root
    group. In this case request stats per cgroup can go wrong and it also runs
    into BUG_ON().

    This patch implements rq stashing away a cfq group pointer and not relying
    on cfqq->cfqg pointer alone for rq stat accounting.

    [ 65.163523] ------------[ cut here ]------------
    [ 65.164301] kernel BUG at block/blk-cgroup.c:117!
    [ 65.164301] invalid opcode: 0000 [#1] SMP
    [ 65.164301] last sysfs file: /sys/devices/pci0000:00/0000:00:05.0/0000:60:00.1/host9/rport-9:0-0/target9:0:0/9:0:0:2/block/sde/stat
    [ 65.164301] CPU 1
    [ 65.164301] Modules linked in: dm_round_robin dm_multipath qla2xxx scsi_transport_fc dm_zero dm_mirror dm_region_hash dm_log dm_mod [last unloaded: scsi_wait_scan]
    [ 65.164301]
    [ 65.164301] Pid: 4505, comm: fio Not tainted 2.6.34-rc4-blk-for-35 #34 0A98h/HP xw8600 Workstation
    [ 65.164301] RIP: 0010:[] [] blkiocg_update_io_remove_stats+0x5b/0xaf
    [ 65.164301] RSP: 0018:ffff8800ba5a79e8 EFLAGS: 00010046
    [ 65.164301] RAX: 0000000000000096 RBX: ffff8800bb268d60 RCX: 0000000000000000
    [ 65.164301] RDX: ffff8800bb268eb8 RSI: 0000000000000000 RDI: ffff8800bb268e00
    [ 65.164301] RBP: ffff8800ba5a7a08 R08: 0000000000000064 R09: 0000000000000001
    [ 65.164301] R10: 0000000000079640 R11: ffff8800a0bd5bf0 R12: ffff8800bab4af01
    [ 65.164301] R13: ffff8800bab4af00 R14: ffff8800bb1d8928 R15: 0000000000000000
    [ 65.164301] FS: 00007f18f75056f0(0000) GS:ffff880001e40000(0000) knlGS:0000000000000000
    [ 65.164301] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 65.164301] CR2: 000000000040e7f0 CR3: 00000000ba52b000 CR4: 00000000000006e0
    [ 65.164301] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 65.164301] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    [ 65.164301] Process fio (pid: 4505, threadinfo ffff8800ba5a6000, task ffff8800ba45ae80)
    [ 65.164301] Stack:
    [ 65.164301] ffff8800ba5a7a08 ffff8800ba722540 ffff8800bab4af68 ffff8800bab4af68
    [ 65.164301] ffff8800ba5a7a38 ffffffff8121d814 ffff8800ba722540 ffff8800bab4af68
    [ 65.164301] ffff8800ba722540 ffff8800a08f6800 ffff8800ba5a7a68 ffffffff8121d8ca
    [ 65.164301] Call Trace:
    [ 65.164301] [] cfq_remove_request+0xe4/0x116
    [ 65.164301] [] cfq_dispatch_insert+0x84/0xe1
    [ 65.164301] [] cfq_dispatch_requests+0x767/0x8e8
    [ 65.164301] [] ? submit_bio+0xc3/0xcc
    [ 65.164301] [] ? sync_page_killable+0x0/0x35
    [ 65.164301] [] blk_peek_request+0x191/0x1a7
    [ 65.164301] [] ? dm_get_live_table+0x44/0x4f [dm_mod]
    [ 65.164301] [] dm_request_fn+0x38/0x14c [dm_mod]
    [ 65.164301] [] ? sync_page_killable+0x0/0x35
    [ 65.164301] [] __generic_unplug_device+0x32/0x37
    [ 65.164301] [] generic_unplug_device+0x2e/0x3c
    [ 65.164301] [] dm_unplug_all+0x42/0x5b [dm_mod]
    [ 65.164301] [] blk_unplug+0x29/0x2d
    [ 65.164301] [] blk_backing_dev_unplug+0x12/0x14
    [ 65.164301] [] block_sync_page+0x35/0x39
    [ 65.164301] [] sync_page+0x41/0x4a
    [ 65.164301] [] sync_page_killable+0xe/0x35
    [ 65.164301] [] __wait_on_bit_lock+0x46/0x8f
    [ 65.164301] [] __lock_page_killable+0x66/0x6d
    [ 65.164301] [] ? wake_bit_function+0x0/0x33
    [ 65.164301] [] lock_page_killable+0x2c/0x2e
    [ 65.164301] [] generic_file_aio_read+0x361/0x4f0
    [ 65.164301] [] do_sync_read+0xcb/0x108
    [ 65.164301] [] ? security_file_permission+0x16/0x18
    [ 65.164301] [] vfs_read+0xab/0x108
    [ 65.164301] [] sys_read+0x4a/0x6e
    [ 65.164301] [] system_call_fastpath+0x16/0x1b
    [ 65.164301] Code: 00 74 1c 48 8b 8b 60 01 00 00 48 85 c9 75 04 0f 0b eb fe 48 ff c9 48 89 8b 60 01 00 00 eb 1a 48 8b 8b 58 01 00 00 48 85 c9 75 04 0b eb fe 48 ff c9 48 89 8b 58 01 00 00 45 84 e4 74 16 48 8b
    [ 65.164301] RIP [] blkiocg_update_io_remove_stats+0x5b/0xaf
    [ 65.164301] RSP
    [ 65.164301] ---[ end trace 1b2b828753032e68 ]---

    Signed-off-by: Vivek Goyal
    Signed-off-by: Jens Axboe

    Vivek Goyal
     
  • blk_rq_timed_out_timer() relied on blk_add_timer() never returning a
    timer value of zero, but commit 7838c15b8dd18e78a523513749e5b54bda07b0cb
    removed the code that bumped this value when it was zero.
    Therefore when jiffies is near wrap we could get unlucky & not set the
    timeout value correctly.

    This patch uses a flag to indicate that the timeout value was set and so
    handles jiffies wrap correctly, and it keeps all the logic in one
    function so should be easier to maintain in the future.

    Signed-off-by: Richard Kennedy
    Cc: stable@kernel.org
    Signed-off-by: Jens Axboe

    Richard Kennedy
     

16 Apr, 2010

1 commit


15 Apr, 2010

2 commits

  • After merging the block tree, 20100414's linux-next build (x86_64
    allmodconfig) failed like this:

    ERROR: "get_gendisk" [block/blk-cgroup.ko] undefined!
    ERROR: "sched_clock" [block/blk-cgroup.ko] undefined!

    This happens because the two symbols aren't exported and hence not available
    when blk-cgroup code is built as a module. I've tried to stay consistent with
    the use of EXPORT_SYMBOL or EXPORT_SYMBOL_GPL with the other symbols in the
    respective files.

    Signed-off-by: Divyesh Shah
    Acked-by: Gui Jianfeng
    Signed-off-by: Jens Axboe

    Divyesh Shah
     
  • blk_rq_timed_out_timer() relied on blk_add_timer() never returning a
    timer value of zero, but commit 7838c15b8dd18e78a523513749e5b54bda07b0cb
    removed the code that bumped this value when it was zero.
    Therefore when jiffies is near wrap we could get unlucky & not set the
    timeout value correctly.

    This patch uses a flag to indicate that the timeout value was set and so
    handles jiffies wrap correctly, and it keeps all the logic in one
    function so should be easier to maintain in the future.

    Signed-off-by: Richard Kennedy
    Signed-off-by: Jens Axboe

    Richard Kennedy
     

14 Apr, 2010

3 commits

  • Fixes compile errors in blk-cgroup code for empty_time stat and a merge fix in
    CFQ. The first error was when CONFIG_DEBUG_CFQ_IOSCHED is not set.

    Signed-off-by: Divyesh Shah
    Signed-off-by: Jens Axboe

    Divyesh Shah
     
  • Conflicts:
    block/blk-cgroup.c
    block/cfq-iosched.c

    Signed-off-by: Jens Axboe

    Jens Axboe
     
  • Changelog from v1:
    o Call blkiocg_update_idle_time_stats() at cfq_rq_enqueued() instead of at
    dispatch time.

    Changelog from original patchset: (in response to Vivek Goyal's comments)
    o group blkiocg_update_blkio_group_dequeue_stats() with other DEBUG functions
    o rename blkiocg_update_set_active_queue_stats() to
    blkiocg_update_avg_queue_size_stats()
    o s/request/io/ in blkiocg_update_request_add_stats() and
    blkiocg_update_request_remove_stats()
    o Call cfq_del_timer() at request dispatch() instead of
    blkiocg_update_idle_time_stats()

    Signed-off-by: Divyesh Shah
    Acked-by: Vivek Goyal
    Signed-off-by: Jens Axboe

    Divyesh Shah
     

13 Apr, 2010

1 commit

  • Currently, IO Controller makes use of blkio.weight to assign weight for
    all devices. Here a new user interface "blkio.weight_device" is introduced to
    assign different weights for different devices. blkio.weight becomes the
    default value for devices which are not configured by "blkio.weight_device"

    You can use the following format to assigned specific weight for a given
    device:
    #echo "major:minor weight" > blkio.weight_device

    major:minor represents device number.

    And you can remove weight for a given device as following:
    #echo "major:minor 0" > blkio.weight_device

    V1->V2 changes:
    - use user interface "weight_device" instead of "policy" suggested by Vivek
    - rename some struct suggested by Vivek
    - rebase to 2.6-block "for-linus" branch
    - remove an useless list_empty check pointed out by Li Zefan
    - some trivial typo fix

    V2->V3 changes:
    - Move policy_*_node() functions up to get rid of forward declarations
    - rename related functions by adding prefix "blkio_"

    Signed-off-by: Gui Jianfeng
    Acked-by: Vivek Goyal
    Signed-off-by: Jens Axboe

    Gui Jianfeng
     

10 Apr, 2010

1 commit

  • * 'for-linus' of git://git.kernel.dk/linux-2.6-block: (34 commits)
    cfq-iosched: Fix the incorrect timeslice accounting with forced_dispatch
    loop: Update mtime when writing using aops
    block: expose the statistics in blkio.time and blkio.sectors for the root cgroup
    backing-dev: Handle class_create() failure
    Block: Fix block/elevator.c elevator_get() off-by-one error
    drbd: lc_element_by_index() never returns NULL
    cciss: unlock on error path
    cfq-iosched: Do not merge queues of BE and IDLE classes
    cfq-iosched: Add additional blktrace log messages in CFQ for easier debugging
    i2o: Remove the dangerous kobj_to_i2o_device macro
    block: remove 16 bytes of padding from struct request on 64bits
    cfq-iosched: fix a kbuild regression
    block: make CONFIG_BLK_CGROUP visible
    Remove GENHD_FL_DRIVERFS
    block: Export max number of segments and max segment size in sysfs
    block: Finalize conversion of block limits functions
    block: Fix overrun in lcm() and move it to lib
    vfs: improve writeback_inodes_wb()
    paride: fix off-by-one test
    drbd: fix al-to-on-disk-bitmap for 4k logical_block_size
    ...

    Linus Torvalds
     

09 Apr, 2010

5 commits

  • When CFQ dispatches requests forcefully due to a barrier or changing iosched,
    it runs through all cfqq's dispatching requests and then expires each queue.
    However, it does not activate a cfqq before flushing its IOs resulting in
    using stale values for computing slice_used.
    This patch fixes it by calling activate queue before flushing reuqests from
    each queue.

    This is useful mostly for barrier requests because when the iosched is changing
    it really doesnt matter if we have incorrect accounting since we're going to
    break down all structures anyway.

    We also now expire the current timeslice before moving on with the dispatch
    to accurately account slice used for that cfqq.

    Signed-off-by: Divyesh Shah
    Signed-off-by: Jens Axboe

    Divyesh Shah
     
  • 1) group_wait_time - This is the amount of time the cgroup had to wait to get a
    timeslice for one of its queues from when it became busy, i.e., went from 0
    to 1 request queued. This is different from the io_wait_time which is the
    cumulative total of the amount of time spent by each IO in that cgroup waiting
    in the scheduler queue. This stat is a great way to find out any jobs in the
    fleet that are being starved or waiting for longer than what is expected (due
    to an IO controller bug or any other issue).
    2) empty_time - This is the amount of time a cgroup spends w/o any pending
    requests. This stat is useful when a job does not seem to be able to use its
    assigned disk share by helping check if that is happening due to an IO
    controller bug or because the job is not submitting enough IOs.
    3) idle_time - This is the amount of time spent by the IO scheduler idling
    for a given cgroup in anticipation of a better request than the exising ones
    from other queues/cgroups.

    All these stats are recorded using start and stop events. When reading these
    stats, we do not add the delta between the current time and the last start time
    if we're between the start and stop events. We avoid doing this to make sure
    that these numbers are always monotonically increasing when read. Since we're
    using sched_clock() which may use the tsc as its source, it may induce some
    inconsistency (due to tsc resync across cpus) if we included the current delta.

    Signed-off-by: Divyesh Shah
    Signed-off-by: Jens Axboe

    Divyesh Shah
     
  • These stats are useful for getting a feel for the queue depth of the cgroup,
    i.e., how filled up its queues are at a given instant and over the existence of
    the cgroup. This ability is useful when debugging problems in the wild as it
    helps understand the application's IO pattern w/o having to read through the
    userspace code (coz its tedious or just not available) or w/o the ability
    to run blktrace (since you may not have root access and/or not want to disturb
    performance).

    Signed-off-by: Divyesh Shah
    Signed-off-by: Jens Axboe

    Divyesh Shah
     
  • This includes both the number of bios merged into requests belonging to this
    cgroup as well as the number of requests merged together.
    In the past, we've observed different merging behavior across upstream kernels,
    some by design some actual bugs. This stat helps a lot in debugging such
    problems when applications report decreased throughput with a new kernel
    version.

    This needed adding an extra elevator function to capture bios being merged as I
    did not want to pollute elevator code with blkiocg knowledge and hence needed
    the accounting invocation to come from CFQ.

    Signed-off-by: Divyesh Shah
    Signed-off-by: Jens Axboe

    Divyesh Shah
     
  • that include some minor fixes and addresses all comments.

    Changelog: (most based on Vivek Goyal's comments)
    o renamed blkiocg_reset_write to blkiocg_reset_stats
    o more clarification in the documentation on io_service_time and io_wait_time
    o Initialize blkg->stats_lock
    o rename io_add_stat to blkio_add_stat and declare it static
    o use bool for direction and sync
    o derive direction and sync info from existing rq methods
    o use 12 for major:minor string length
    o define io_service_time better to cover the NCQ case
    o add a separate reset_stats interface
    o make the indexed stats a 2d array to simplify macro and function pointer code
    o blkio.time now exports in jiffies as before
    o Added stats description in patch description and
    Documentation/cgroup/blkio-controller.txt
    o Prefix all stats functions with blkio and make them static as applicable
    o replace IO_TYPE_MAX with IO_TYPE_TOTAL
    o Moved #define constant to top of blk-cgroup.c
    o Pass dev_t around instead of char *
    o Add note to documentation file about resetting stats
    o use BLK_CGROUP_MODULE in addition to BLK_CGROUP config option in #ifdef
    statements
    o Avoid struct request specific knowledge in blk-cgroup. blk-cgroup.h now has
    rq_direction() and rq_sync() functions which are used by CFQ and when using
    io-controller at a higher level, bio_* functions can be added.

    Signed-off-by: Divyesh Shah
    Signed-off-by: Jens Axboe

    Divyesh Shah
     

06 Apr, 2010

2 commits

  • One of the features of laptop-mode is that it forces a writeout of dirty
    pages if something else triggers a physical read or write from a device.
    The current implementation flushes pages on all devices, rather than only
    the one that triggered the flush. This patch alters the behaviour so that
    only the recently accessed block device is flushed, preventing other
    disks being spun up for no terribly good reason.

    Signed-off-by: Matthew Garrett
    Signed-off-by: Jens Axboe

    Matthew Garrett
     
  • Currently, the io statistics for the root cgroup are maintained, but
    they are not shown because the device information is not available at
    the point that the root blkio cgroup is created. This patch updates
    the device information when the statistics are updated so that the
    statistics become visible.

    Signed-off-by: Ricky Benitez
    Acked-by: Vivek Goyal
    Signed-off-by: Jens Axboe

    Ricky Benitez
     

02 Apr, 2010

4 commits


30 Mar, 2010

1 commit

  • …it slab.h inclusion from percpu.h

    percpu.h is included by sched.h and module.h and thus ends up being
    included when building most .c files. percpu.h includes slab.h which
    in turn includes gfp.h making everything defined by the two files
    universally available and complicating inclusion dependencies.

    percpu.h -> slab.h dependency is about to be removed. Prepare for
    this change by updating users of gfp and slab facilities include those
    headers directly instead of assuming availability. As this conversion
    needs to touch large number of source files, the following script is
    used as the basis of conversion.

    http://userweb.kernel.org/~tj/misc/slabh-sweep.py

    The script does the followings.

    * Scan files for gfp and slab usages and update includes such that
    only the necessary includes are there. ie. if only gfp is used,
    gfp.h, if slab is used, slab.h.

    * When the script inserts a new include, it looks at the include
    blocks and try to put the new include such that its order conforms
    to its surrounding. It's put in the include block which contains
    core kernel includes, in the same order that the rest are ordered -
    alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
    doesn't seem to be any matching order.

    * If the script can't find a place to put a new include (mostly
    because the file doesn't have fitting include block), it prints out
    an error message indicating which .h file needs to be added to the
    file.

    The conversion was done in the following steps.

    1. The initial automatic conversion of all .c files updated slightly
    over 4000 files, deleting around 700 includes and adding ~480 gfp.h
    and ~3000 slab.h inclusions. The script emitted errors for ~400
    files.

    2. Each error was manually checked. Some didn't need the inclusion,
    some needed manual addition while adding it to implementation .h or
    embedding .c file was more appropriate for others. This step added
    inclusions to around 150 files.

    3. The script was run again and the output was compared to the edits
    from #2 to make sure no file was left behind.

    4. Several build tests were done and a couple of problems were fixed.
    e.g. lib/decompress_*.c used malloc/free() wrappers around slab
    APIs requiring slab.h to be added manually.

    5. The script was run on all .h files but without automatically
    editing them as sprinkling gfp.h and slab.h inclusions around .h
    files could easily lead to inclusion dependency hell. Most gfp.h
    inclusion directives were ignored as stuff from gfp.h was usually
    wildly available and often used in preprocessor macros. Each
    slab.h inclusion directive was examined and added manually as
    necessary.

    6. percpu.h was updated not to include slab.h.

    7. Build test were done on the following configurations and failures
    were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
    distributed build env didn't work with gcov compiles) and a few
    more options had to be turned off depending on archs to make things
    build (like ipr on powerpc/64 which failed due to missing writeq).

    * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
    * powerpc and powerpc64 SMP allmodconfig
    * sparc and sparc64 SMP allmodconfig
    * ia64 SMP allmodconfig
    * s390 SMP allmodconfig
    * alpha SMP allmodconfig
    * um on x86_64 SMP allmodconfig

    8. percpu.h modifications were reverted so that it could be applied as
    a separate patch and serve as bisection point.

    Given the fact that I had only a couple of failures from tests on step
    6, I'm fairly confident about the coverage of this conversion patch.
    If there is a breakage, it's likely to be something in one of the arch
    headers which should be easily discoverable easily on most builds of
    the specific arch.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>

    Tejun Heo
     

25 Mar, 2010

2 commits

  • Even if they are found to be co-operating.

    The prio_trees do not have any IDLE cfqqs on them. cfq_close_cooperator()
    is called from cfq_select_queue() and cfq_completed_request(). The latter
    ensures that the close cooperator code does not get invoked if the current
    cfqq is of class IDLE but the former doesn't seem to have any such checks.
    So an IDLE cfqq may get merged with a BE cfqq from the same group which
    should be avoided.

    Signed-off-by: Divyesh Shah
    Acked-by: Vivek Goyal
    Signed-off-by: Jens Axboe

    Divyesh Shah
     
  • These have helped us debug some issues we've noticed in earlier IO
    controller versions and should be useful now as well. The extra logging
    covers:
    - idling behavior. Since there are so many conditions based on which we decide
    to idle or not, this patch adds a log message for some conditions that we've
    found useful.
    - workload slices and current prio and workload type

    Changelog from v1:
    o moved log message from cfq_set_active_queue() to __cfq_set_active_queue()
    o changed queue_count to st->count

    Signed-off-by: Divyesh Shah
    Signed-off-by: Jens Axboe

    Divyesh Shah
     

19 Mar, 2010

2 commits

  • Conflicts:
    block/Kconfig

    Signed-off-by: Jens Axboe

    Jens Axboe
     
  • Alex Shi reported a kbuild regression which is about 10% performance lost.
    He bisected to this commit: 3dde36ddea3e07dd025c4c1ba47edec91606fec0.
    The reason is cfqq_close() can't find close cooperator. Restoring
    cfq_rq_close()'s threshold to original value makes the regression go away.

    Since for_preempt parameter isn't used anymore, this patch deletes it.

    Reported-by: Alex Shi
    Signed-off-by: Shaohua Li
    Acked-by: Corrado Zoccolo
    Signed-off-by: Jens Axboe

    Shaohua Li