Commit 297cbccc authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-linus-20191010' of git://git.kernel.dk/linux-block

Pull block fixes from Jens Axboe:

 - Fix wbt performance regression introduced with the blk-rq-qos
   refactoring (Harshad)

 - Fix io_uring fileset removal inadvertently killing the workqueue (me)

 - Fix io_uring typo in linked command nonblock submission (Pavel)

 - Remove spurious io_uring wakeups on request free (Pavel)

 - Fix null_blk zoned command error return (Keith)

 - Don't use freezable workqueues for backing_dev, also means we can
   revert a previous libata hack (Mika)

 - Fix nbd sysfs mutex dropped too soon at removal time (Xiubo)

* tag 'for-linus-20191010' of git://git.kernel.dk/linux-block:
  nbd: fix possible sysfs duplicate warning
  null_blk: Fix zoned command return code
  io_uring: only flush workqueues on fileset removal
  io_uring: remove wait loop spurious wakeups
  blk-wbt: fix performance regression in wbt scale_up/scale_down
  Revert "libata, freezer: avoid block device removal while system is frozen"
  bdi: Do not use freezable workqueue
  io_uring: fix reversed nonblock flag for link submission
parents 9e208aa0 86248810
...@@ -160,24 +160,27 @@ bool rq_depth_calc_max_depth(struct rq_depth *rqd) ...@@ -160,24 +160,27 @@ bool rq_depth_calc_max_depth(struct rq_depth *rqd)
return ret; return ret;
} }
void rq_depth_scale_up(struct rq_depth *rqd) /* Returns true on success and false if scaling up wasn't possible */
bool rq_depth_scale_up(struct rq_depth *rqd)
{ {
/* /*
* Hit max in previous round, stop here * Hit max in previous round, stop here
*/ */
if (rqd->scaled_max) if (rqd->scaled_max)
return; return false;
rqd->scale_step--; rqd->scale_step--;
rqd->scaled_max = rq_depth_calc_max_depth(rqd); rqd->scaled_max = rq_depth_calc_max_depth(rqd);
return true;
} }
/* /*
* Scale rwb down. If 'hard_throttle' is set, do it quicker, since we * Scale rwb down. If 'hard_throttle' is set, do it quicker, since we
* had a latency violation. * had a latency violation. Returns true on success and returns false if
* scaling down wasn't possible.
*/ */
void rq_depth_scale_down(struct rq_depth *rqd, bool hard_throttle) bool rq_depth_scale_down(struct rq_depth *rqd, bool hard_throttle)
{ {
/* /*
* Stop scaling down when we've hit the limit. This also prevents * Stop scaling down when we've hit the limit. This also prevents
...@@ -185,7 +188,7 @@ void rq_depth_scale_down(struct rq_depth *rqd, bool hard_throttle) ...@@ -185,7 +188,7 @@ void rq_depth_scale_down(struct rq_depth *rqd, bool hard_throttle)
* keep up. * keep up.
*/ */
if (rqd->max_depth == 1) if (rqd->max_depth == 1)
return; return false;
if (rqd->scale_step < 0 && hard_throttle) if (rqd->scale_step < 0 && hard_throttle)
rqd->scale_step = 0; rqd->scale_step = 0;
...@@ -194,6 +197,7 @@ void rq_depth_scale_down(struct rq_depth *rqd, bool hard_throttle) ...@@ -194,6 +197,7 @@ void rq_depth_scale_down(struct rq_depth *rqd, bool hard_throttle)
rqd->scaled_max = false; rqd->scaled_max = false;
rq_depth_calc_max_depth(rqd); rq_depth_calc_max_depth(rqd);
return true;
} }
struct rq_qos_wait_data { struct rq_qos_wait_data {
......
...@@ -130,8 +130,8 @@ void rq_qos_wait(struct rq_wait *rqw, void *private_data, ...@@ -130,8 +130,8 @@ void rq_qos_wait(struct rq_wait *rqw, void *private_data,
acquire_inflight_cb_t *acquire_inflight_cb, acquire_inflight_cb_t *acquire_inflight_cb,
cleanup_cb_t *cleanup_cb); cleanup_cb_t *cleanup_cb);
bool rq_wait_inc_below(struct rq_wait *rq_wait, unsigned int limit); bool rq_wait_inc_below(struct rq_wait *rq_wait, unsigned int limit);
void rq_depth_scale_up(struct rq_depth *rqd); bool rq_depth_scale_up(struct rq_depth *rqd);
void rq_depth_scale_down(struct rq_depth *rqd, bool hard_throttle); bool rq_depth_scale_down(struct rq_depth *rqd, bool hard_throttle);
bool rq_depth_calc_max_depth(struct rq_depth *rqd); bool rq_depth_calc_max_depth(struct rq_depth *rqd);
void __rq_qos_cleanup(struct rq_qos *rqos, struct bio *bio); void __rq_qos_cleanup(struct rq_qos *rqos, struct bio *bio);
......
...@@ -308,7 +308,8 @@ static void calc_wb_limits(struct rq_wb *rwb) ...@@ -308,7 +308,8 @@ static void calc_wb_limits(struct rq_wb *rwb)
static void scale_up(struct rq_wb *rwb) static void scale_up(struct rq_wb *rwb)
{ {
rq_depth_scale_up(&rwb->rq_depth); if (!rq_depth_scale_up(&rwb->rq_depth))
return;
calc_wb_limits(rwb); calc_wb_limits(rwb);
rwb->unknown_cnt = 0; rwb->unknown_cnt = 0;
rwb_wake_all(rwb); rwb_wake_all(rwb);
...@@ -317,7 +318,8 @@ static void scale_up(struct rq_wb *rwb) ...@@ -317,7 +318,8 @@ static void scale_up(struct rq_wb *rwb)
static void scale_down(struct rq_wb *rwb, bool hard_throttle) static void scale_down(struct rq_wb *rwb, bool hard_throttle)
{ {
rq_depth_scale_down(&rwb->rq_depth, hard_throttle); if (!rq_depth_scale_down(&rwb->rq_depth, hard_throttle))
return;
calc_wb_limits(rwb); calc_wb_limits(rwb);
rwb->unknown_cnt = 0; rwb->unknown_cnt = 0;
rwb_trace_step(rwb, "scale down"); rwb_trace_step(rwb, "scale down");
......
...@@ -4791,27 +4791,6 @@ void ata_scsi_hotplug(struct work_struct *work) ...@@ -4791,27 +4791,6 @@ void ata_scsi_hotplug(struct work_struct *work)
return; return;
} }
/*
* XXX - UGLY HACK
*
* The block layer suspend/resume path is fundamentally broken due
* to freezable kthreads and workqueue and may deadlock if a block
* device gets removed while resume is in progress. I don't know
* what the solution is short of removing freezable kthreads and
* workqueues altogether.
*
* The following is an ugly hack to avoid kicking off device
* removal while freezer is active. This is a joke but does avoid
* this particular deadlock scenario.
*
* https://bugzilla.kernel.org/show_bug.cgi?id=62801
* http://marc.info/?l=linux-kernel&m=138695698516487
*/
#ifdef CONFIG_FREEZER
while (pm_freezing)
msleep(10);
#endif
DPRINTK("ENTER\n"); DPRINTK("ENTER\n");
mutex_lock(&ap->scsi_scan_mutex); mutex_lock(&ap->scsi_scan_mutex);
......
...@@ -248,8 +248,8 @@ static void nbd_put(struct nbd_device *nbd) ...@@ -248,8 +248,8 @@ static void nbd_put(struct nbd_device *nbd)
if (refcount_dec_and_mutex_lock(&nbd->refs, if (refcount_dec_and_mutex_lock(&nbd->refs,
&nbd_index_mutex)) { &nbd_index_mutex)) {
idr_remove(&nbd_index_idr, nbd->index); idr_remove(&nbd_index_idr, nbd->index);
mutex_unlock(&nbd_index_mutex);
nbd_dev_remove(nbd); nbd_dev_remove(nbd);
mutex_unlock(&nbd_index_mutex);
} }
} }
......
...@@ -142,8 +142,7 @@ static blk_status_t null_zone_reset(struct nullb_cmd *cmd, sector_t sector) ...@@ -142,8 +142,7 @@ static blk_status_t null_zone_reset(struct nullb_cmd *cmd, sector_t sector)
zone->wp = zone->start; zone->wp = zone->start;
break; break;
default: default:
cmd->error = BLK_STS_NOTSUPP; return BLK_STS_NOTSUPP;
break;
} }
return BLK_STS_OK; return BLK_STS_OK;
} }
......
...@@ -591,14 +591,6 @@ static void io_cqring_add_event(struct io_ring_ctx *ctx, u64 user_data, ...@@ -591,14 +591,6 @@ static void io_cqring_add_event(struct io_ring_ctx *ctx, u64 user_data,
io_cqring_ev_posted(ctx); io_cqring_ev_posted(ctx);
} }
static void io_ring_drop_ctx_refs(struct io_ring_ctx *ctx, unsigned refs)
{
percpu_ref_put_many(&ctx->refs, refs);
if (waitqueue_active(&ctx->wait))
wake_up(&ctx->wait);
}
static struct io_kiocb *io_get_req(struct io_ring_ctx *ctx, static struct io_kiocb *io_get_req(struct io_ring_ctx *ctx,
struct io_submit_state *state) struct io_submit_state *state)
{ {
...@@ -646,7 +638,7 @@ static struct io_kiocb *io_get_req(struct io_ring_ctx *ctx, ...@@ -646,7 +638,7 @@ static struct io_kiocb *io_get_req(struct io_ring_ctx *ctx,
req->result = 0; req->result = 0;
return req; return req;
out: out:
io_ring_drop_ctx_refs(ctx, 1); percpu_ref_put(&ctx->refs);
return NULL; return NULL;
} }
...@@ -654,7 +646,7 @@ static void io_free_req_many(struct io_ring_ctx *ctx, void **reqs, int *nr) ...@@ -654,7 +646,7 @@ static void io_free_req_many(struct io_ring_ctx *ctx, void **reqs, int *nr)
{ {
if (*nr) { if (*nr) {
kmem_cache_free_bulk(req_cachep, *nr, reqs); kmem_cache_free_bulk(req_cachep, *nr, reqs);
io_ring_drop_ctx_refs(ctx, *nr); percpu_ref_put_many(&ctx->refs, *nr);
*nr = 0; *nr = 0;
} }
} }
...@@ -663,7 +655,7 @@ static void __io_free_req(struct io_kiocb *req) ...@@ -663,7 +655,7 @@ static void __io_free_req(struct io_kiocb *req)
{ {
if (req->file && !(req->flags & REQ_F_FIXED_FILE)) if (req->file && !(req->flags & REQ_F_FIXED_FILE))
fput(req->file); fput(req->file);
io_ring_drop_ctx_refs(req->ctx, 1); percpu_ref_put(&req->ctx->refs);
kmem_cache_free(req_cachep, req); kmem_cache_free(req_cachep, req);
} }
...@@ -2761,7 +2753,7 @@ static int io_ring_submit(struct io_ring_ctx *ctx, unsigned int to_submit, ...@@ -2761,7 +2753,7 @@ static int io_ring_submit(struct io_ring_ctx *ctx, unsigned int to_submit,
if (link) if (link)
io_queue_link_head(ctx, link, &link->submit, shadow_req, io_queue_link_head(ctx, link, &link->submit, shadow_req,
block_for_last); !block_for_last);
if (statep) if (statep)
io_submit_state_end(statep); io_submit_state_end(statep);
...@@ -2920,8 +2912,12 @@ static void io_finish_async(struct io_ring_ctx *ctx) ...@@ -2920,8 +2912,12 @@ static void io_finish_async(struct io_ring_ctx *ctx)
static void io_destruct_skb(struct sk_buff *skb) static void io_destruct_skb(struct sk_buff *skb)
{ {
struct io_ring_ctx *ctx = skb->sk->sk_user_data; struct io_ring_ctx *ctx = skb->sk->sk_user_data;
int i;
for (i = 0; i < ARRAY_SIZE(ctx->sqo_wq); i++)
if (ctx->sqo_wq[i])
flush_workqueue(ctx->sqo_wq[i]);
io_finish_async(ctx);
unix_destruct_scm(skb); unix_destruct_scm(skb);
} }
...@@ -3630,7 +3626,7 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit, ...@@ -3630,7 +3626,7 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,
} }
} }
io_ring_drop_ctx_refs(ctx, 1); percpu_ref_put(&ctx->refs);
out_fput: out_fput:
fdput(f); fdput(f);
return submitted ? submitted : ret; return submitted ? submitted : ret;
......
...@@ -22,12 +22,6 @@ EXPORT_SYMBOL(system_freezing_cnt); ...@@ -22,12 +22,6 @@ EXPORT_SYMBOL(system_freezing_cnt);
bool pm_freezing; bool pm_freezing;
bool pm_nosig_freezing; bool pm_nosig_freezing;
/*
* Temporary export for the deadlock workaround in ata_scsi_hotplug().
* Remove once the hack becomes unnecessary.
*/
EXPORT_SYMBOL_GPL(pm_freezing);
/* protects freezing and frozen transitions */ /* protects freezing and frozen transitions */
static DEFINE_SPINLOCK(freezer_lock); static DEFINE_SPINLOCK(freezer_lock);
......
...@@ -239,8 +239,8 @@ static int __init default_bdi_init(void) ...@@ -239,8 +239,8 @@ static int __init default_bdi_init(void)
{ {
int err; int err;
bdi_wq = alloc_workqueue("writeback", WQ_MEM_RECLAIM | WQ_FREEZABLE | bdi_wq = alloc_workqueue("writeback", WQ_MEM_RECLAIM | WQ_UNBOUND |
WQ_UNBOUND | WQ_SYSFS, 0); WQ_SYSFS, 0);
if (!bdi_wq) if (!bdi_wq)
return -ENOMEM; return -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment