23 May, 2012

1 commit

  • Pull cgroup updates from Tejun Heo:
    "cgroup file type addition / removal is updated so that file types are
    added and removed instead of individual files so that dynamic file
    type addition / removal can be implemented by cgroup and used by
    controllers. blkio controller changes which will come through block
    tree are dependent on this. Other changes include res_counter cleanup
    and disallowing kthread / PF_THREAD_BOUND threads to be attached to
    non-root cgroups.

    There's a reported bug with the file type addition / removal handling
    which can lead to oops on cgroup umount. The issue is being looked
    into. It shouldn't cause problems for most setups and isn't a
    security concern."

    Fix up trivial conflict in Documentation/feature-removal-schedule.txt

    * 'for-3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: (21 commits)
    res_counter: Account max_usage when calling res_counter_charge_nofail()
    res_counter: Merge res_counter_charge and res_counter_charge_nofail
    cgroups: disallow attaching kthreadd or PF_THREAD_BOUND threads
    cgroup: remove cgroup_subsys->populate()
    cgroup: get rid of populate for memcg
    cgroup: pass struct mem_cgroup instead of struct cgroup to socket memcg
    cgroup: make css->refcnt clearing on cgroup removal optional
    cgroup: use negative bias on css->refcnt to block css_tryget()
    cgroup: implement cgroup_rm_cftypes()
    cgroup: introduce struct cfent
    cgroup: relocate __d_cgrp() and __d_cft()
    cgroup: remove cgroup_add_file[s]()
    cgroup: convert memcg controller to the new cftype interface
    memcg: always create memsw files if CONFIG_CGROUP_MEM_RES_CTLR_SWAP
    cgroup: convert all non-memcg controllers to the new cftype interface
    cgroup: relocate cftype and cgroup_subsys definitions in controllers
    cgroup: merge cft_release_agent cftype array into the base files array
    cgroup: implement cgroup_add_cftypes() and friends
    cgroup: build list of all cgroups under a given cgroupfs_root
    cgroup: move cgroup_clear_directory() call out of cgroup_populate_dir()
    ...

    Linus Torvalds
     

22 May, 2012

1 commit

  • Pull s390 updates from Martin Schwidefsky:
    "Just a random collection of bug-fixes and cleanups, nothing new in
    this merge request."

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (46 commits)
    s390/ap: Fix wrong or missing comments
    s390/ap: move receive callback to message struct
    s390/dasd: re-prioritize partition detection message
    s390/qeth: reshuffle initialization
    s390/qeth: cleanup drv attr usage
    s390/claw: cleanup drv attr usage
    s390/lcs: cleanup drv attr usage
    s390/ctc: cleanup drv attr usage
    s390/ccwgroup: remove ccwgroup_create_from_string
    s390/qeth: stop using struct ccwgroup driver for discipline callbacks
    s390/qeth: switch to ccwgroup_create_dev
    s390/claw: switch to ccwgroup_create_dev
    s390/lcs: switch to ccwgroup_create_dev
    s390/ctcm: switch to ccwgroup_create_dev
    s390/ccwgroup: exploit ccwdev_by_dev_id
    s390/ccwgroup: introduce ccwgroup_create_dev
    s390: fix race on TIF_MCCK_PENDING
    s390/barrier: make use of fast-bcr facility
    s390/barrier: cleanup barrier functions
    s390/claw: remove "eieio" calls
    ...

    Linus Torvalds
     

16 May, 2012

1 commit


15 May, 2012

1 commit

  • 6d1d8050b4bc8 "block, partition: add partition_meta_info to hd_struct"
    added part_unpack_uuid() which assumes that the passed in buffer has
    enough space for sprintfing "%pU" - 37 characters including '\0'.

    Unfortunately, b5af921ec0233 "init: add support for root devices
    specified by partition UUID" supplied 33 bytes buffer to the function
    leading to the following panic with stackprotector enabled.

    Kernel panic - not syncing: stack-protector: Kernel stack corrupted in: ffffffff81b14c7e

    [] panic+0xba/0x1c6
    [] ? printk_all_partitions+0x259/0x26xb
    [] __stack_chk_fail+0x1b/0x20
    [] printk_all_paritions+0x259/0x26xb
    [] mount_block_root+0x1bc/0x27f
    [] mount_root+0x57/0x5b
    [] prepare_namespace+0x13d/0x176
    [] ? release_tgcred.isra.4+0x330/0x30
    [] kernel_init+0x155/0x15a
    [] ? schedule_tail+0x27/0xb0
    [] kernel_thread_helper+0x5/0x10
    [] ? start_kernel+0x3c5/0x3c5
    [] ? gs_change+0x13/0x13

    Increase the buffer size, remove the dangerous part_unpack_uuid() and
    use snprintf() directly from printk_all_partitions().

    Signed-off-by: Tejun Heo
    Reported-by: Szymon Gruszczynski
    Cc: Will Drewry
    Cc: stable@vger.kernel.org
    Signed-off-by: Jens Axboe

    Tejun Heo
     

14 Apr, 2012

