06 Jan, 2021

1 commit

  • commit fa4d0f1992a96f6d7c988ef423e3127e613f6ac9 upstream.

    With the current implementation the following race can happen:

    * blk_pre_runtime_suspend() calls blk_freeze_queue_start() and
    blk_mq_unfreeze_queue().

    * blk_queue_enter() calls blk_queue_pm_only() and that function returns
    true.

    * blk_queue_enter() calls blk_pm_request_resume() and that function does
    not call pm_request_resume() because the queue runtime status is
    RPM_ACTIVE.

    * blk_pre_runtime_suspend() changes the queue status into RPM_SUSPENDING.

    Fix this race by changing the queue runtime status into RPM_SUSPENDING
    before switching q_usage_counter to atomic mode.

    Link: https://lore.kernel.org/r/20201209052951.16136-2-bvanassche@acm.org
    Fixes: 986d413b7c15 ("blk-mq: Enable support for runtime power management")
    Cc: Ming Lei
    Cc: Rafael J. Wysocki
    Cc: stable
    Reviewed-by: Christoph Hellwig
    Reviewed-by: Hannes Reinecke
    Reviewed-by: Jens Axboe
    Acked-by: Alan Stern
    Acked-by: Stanley Chu
    Co-developed-by: Can Guo
    Signed-off-by: Can Guo
    Signed-off-by: Bart Van Assche
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Bart Van Assche
     

25 Jul, 2020

1 commit

  • Commit 05d18ae1cc8a ("scsi: pm: Balance pm_only counter of request queue
    during system resume") fixed a problem in the block layer's runtime-PM
    code: blk_set_runtime_active() failed to call blk_clear_pm_only().
    However, the commit's implementation was awkward; it forced the SCSI
    system-resume handler to choose whether to call blk_post_runtime_resume()
    or blk_set_runtime_active(), depending on whether or not the SCSI device
    had previously been runtime suspended.

    This patch simplifies the situation considerably by adding the missing
    function call directly into blk_set_runtime_active() (under the condition
    that the queue is not already in the RPM_ACTIVE state). This allows the
    SCSI routine to revert back to its original form. Furthermore, making this
    change reveals that blk_post_runtime_resume() (in its success pathway) does
    exactly the same thing as blk_set_runtime_active(). The duplicate code is
    easily removed by making one routine call the other.

    No functional changes are intended.

    Link: https://lore.kernel.org/r/20200706151436.GA702867@rowland.harvard.edu
    CC: Can Guo
    CC: Bart Van Assche
    Reviewed-by: Bart Van Assche
    Signed-off-by: Alan Stern
    Signed-off-by: Martin K. Petersen

    Alan Stern
     

12 Sep, 2019

1 commit

  • Some devices may skip blk_pm_runtime_init() and have null pointer
    in its request_queue->dev. For example, SCSI devices of UFS Well-Known
    LUNs.

    Currently the null pointer is checked by the user of
    blk_set_runtime_active(), i.e., scsi_dev_type_resume(). It is better to
    check it by blk_set_runtime_active() itself instead of by its users.

    Signed-off-by: Stanley Chu
    Signed-off-by: Jens Axboe

    Stanley Chu
     

16 Nov, 2018

1 commit

  • With the legacy request path gone there is no good reason to keep
    queue_lock as a pointer, we can always use the embedded lock now.

    Reviewed-by: Hannes Reinecke
    Signed-off-by: Christoph Hellwig

    Fixed floppy and blk-cgroup missing conversions and half done edits.

    Signed-off-by: Jens Axboe

    Christoph Hellwig
     

27 Sep, 2018

3 commits

  • Now that the blk-mq core processes power management requests
    (marked with RQF_PREEMPT) in other states than RPM_ACTIVE, enable
    runtime power management for blk-mq.

    Signed-off-by: Bart Van Assche
    Reviewed-by: Ming Lei
    Reviewed-by: Christoph Hellwig
    Cc: Jianchao Wang
    Cc: Hannes Reinecke
    Cc: Johannes Thumshirn
    Cc: Alan Stern
    Signed-off-by: Jens Axboe

    Bart Van Assche
     
  • Instead of allowing requests that are not power management requests
    to enter the queue in runtime suspended status (RPM_SUSPENDED), make
    the blk_get_request() caller block. This change fixes a starvation
    issue: it is now guaranteed that power management requests will be
    executed no matter how many blk_get_request() callers are waiting.
    For blk-mq, instead of maintaining the q->nr_pending counter, rely
    on q->q_usage_counter. Call pm_runtime_mark_last_busy() every time a
    request finishes instead of only if the queue depth drops to zero.

    Signed-off-by: Bart Van Assche
    Reviewed-by: Ming Lei
    Reviewed-by: Christoph Hellwig
    Cc: Jianchao Wang
    Cc: Hannes Reinecke
    Cc: Johannes Thumshirn
    Cc: Alan Stern
    Signed-off-by: Jens Axboe

    Bart Van Assche
     
  • Move the code for runtime power management from blk-core.c into the
    new source file blk-pm.c. Move the corresponding declarations from
    into . For CONFIG_PM=n, leave out
    the declarations of the functions that are not used in that mode.
    This patch not only reduces the number of #ifdefs in the block layer
    core code but also reduces the size of header file
    and hence should help to reduce the build time of the Linux kernel
    if CONFIG_PM is not defined.

    Signed-off-by: Bart Van Assche
    Reviewed-by: Ming Lei
    Reviewed-by: Christoph Hellwig
    Cc: Jianchao Wang
    Cc: Hannes Reinecke
    Cc: Johannes Thumshirn
    Cc: Alan Stern
    Signed-off-by: Jens Axboe

    Bart Van Assche