1 commit

  • Pull block core bits from Jens Axboe:
    "It's a nice and quiet round this time, since most of the tricky stuff
    has been pushed to 3.5 to give it more time to mature. After a few
    hectic block IO core changes for 3.3 and 3.2, I'm quite happy with a
    slow round.

    Really minor stuff in here, the only real functional change is making
    the auto-unplug threshold a per-queue entity. The threshold is set so
    that it's low enough that we don't hold off IO for too long, but still
    big enough to get a nice benefit from the batched insert (and hence
    queue lock cost reduction). For raid configurations, this currently
    breaks down."

    * 'for-3.4/core' of git://git.kernel.dk/linux-block:
    block: make auto block plug flush threshold per-disk based
    Documentation: Add sysfs ABI change for cfq's target latency.
    block: Make cfq_target_latency tunable through sysfs.
    block: use lockdep_assert_held for queue locking
    block: blk_alloc_queue_node(): use caller's GFP flags instead of GFP_KERNEL

    Linus Torvalds
     

07 Apr, 2012

1 commit

  • We do auto block plug flush to reduce latency, the threshold is 16
    requests. This works well if the task is accessing one or two drives.
    The problem is if the task is accessing a raid 0 device and the raid
    disk number is big, say 8 or 16, 16/8 = 2 or 16/16=1, we will have
    heavy lock contention.

    This patch makes the threshold per-disk based. The latency should be
    still ok accessing one or two drives. The setup with application
    accessing a lot of drives in the meantime uaually is big machine,
    avoiding lock contention is more important, because any contention
    will actually increase latency.

    Signed-off-by: Shaohua Li
    Signed-off-by: Jens Axboe

    Shaohua Li
     

02 Apr, 2012

3 commits

  • In cfq, when we calculate a time slice for a process(or a cfqq to
    be precise), we have to consider the cfq_target_latency so that all the
    sync request have an estimated latency(300ms) and it is controlled by
    cfq_target_latency. But in some hadoop test, we have found that if
    there are many processes doing sequential read(24 for example), the
    throughput is bad because every process can only work for about 25ms
    and the cfqq is switched. That leads to a higher disk seek. We can
    achive the good throughput by setting low_latency=0, but then some
    read's latency is too much for the application.

    So this patch makes cfq_target_latency tunable through sysfs so that
    we can tune it and find some magic number which is not bad for both
    the throughput and the read latency.

    Cc: Jens Axboe
    Signed-off-by: Tao Ma
    Signed-off-by: Jens Axboe

    Tao Ma
     
  • Convert debug, freezer, cpuset, cpu_cgroup, cpuacct, net_prio, blkio,
    net_cls and device controllers to use the new cftype based interface.
    Termination entry is added to cftype arrays and populate callbacks are
    replaced with cgroup_subsys->base_cftypes initializations.

    This is functionally identical transformation. There shouldn't be any
    visible behavior change.

    memcg is rather special and will be converted separately.

    Signed-off-by: Tejun Heo
    Acked-by: Li Zefan
    Cc: Paul Menage
    Cc: Ingo Molnar
    Cc: Peter Zijlstra
    Cc: "David S. Miller"
    Cc: Vivek Goyal

    Tejun Heo
     
  • blk-cgroup, netprio_cgroup, cls_cgroup and tcp_memcontrol
    unnecessarily define cftype array and cgroup_subsys structures at the
    top of the file, which is unconventional and necessiates forward
    declaration of methods.

    This patch relocates those below the definitions of the methods and
    removes the forward declarations. Note that forward declaration of
    tcp_files[] is added in tcp_memcontrol.c for tcp_init_cgroup(). This
    will be removed soon by another patch.

    This patch doesn't introduce any functional change.

    Signed-off-by: Tejun Heo
    Acked-by: Li Zefan

    Tejun Heo
     

30 Mar, 2012

1 commit


23 Mar, 2012

1 commit


21 Mar, 2012

2 commits

  • Pull cgroup changes from Tejun Heo:
    "Out of the 8 commits, one fixes a long-standing locking issue around
    tasklist walking and others are cleanups."

    * 'for-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup:
    cgroup: Walk task list under tasklist_lock in cgroup_enable_task_cg_list
    cgroup: Remove wrong comment on cgroup_enable_task_cg_list()
    cgroup: remove cgroup_subsys argument from callbacks
    cgroup: remove extra calls to find_existing_css_set
    cgroup: replace tasklist_lock with rcu_read_lock
    cgroup: simplify double-check locking in cgroup_attach_proc
    cgroup: move struct cgroup_pidlist out from the header file
    cgroup: remove cgroup_attach_task_current_cg()

    Linus Torvalds
     
  • Pull scheduler changes for v3.4 from Ingo Molnar

    * 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (27 commits)
    printk: Make it compile with !CONFIG_PRINTK
    sched/x86: Fix overflow in cyc2ns_offset
    sched: Fix nohz load accounting -- again!
    sched: Update yield() docs
    printk/sched: Introduce special printk_sched() for those awkward moments
    sched/nohz: Correctly initialize 'next_balance' in 'nohz' idle balancer
    sched: Cleanup cpu_active madness
    sched: Fix load-balance wreckage
    sched: Clean up parameter passing of proc_sched_autogroup_set_nice()
    sched: Ditch per cgroup task lists for load-balancing
    sched: Rename load-balancing fields
    sched: Move load-balancing arguments into helper struct
    sched/rt: Do not submit new work when PI-blocked
    sched/rt: Prevent idle task boosting
    sched/wait: Add __wake_up_all_locked() API
    sched/rt: Document scheduler related skip-resched-check sites
    sched/rt: Use schedule_preempt_disabled()
    sched/rt: Add schedule_preempt_disabled()
    sched/rt: Do not throttle when PI boosting
    sched/rt: Keep period timer ticking when rt throttling is active
    ...

    Linus Torvalds
     

15 Mar, 2012

1 commit

  • Pull block fixes from Jens Axboe:
    "Been sitting on this for a while, but lets get this out the door.
    This fixes various important bugs for 3.3 final, along with a few more
    trivial ones. Please pull!"

    * 'for-linus' of git://git.kernel.dk/linux-block:
    block: fix ioc leak in put_io_context
    block, sx8: fix pointer math issue getting fw version
    Block: use a freezable workqueue for disk-event polling
    drivers/block/DAC960: fix -Wuninitialized warning
    drivers/block/DAC960: fix DAC960_V2_IOCTL_Opcode_T -Wenum-compare warning
    block: fix __blkdev_get and add_disk race condition
    block: Fix setting bio flags in drivers (sd_dif/floppy)
    block: Fix NULL pointer dereference in sd_revalidate_disk
    block: exit_io_context() should call elevator_exit_icq_fn()
    block: simplify ioc_release_fn()
    block: replace icq->changed with icq->flags

    Linus Torvalds
     

14 Mar, 2012

1 commit

  • When put_io_context is called, if ioc->icq_list is empty and refcount
    is 1, kernel will not free the ioc.

    This is caught by following kmemleak:

    unreferenced object 0xffff880036349fe0 (size 216):
    comm "sh", pid 2137, jiffies 4294931140 (age 290579.412s)
    hex dump (first 32 bytes):
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    01 00 01 00 ad 4e ad de ff ff ff ff 00 00 00 00 .....N..........
    backtrace:
    [] kmemleak_alloc+0x26/0x50
    [] kmem_cache_alloc_node+0x1cc/0x2a0
    [] create_io_context_slowpath+0x27/0x130
    [] get_task_io_context+0xbb/0xf0
    [] copy_process+0x188e/0x18b0
    [] do_fork+0x11b/0x420
    [] sys_clone+0x28/0x30
    [] stub_clone+0x13/0x20
    [] 0xffffffffffffffff

    ioc should be freed if ioc->icq_list is empty.
    Signed-off-by: Xiaotian Feng
    Acked-by: Vivek Goyal
    Acked-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Xiaotian Feng
     

02 Mar, 2012

3 commits

  • This patch (as1519) fixes a bug in the block layer's disk-events
    polling. The polling is done by a work routine queued on the
    system_nrt_wq workqueue. Since that workqueue isn't freezable, the
    polling continues even in the middle of a system sleep transition.

    Obviously, polling a suspended drive for media changes and such isn't
    a good thing to do; in the case of USB mass-storage devices it can
    lead to real problems requiring device resets and even re-enumeration.

    The patch fixes things by creating a new system-wide, non-reentrant,
    freezable workqueue and using it for disk-events polling.

    Signed-off-by: Alan Stern
    CC:
    Acked-by: Tejun Heo
    Acked-by: Rafael J. Wysocki
    Signed-off-by: Jens Axboe

    Alan Stern
     
  • The following situation might occur:

    __blkdev_get: add_disk:

    register_disk()
    get_gendisk()

    disk_block_events()
    disk->ev == NULL

    disk_add_events()

    __disk_unblock_events()
    disk->ev != NULL
    --ev->block

    Then we unblock events, when they are suppose to be blocked. This can
    trigger events related block/genhd.c warnings, but also can crash in
    sd_check_events() or other places.

    I'm able to reproduce crashes with the following scripts (with
    connected usb dongle as sdb disk).

    DEV=/dev/sdb
    ENABLE=/sys/bus/usb/devices/1-2/bConfigurationValue

    function stop_me()
    {
    for i in `jobs -p` ; do kill $i 2> /dev/null ; done
    exit
    }

    trap stop_me SIGHUP SIGINT SIGTERM

    for ((i = 0; i < 10; i++)) ; do
    while true; do fdisk -l $DEV 2>&1 > /dev/null ; done &
    done

    while true ; do
    echo 1 > $ENABLE
    sleep 1
    echo 0 > $ENABLE
    done

    I use the script to verify patch fixing oops in sd_revalidate_disk
    http://marc.info/?l=linux-scsi&m=132935572512352&w=2
    Without Jun'ichi Nomura patch titled "Fix NULL pointer dereference in
    sd_revalidate_disk" or this one, script easily crash kernel within
    a few seconds. With both patches applied I do not observe crash.
    Unfortunately after some time (dozen of minutes), script will hung in:

    [ 1563.906432] [] schedule_timeout_uninterruptible+0x15/0x20
    [ 1563.906437] [] msleep+0x15/0x20
    [ 1563.906443] [] blk_drain_queue+0x32/0xd0
    [ 1563.906447] [] blk_cleanup_queue+0xd0/0x170
    [ 1563.906454] [] scsi_free_queue+0x3f/0x60
    [ 1563.906459] [] __scsi_remove_device+0x6e/0xb0
    [ 1563.906463] [] scsi_forget_host+0x4f/0x60
    [ 1563.906468] [] scsi_remove_host+0x5a/0xf0
    [ 1563.906482] [] quiesce_and_remove_host+0x5b/0xa0 [usb_storage]
    [ 1563.906490] [] usb_stor_disconnect+0x13/0x20 [usb_storage]

    Anyway I think this patch is some step forward.

    As drawback, I do not teardown on sysfs file create error, because I do
    not know how to nullify disk->ev (since it can be used). However add_disk
    error handling practically does not exist too, and things will work
    without this sysfs file, except events will not be exported to user
    space.

    Signed-off-by: Stanislaw Gruszka
    Acked-by: Tejun Heo
    Cc: stable@kernel.org
    Signed-off-by: Jens Axboe

    Stanislaw Gruszka
     
  • Since 2.6.39 (1196f8b), when a driver returns -ENOMEDIUM for open(),
    __blkdev_get() calls rescan_partitions() to remove
    in-kernel partition structures and raise KOBJ_CHANGE uevent.

    However it ends up calling driver's revalidate_disk without open
    and could cause oops.

    In the case of SCSI:

    process A process B
    ----------------------------------------------
    sys_open
    __blkdev_get
    sd_open
    returns -ENOMEDIUM
    scsi_remove_device

    rescan_partitions
    sd_revalidate_disk

    Oopses are reported here:
    http://marc.info/?l=linux-scsi&m=132388619710052

    This patch separates the partition invalidation from rescan_partitions()
    and use it for -ENOMEDIUM case.

    Reported-by: Huajun Li
    Signed-off-by: Jun'ichi Nomura
    Acked-by: Tejun Heo
    Cc: stable@kernel.org
    Signed-off-by: Jens Axboe

    Jun'ichi Nomura
     

01 Mar, 2012

1 commit


24 Feb, 2012

1 commit

  • From: Ben Hutchings

    Extended VBLKs (those larger than the preset VBLK size) are divided
    into fragments, each with its own VBLK header. Our LDM implementation
    generally assumes that each VBLK is contiguous in memory, so these
    fragments must be assembled before further processing.

    Currently the reassembly seems to be done quite wrongly - no VBLK
    header is copied into the contiguous buffer, and the length of the
    header is subtracted twice from each fragment. Also the total
    length of the reassembled VBLK is calculated incorrectly.

    Signed-off-by: Ben Hutchings
    Signed-off-by: Anton Altaparmakov

    Anton Altaparmakov
     

15 Feb, 2012

3 commits

  • While updating locking, b2efa05265 "block, cfq: unlink
    cfq_io_context's immediately" moved elevator_exit_icq_fn() invocation
    from exit_io_context() to the final ioc put. While this doesn't cause
    catastrophic failure, it effectively removes task exit notification to
    elevator and cause noticeable IO performance degradation with CFQ.

    On task exit, CFQ used to immediately expire the slice if it was being
    used by the exiting task as no more IO would be issued by the task;
    however, after b2efa05265, the notification is lost and disk could sit
    idle needlessly, leading to noticeable IO performance degradation for
    certain workloads.

    This patch renames ioc_exit_icq() to ioc_destroy_icq(), separates
    elevator_exit_icq_fn() invocation into ioc_exit_icq() and invokes it
    from exit_io_context(). ICQ_EXITED flag is added to avoid invoking
    the callback more than once for the same icq.

    Walking icq_list from ioc side and invoking elevator callback requires
    reverse double locking. This may be better implemented using RCU;
    unfortunately, using RCU isn't trivial. e.g. RCU protection would
    need to cover request_queue and queue_lock switch on cleanup makes
    grabbing queue_lock from RCU unsafe. Reverse double locking should
    do, at least for now.

    Signed-off-by: Tejun Heo
    Reported-and-bisected-by: Shaohua Li
    LKML-Reference:
    Tested-by: Shaohua Li
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • Reverse double lock dancing in ioc_release_fn() can be simplified by
    just using trylock on the queue_lock and back out from ioc lock on
    trylock failure. Simplify it.

    Signed-off-by: Tejun Heo
    Tested-by: Shaohua Li
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • icq->changed was used for ICQ_*_CHANGED bits. Rename it to flags and
    access it under ioc->lock instead of using atomic bitops.
    ioc_get_changed() is added so that the changed part can be fetched and
    cleared as before.

    icq->flags will be used to carry other flags.

    Signed-off-by: Tejun Heo
    Tested-by: Shaohua Li
    Signed-off-by: Jens Axboe

    Tejun Heo
     

11 Feb, 2012

1 commit

  • 11a3122f6c "block: strip out locking optimization in put_io_context()"
    removed ioc_lock depth lockdep annoation along with locking
    optimization; however, while recursing from put_io_context() is no
    longer possible, ioc_release_fn() may still end up putting the last
    reference of another ioc through elevator, which wlil grab ioc->lock
    triggering spurious (as the ioc is always different one) A-A deadlock
    warning.

    As this can only happen one time from ioc_release_fn(), using non-zero
    subclass from ioc_release_fn() is enough. Use subclass 1.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Tejun Heo
     

09 Feb, 2012

1 commit

  • We create "bsg" link if q->kobj.sd is not NULL, so remove it only
    when the same condition is true.

    Fixes:

    WARNING: at fs/sysfs/inode.c:323 sysfs_hash_and_remove+0x2b/0x77()
    sysfs: can not remove 'bsg', no directory
    Call Trace:
    [] warn_slowpath_common+0x6a/0x7f
    [] ? sysfs_hash_and_remove+0x2b/0x77
    [] warn_slowpath_fmt+0x2b/0x2f
    [] sysfs_hash_and_remove+0x2b/0x77
    [] sysfs_remove_link+0x20/0x23
    [] bsg_unregister_queue+0x40/0x6d
    [] __scsi_remove_device+0x31/0x9d
    [] scsi_forget_host+0x41/0x52
    [] scsi_remove_host+0x71/0xe0
    [] quiesce_and_remove_host+0x51/0x83 [usb_storage]
    [] usb_stor_disconnect+0x18/0x22 [usb_storage]
    [] usb_unbind_interface+0x4e/0x109
    [] __device_release_driver+0x6b/0xa6
    [] device_release_driver+0x17/0x22
    [] bus_remove_device+0xd6/0xe6
    [] device_del+0xf2/0x137
    [] usb_disable_device+0x94/0x1a0

    Signed-off-by: Stanislaw Gruszka
    Signed-off-by: Jens Axboe

    Stanislaw Gruszka
     

08 Feb, 2012

2 commits

  • Plug merge calls two elevator callbacks outside queue lock -
    elevator_allow_merge_fn() and elevator_bio_merged_fn(). Although
    attempt_plug_merge() suggests that elevator is guaranteed to be there
    through the existing request on the plug list, nothing prevents plug
    merge from calling into dying or initializing elevator.

    For regular merges, bypass ensures elvpriv count to reach zero, which
    in turn prevents merges as all !ELVPRIV requests get REQ_SOFTBARRIER
    from forced back insertion. Plug merge doesn't check ELVPRIV, and, as
    the requests haven't gone through elevator insertion yet, it doesn't
    have SOFTBARRIER set allowing merges on a bypassed queue.

    This, for example, leads to the following crash during elevator
    switch.

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
    IP: [] cfq_allow_merge+0x49/0xa0
    PGD 112cbc067 PUD 115d5c067 PMD 0
    Oops: 0000 [#1] PREEMPT SMP
    CPU 1
    Modules linked in: deadline_iosched

    Pid: 819, comm: dd Not tainted 3.3.0-rc2-work+ #76 Bochs Bochs
    RIP: 0010:[] [] cfq_allow_merge+0x49/0xa0
    RSP: 0018:ffff8801143a38f8 EFLAGS: 00010297
    RAX: 0000000000000000 RBX: ffff88011817ce28 RCX: ffff880116eb6cc0
    RDX: 0000000000000000 RSI: ffff880118056e20 RDI: ffff8801199512f8
    RBP: ffff8801143a3908 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000001 R11: 0000000000000000 R12: ffff880118195708
    R13: ffff880118052aa0 R14: ffff8801143a3d50 R15: ffff880118195708
    FS: 00007f19f82cb700(0000) GS:ffff88011fc80000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    CR2: 0000000000000008 CR3: 0000000112c6a000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process dd (pid: 819, threadinfo ffff8801143a2000, task ffff880116eb6cc0)
    Stack:
    ffff88011817ce28 ffff880118195708 ffff8801143a3928 ffffffff81391bba
    ffff88011817ce28 ffff880118195708 ffff8801143a3948 ffffffff81391bf1
    ffff88011817ce28 0000000000000000 ffff8801143a39a8 ffffffff81398e3e
    Call Trace:
    [] elv_rq_merge_ok+0x4a/0x60
    [] elv_try_merge+0x21/0x40
    [] blk_queue_bio+0x8e/0x390
    [] generic_make_request+0xca/0x100
    [] submit_bio+0x74/0x100
    [] __blockdev_direct_IO+0x1ce2/0x3450
    [] blkdev_direct_IO+0x57/0x60
    [] generic_file_aio_read+0x6d5/0x760
    [] do_sync_read+0xe2/0x120
    [] vfs_read+0xc5/0x180
    [] sys_read+0x51/0x90
    [] system_call_fastpath+0x16/0x1b

    There are multiple ways to fix this including making plug merge check
    ELVPRIV; however,

    * Calling into elevator outside queue lock is confusing and
    error-prone.

    * Requests on plug list aren't known to the elevator. They aren't on
    the elevator yet, so there's no elevator specific state to update.

    * Given the nature of plug merges - collecting bio's for the same
    purpose from the same issuer - elevator specific restrictions aren't
    applicable.

    So, simply don't call into elevator methods from plug merge by moving
    elv_bio_merged() from bio_attempt_*_merge() to blk_queue_bio(), and
    using blk_try_merge() in attempt_plug_merge().

    This is based on Jens' patch to skip elevator_allow_merge_fn() from
    plug merge.

    Note that this makes per-cgroup merged stats skip plug merging.

    Signed-off-by: Tejun Heo
    LKML-Reference:
    Original-patch-by: Jens Axboe
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • blk_rq_merge_ok() is the elevator-neutral part of merge eligibility
    test. blk_try_merge() determines merge direction and expects the
    caller to have tested elv_rq_merge_ok() previously.

    elv_rq_merge_ok() now wraps blk_rq_merge_ok() and then calls
    elv_iosched_allow_merge(). elv_try_merge() is removed and the two
    callers are updated to call elv_rq_merge_ok() explicitly followed by
    blk_try_merge(). While at it, make rq_merge_ok() functions return
    bool.

    This is to prepare for plug merge update and doesn't introduce any
    behavior change.

    This is based on Jens' patch to skip elevator_allow_merge_fn() from
    plug merge.

    Signed-off-by: Tejun Heo
    LKML-Reference:
    Original-patch-by: Jens Axboe
    Signed-off-by: Jens Axboe

    Tejun Heo
     

07 Feb, 2012

1 commit

  • put_io_context() performed a complex trylock dancing to avoid
    deferring ioc release to workqueue. It was also broken on UP because
    trylock was always assumed to succeed which resulted in unbalanced
    preemption count.

    While there are ways to fix the UP breakage, even the most
    pathological microbench (forced ioc allocation and tight fork/exit
    loop) fails to show any appreciable performance benefit of the
    optimization. Strip it out. If there turns out to be workloads which
    are affected by this change, simpler optimization from the discussion
    thread can be applied later.

    Signed-off-by: Tejun Heo
    LKML-Reference:
    Signed-off-by: Jens Axboe

    Tejun Heo
     

06 Feb, 2012

1 commit

  • Meelis reported a warning:

    WARNING: at kernel/timer.c:1122 run_timer_softirq+0x199/0x1ec()
    Hardware name: 939Dual-SATA2
    timer: cfq_idle_slice_timer+0x0/0xaa preempt leak: 00000102 -> 00000103
    Modules linked in: sr_mod cdrom videodev media drm_kms_helper ohci_hcd ehci_hcd v4l2_compat_ioctl32 usbcore i2c_ali15x3 snd_seq drm snd_timer snd_seq
    Pid: 0, comm: swapper Not tainted 3.3.0-rc2-00110-gd125666 #176
    Call Trace:
    [] warn_slowpath_common+0x7e/0x96
    [] ? cfq_slice_expired+0x1d/0x1d
    [] warn_slowpath_fmt+0x41/0x43
    [] ? cfq_idle_slice_timer+0xa1/0xaa
    [] ? cfq_slice_expired+0x1d/0x1d
    [] run_timer_softirq+0x199/0x1ec
    [] ? timekeeping_get_ns+0x12/0x31
    [] ? apic_write+0x11/0x13
    [] __do_softirq+0x74/0xfa
    [] call_softirq+0x1a/0x30
    [] do_softirq+0x31/0x68
    [] irq_exit+0x3d/0xa3
    [] smp_apic_timer_interrupt+0x6b/0x77
    [] apic_timer_interrupt+0x69/0x70
    [] ? sched_clock_cpu+0x73/0x7d
    [] ? sched_clock_cpu+0x73/0x7d
    [] ? default_idle+0x1e/0x32
    [] ? default_idle+0x18/0x32
    [] cpu_idle+0x87/0xd1
    [] rest_init+0x85/0x89
    [] start_kernel+0x2eb/0x2f8
    [] x86_64_start_reservations+0x7e/0x82
    [] x86_64_start_kernel+0xf0/0xf7

    this_q == locked_q is possible. There are two problems here:
    1. In UP case, there is preemption counter issue as spin_trylock always
    successes.
    2. In SMP case, the loop breaks too earlier.

    Signed-off-by: Shaohua Li
    Reported-by: Meelis Roos
    Reported-by: Knut Petersen
    Tested-by: Knut Petersen
    Signed-off-by: Jens Axboe

    Shaohua Li
     

03 Feb, 2012

1 commit

  • The argument is not used at all, and it's not necessary, because
    a specific callback handler of course knows which subsys it
    belongs to.

    Now only ->pupulate() takes this argument, because the handlers of
    this callback always call cgroup_add_file()/cgroup_add_files().

    So we reduce a few lines of code, though the shrinking of object size
    is minimal.

    16 files changed, 113 insertions(+), 162 deletions(-)

    text data bss dec hex filename
    5486240 656987 7039960 13183187 c928d3 vmlinux.o.orig
    5486170 656987 7039960 13183117 c9288d vmlinux.o

    Signed-off-by: Li Zefan
    Signed-off-by: Tejun Heo

    Li Zefan
     

27 Jan, 2012

1 commit

  • The block layer has some code trying to determine if two CPUs share a
    cache, the scheduler has a similar function. Expose the function used
    by the scheduler and make the block layer use it, thereby removing the
    block layers usage of CONFIG_SCHED* and topology bits.

    Signed-off-by: Peter Zijlstra
    Acked-by: Jens Axboe
    Link: http://lkml.kernel.org/r/1327579450.2446.95.camel@twins

    Peter Zijlstra
     

19 Jan, 2012

2 commits

  • Vivek reported a kernel crash:
    [ 94.217015] BUG: unable to handle kernel NULL pointer dereference at 000000000000001c
    [ 94.218004] IP: [] kmem_cache_free+0x5e/0x200
    [ 94.218004] PGD 13abda067 PUD 137d52067 PMD 0
    [ 94.218004] Oops: 0000 [#1] SMP DEBUG_PAGEALLOC
    [ 94.218004] CPU 0
    [ 94.218004] Modules linked in: [last unloaded: scsi_wait_scan]
    [ 94.218004]
    [ 94.218004] Pid: 0, comm: swapper/0 Not tainted 3.2.0+ #16 Hewlett-Packard HP xw6600 Workstation/0A9Ch
    [ 94.218004] RIP: 0010:[] [] kmem_cache_free+0x5e/0x200
    [ 94.218004] RSP: 0018:ffff88013fc03de0 EFLAGS: 00010006
    [ 94.218004] RAX: ffffffff81e0d020 RBX: ffff880138b3c680 RCX: 00000001801c001b
    [ 94.218004] RDX: 00000000003aac1d RSI: ffff880138b3c680 RDI: ffffffff81142fae
    [ 94.218004] RBP: ffff88013fc03e10 R08: ffff880137830238 R09: 0000000000000001
    [ 94.218004] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
    [ 94.218004] R13: ffffea0004e2cf00 R14: ffffffff812f6eb6 R15: 0000000000000246
    [ 94.218004] FS: 0000000000000000(0000) GS:ffff88013fc00000(0000) knlGS:0000000000000000
    [ 94.218004] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    [ 94.218004] CR2: 000000000000001c CR3: 00000001395ab000 CR4: 00000000000006f0
    [ 94.218004] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 94.218004] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    [ 94.218004] Process swapper/0 (pid: 0, threadinfo ffffffff81e00000, task ffffffff81e0d020)
    [ 94.218004] Stack:
    [ 94.218004] 0000000000000102 ffff88013fc0db20 ffffffff81e22700 ffff880139500f00
    [ 94.218004] 0000000000000001 000000000000000a ffff88013fc03e20 ffffffff812f6eb6
    [ 94.218004] ffff88013fc03e90 ffffffff810c8da2 ffffffff81e01fd8 ffff880137830240
    [ 94.218004] Call Trace:
    [ 94.218004]
    [ 94.218004] [] icq_free_icq_rcu+0x16/0x20
    [ 94.218004] [] __rcu_process_callbacks+0x1c2/0x420
    [ 94.218004] [] rcu_process_callbacks+0x38/0x250
    [ 94.218004] [] __do_softirq+0xce/0x3e0
    [ 94.218004] [] ? clockevents_program_event+0x74/0x100
    [ 94.218004] [] ? tick_program_event+0x24/0x30
    [ 94.218004] [] call_softirq+0x1c/0x30
    [ 94.218004] [] do_softirq+0x8d/0xc0
    [ 94.218004] [] irq_exit+0xae/0xe0
    [ 94.218004] [] smp_apic_timer_interrupt+0x6e/0x99
    [ 94.218004] [] apic_timer_interrupt+0x70/0x80

    Once a queue is quiesced, it's not supposed to have any elvpriv data or
    icq's, and elevator switching depends on that. Request alloc path
    followed the rule for elvpriv data but forgot apply it to icq's
    leading to the following crash during elevator switch. Fix it by not
    allocating icq's if ELVPRIV is not set for the request.

    Reported-by: Vivek Goyal
    Tested-by: Vivek Goyal
    Signed-off-by: Shaohua Li
    Acked-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Shaohua Li
     
  • cfq_slice_expired will change saved_workload_slice. It should be called
    first so saved_workload_slice is correctly set to 0 after workload type
    is changed.
    This fixes the code order changed by 54b466e44b1c7.

    Tested-by: Tetsuo Handa
    Signed-off-by: Shaohua Li
    Signed-off-by: Jens Axboe

    Shaohua Li
     

18 Jan, 2012

1 commit

  • With the changes in life time management between the cfq IO contexts
    and the cfq queues, we now risk having cfqd->active_queue being
    freed when cfq_slice_expired() is being called. cfq_preempt_queue()
    caches this queue and uses it after calling said function, causing
    a use-after-free condition. This triggers the following oops,
    when cfqq_type() attempts to dereference it:

    BUG: unable to handle kernel paging request at ffff8800746c4f0c
    IP: [] cfqq_type+0xb/0x20
    PGD 18d4063 PUD 1fe15067 PMD 1ffb9067 PTE 80000000746c4160
    Oops: 0000 [#1] SMP DEBUG_PAGEALLOC
    CPU 3
    Modules linked in:

    Pid: 1, comm: init Not tainted 3.2.0-josef+ #367 Bochs Bochs
    RIP: 0010:[] [] cfqq_type+0xb/0x20
    RSP: 0018:ffff880079c11778 EFLAGS: 00010046
    RAX: 0000000000000000 RBX: ffff880076f3df08 RCX: 0000000000000000
    RDX: 0000000000000006 RSI: ffff880074271888 RDI: ffff8800746c4f08
    RBP: ffff880079c11778 R08: 0000000000000078 R09: 0000000000000001
    R10: 09f911029d74e35b R11: 09f911029d74e35b R12: ffff880076f337f0
    R13: ffff8800746c4f08 R14: ffff8800746c4f08 R15: 0000000000000002
    FS: 00007f62fd44f700(0000) GS:ffff88007cd80000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: ffff8800746c4f0c CR3: 0000000076c21000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process init (pid: 1, threadinfo ffff880079c10000, task ffff880079c0a040)
    Stack:
    ffff880079c117c8 ffffffff812683d8 ffff880079c117a8 ffffffff8125de43
    ffff8800744fcf48 ffff880074b43e98 ffff8800770c8828 ffff880074b43e98
    0000000000000003 0000000000000000 ffff880079c117f8 ffffffff81254149
    Call Trace:
    [] cfq_insert_request+0x3f5/0x47c
    [] ? blk_recount_segments+0x20/0x31
    [] __elv_add_request+0x1ca/0x200
    [] blk_queue_bio+0x2ef/0x312
    [] generic_make_request+0x9f/0xe0
    [] submit_bio+0xbf/0xca
    [] submit_bh+0xdf/0xfe
    [] ext3_bread+0x50/0x99
    [] dx_probe+0x38/0x291
    [] ext3_dx_find_entry+0x58/0x219
    [] ext3_find_entry+0xb0/0x406
    [] ? cache_alloc_debugcheck_after.isra.46+0x14d/0x1a0
    [] ? kmem_cache_alloc+0xef/0x191
    [] ext3_lookup+0x39/0xe1
    [] d_alloc_and_lookup+0x45/0x6c
    [] do_lookup+0x1e4/0x2f5
    [] link_path_walk+0x1a4/0x6ef
    [] path_lookupat+0x59/0x5ea
    [] ? __strncpy_from_user+0x30/0x5a
    [] do_path_lookup+0x23/0x59
    [] user_path_at_empty+0x53/0x99
    [] ? remove_wait_queue+0x51/0x56
    [] user_path_at+0x11/0x13
    [] vfs_fstatat+0x3a/0x64
    [] vfs_stat+0x1b/0x1d
    [] sys_newstat+0x1a/0x33
    [] ? task_stopped_code+0x42/0x42
    [] system_call_fastpath+0x16/0x1b
    Code: 89 e6 48 89 c7 e8 fa ca fe ff 85 c0 74 06 4c 89 2b 41 b6 01 5b 44 89 f0 41 5c 41 5d 41 5e 5d c3 55 48 89 e5 66 66 66 66 90 31 c0 57 04 f6 c6 01 74 0b 83 e2 20 83 fa 01 19 c0 83 c0 02 5d c3
    RIP [] cfqq_type+0xb/0x20
    RSP
    CR2: ffff8800746c4f0c

    Get rid of the caching of cfqd->active_queue, and reorder the
    check so that it happens before we expire the active queue.

    Thanks to Tejun for pin pointing the error location.

    Reported-by: Chris Mason
    Tested-by: Chris Mason
    Signed-off-by: Jens Axboe

    Jens Axboe
     

16 Jan, 2012

1 commit

  • * 'for-3.3/core' of git://git.kernel.dk/linux-block: (37 commits)
    Revert "block: recursive merge requests"
    block: Stop using macro stubs for the bio data integrity calls
    blockdev: convert some macros to static inlines
    fs: remove unneeded plug in mpage_readpages()
    block: Add BLKROTATIONAL ioctl
    block: Introduce blk_set_stacking_limits function
    block: remove WARN_ON_ONCE() in exit_io_context()
    block: an exiting task should be allowed to create io_context
    block: ioc_cgroup_changed() needs to be exported
    block: recursive merge requests
    block, cfq: fix empty queue crash caused by request merge
    block, cfq: move icq creation and rq->elv.icq association to block core
    block, cfq: restructure io_cq creation path for io_context interface cleanup
    block, cfq: move io_cq exit/release to blk-ioc.c
    block, cfq: move icq cache management to block core
    block, cfq: move io_cq lookup to blk-ioc.c
    block, cfq: move cfqd->icq_list to request_queue and add request->elv.icq
    block, cfq: reorganize cfq_io_context into generic and cfq specific parts
    block: remove elevator_queue->ops
    block: reorder elevator switch sequence
    ...

    Fix up conflicts in:
    - block/blk-cgroup.c
    Switch from can_attach_task to can_attach
    - block/cfq-iosched.c
    conflict with now removed cic index changes (we now use q->id instead)

    Linus Torvalds
     

15 Jan, 2012

3 commits

  • This reverts commit 274193224cdabd687d804a26e0150bb20f2dd52c.

    We have some problems related to selection of empty queues
    that need to be resolved, evidence so far points to the
    recursive merge logic making either being the cause or at
    least the accelerator for this. So revert it for now, until
    we figure this out.

    Signed-off-by: Jens Axboe

    Jens Axboe
     
  • Linux allows executing the SG_IO ioctl on a partition or LVM volume, and
    will pass the command to the underlying block device. This is
    well-known, but it is also a large security problem when (via Unix
    permissions, ACLs, SELinux or a combination thereof) a program or user
    needs to be granted access only to part of the disk.

    This patch lets partitions forward a small set of harmless ioctls;
    others are logged with printk so that we can see which ioctls are
    actually sent. In my tests only CDROM_GET_CAPABILITY actually occurred.
    Of course it was being sent to a (partition on a) hard disk, so it would
    have failed with ENOTTY and the patch isn't changing anything in
    practice. Still, I'm treating it specially to avoid spamming the logs.

    In principle, this restriction should include programs running with
    CAP_SYS_RAWIO. If for example I let a program access /dev/sda2 and
    /dev/sdb, it still should not be able to read/write outside the
    boundaries of /dev/sda2 independent of the capabilities. However, for
    now programs with CAP_SYS_RAWIO will still be allowed to send the
    ioctls. Their actions will still be logged.

    This patch does not affect the non-libata IDE driver. That driver
    however already tests for bd != bd->bd_contains before issuing some
    ioctl; it could be restricted further to forbid these ioctls even for
    programs running with CAP_SYS_ADMIN/CAP_SYS_RAWIO.

    Cc: linux-scsi@vger.kernel.org
    Cc: Jens Axboe
    Cc: James Bottomley
    Signed-off-by: Paolo Bonzini
    [ Make it also print the command name when warning - Linus ]
    Signed-off-by: Linus Torvalds

    Paolo Bonzini
     
  • Introduce a wrapper around scsi_cmd_ioctl that takes a block device.

    The function will then be enhanced to detect partition block devices
    and, in that case, subject the ioctls to whitelisting.

    Cc: linux-scsi@vger.kernel.org
    Cc: Jens Axboe
    Cc: James Bottomley
    Signed-off-by: Paolo Bonzini
    Signed-off-by: Linus Torvalds

    Paolo Bonzini
     

11 Jan, 2012

2 commits

  • Introduce an ioctl which permits applications to query whether a block
    device is rotational.

    Signed-off-by: Martin K. Petersen
    Signed-off-by: Jens Axboe

    Martin K. Petersen
     
  • Stacking driver queue limits are typically bounded exclusively by the
    capabilities of the low level devices, not by the stacking driver
    itself.

    This patch introduces blk_set_stacking_limits() which has more liberal
    metrics than the default queue limits function. This allows us to
    inherit topology parameters from bottom devices without manually
    tweaking the default limits in each driver prior to calling the stacking
    function.

    Since there is now a clear distinction between stacking and low-level
    devices, blk_set_default_limits() has been modified to carry the more
    conservative values that we used to manually set in
    blk_queue_make_request().

    Signed-off-by: Martin K. Petersen
    Acked-by: Mike Snitzer
    Signed-off-by: Jens Axboe

    Martin K. Petersen