From: Sasha Levin <Alexander.Levin@microsoft.com>
To: "stable@vger.kernel.org" <stable@vger.kernel.org>
Cc: Jianchao Wang <jianchao.w.wang@oracle.com>,
Jens Axboe <axboe@kernel.dk>,
Sasha Levin <Alexander.Levin@microsoft.com>
Subject: [PATCH AUTOSEL 4.18 074/113] blk-mq: count the hctx as active before allocating tag
Date: Thu, 30 Aug 2018 18:07:32 +0000 [thread overview]
Message-ID: <20180830180714.36167-8-alexander.levin@microsoft.com> (raw)
In-Reply-To: <20180830180714.36167-1-alexander.levin@microsoft.com>
From: Jianchao Wang <jianchao.w.wang@oracle.com>
[ Upstream commit d263ed9926823c462f99a7679e18f0c9e5b8550d ]
Currently, we count the hctx as active after allocate driver tag
successfully. If a previously inactive hctx try to get tag first
time, it may fails and need to wait. However, due to the stale tag
->active_queues, the other shared-tags users are still able to
occupy all driver tags while there is someone waiting for tag.
Consequently, even if the previously inactive hctx is waked up, it
still may not be able to get a tag and could be starved.
To fix it, we count the hctx as active before try to allocate driver
tag, then when it is waiting the tag, the other shared-tag users
will reserve budget for it.
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jianchao Wang <jianchao.w.wang@oracle.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
---
block/blk-mq-tag.c | 3 +++
block/blk-mq.c | 8 ++++++--
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c
index 3de0836163c2..d5f2c21d8531 100644
--- a/block/blk-mq-tag.c
+++ b/block/blk-mq-tag.c
@@ -23,6 +23,9 @@ bool blk_mq_has_free_tags(struct blk_mq_tags *tags)
/*
* If a previously inactive queue goes active, bump the active user count.
+ * We need to do this before try to allocate driver tag, then even if fail
+ * to get tag when first time, the other shared-tag users could reserve
+ * budget for it.
*/
bool __blk_mq_tag_busy(struct blk_mq_hw_ctx *hctx)
{
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 654b0dc7e001..2f9e14361673 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -285,7 +285,7 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data,
rq->tag = -1;
rq->internal_tag = tag;
} else {
- if (blk_mq_tag_busy(data->hctx)) {
+ if (data->hctx->flags & BLK_MQ_F_TAG_SHARED) {
rq_flags = RQF_MQ_INFLIGHT;
atomic_inc(&data->hctx->nr_active);
}
@@ -367,6 +367,8 @@ static struct request *blk_mq_get_request(struct request_queue *q,
if (!op_is_flush(op) && e->type->ops.mq.limit_depth &&
!(data->flags & BLK_MQ_REQ_RESERVED))
e->type->ops.mq.limit_depth(op, data);
+ } else {
+ blk_mq_tag_busy(data->hctx);
}
tag = blk_mq_get_tag(data);
@@ -970,6 +972,7 @@ bool blk_mq_get_driver_tag(struct request *rq, struct blk_mq_hw_ctx **hctx,
.hctx = blk_mq_map_queue(rq->q, rq->mq_ctx->cpu),
.flags = wait ? 0 : BLK_MQ_REQ_NOWAIT,
};
+ bool shared;
might_sleep_if(wait);
@@ -979,9 +982,10 @@ bool blk_mq_get_driver_tag(struct request *rq, struct blk_mq_hw_ctx **hctx,
if (blk_mq_tag_is_reserved(data.hctx->sched_tags, rq->internal_tag))
data.flags |= BLK_MQ_REQ_RESERVED;
+ shared = blk_mq_tag_busy(data.hctx);
rq->tag = blk_mq_get_tag(&data);
if (rq->tag >= 0) {
- if (blk_mq_tag_busy(data.hctx)) {
+ if (shared) {
rq->rq_flags |= RQF_MQ_INFLIGHT;
atomic_inc(&data.hctx->nr_active);
}
--
2.17.1
next prev parent reply other threads:[~2018-08-30 22:11 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-30 18:07 [PATCH AUTOSEL 4.18 067/113] powerpc: Fix size calculation using resource_size() Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 068/113] perf probe powerpc: Fix trace event post-processing Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 069/113] block: bvec_nr_vecs() returns value for wrong slab Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 070/113] brcmfmac: fix brcmf_wiphy_wowl_params() NULL pointer dereference Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 071/113] s390/dasd: fix hanging offline processing due to canceled worker Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 072/113] s390/dasd: fix panic for failed online processing Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 073/113] ACPI / scan: Initialize status to ACPI_STA_DEFAULT Sasha Levin
2018-08-30 18:07 ` Sasha Levin [this message]
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 075/113] scsi: aic94xx: fix an error code in aic94xx_init() Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 076/113] NFSv4: Fix error handling in nfs4_sp4_select_mode() Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 077/113] ALSA: hda/ca0132 - Add DSP setup defaults for Recon3D Sasha Levin
2018-08-30 20:13 ` Takashi Iwai
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 078/113] ALSA: hda/ca0132 - Add quirk ID and enum " Sasha Levin
2018-08-30 20:08 ` Takashi Iwai
2018-08-30 20:10 ` Connor McAdams
2018-08-31 16:07 ` Sasha Levin
2018-09-02 6:30 ` Takashi Iwai
2018-09-02 12:56 ` Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 079/113] ALSA: hda/ca0132 - Add alt_functions unsolicited response Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 080/113] Input: do not use WARN() in input_alloc_absinfo() Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 081/113] xen/balloon: fix balloon initialization for PVH Dom0 Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 082/113] PCI: mvebu: Fix I/O space end address calculation Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 083/113] dm kcopyd: avoid softlockup in run_complete_job Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 084/113] staging: comedi: ni_mio_common: fix subdevice flags for PFI subdevice Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 085/113] ASoC: rt5677: Fix initialization of rt5677_of_match.data Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 086/113] iommu/omap: Fix cache flushes on L2 table entries Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 087/113] selftests/powerpc: Kill child processes on SIGINT Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 088/113] selinux: cleanup dentry and inodes on error in selinuxfs Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 089/113] RDS: IB: fix 'passing zero to ERR_PTR()' warning Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 090/113] cfq: Suppress compiler warnings about comparisons Sasha Levin
2018-08-30 18:07 ` [PATCH AUTOSEL 4.18 091/113] smb3: fix reset of bytes read and written stats Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 092/113] CIFS: fix memory leak and remove dead code Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 093/113] SMB3: Number of requests sent should be displayed for SMB3 not just CIFS Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 094/113] smb3: if server does not support posix do not allow posix mount option Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 095/113] powerpc/platforms/85xx: fix t1042rdb_diu.c build errors & warning Sasha Levin
2018-08-30 18:08 ` Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 096/113] powerpc/64s: Make rfi_flush_fallback a little more robust Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 097/113] um: fix parallel building with O= option Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 098/113] powerpc/pseries: Avoid using the size greater than RTAS_ERROR_LOG_MAX Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 099/113] clk: rockchip: Add pclk_rkpwm_pmu to PMU critical clocks in rk3399 Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 100/113] drm/amd/display: Read back max backlight value at boot Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 101/113] KVM: vmx: track host_state.loaded using a loaded_vmcs pointer Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 102/113] kvm: nVMX: Fix fault vector for VMX operation at CPL > 0 Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 103/113] drm/etnaviv: fix crash in GPU suspend when init failed due to buffer placement Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 104/113] btrfs: Exit gracefully when chunk map cannot be inserted to the tree Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 105/113] btrfs: replace: Reset on-disk dev stats value after replace Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 106/113] btrfs: fix in-memory value of total_devices after seed device deletion Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 107/113] btrfs: Rewrite retry logic in do_chunk_alloc Sasha Levin
2018-09-05 9:22 ` David Sterba
2018-09-07 0:16 ` Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 108/113] btrfs: relocation: Only remove reloc rb_trees if reloc control has been initialized Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 109/113] btrfs: tree-checker: Detect invalid and empty essential trees Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 110/113] btrfs: check-integrity: Fix NULL pointer dereference for degraded mount Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 111/113] btrfs: lift uuid_mutex to callers of btrfs_open_devices Sasha Levin
2018-09-05 9:29 ` David Sterba
2018-09-07 0:17 ` Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 112/113] btrfs: Don't remove block group that still has pinned down bytes Sasha Levin
2018-08-30 18:08 ` [PATCH AUTOSEL 4.18 113/113] btrfs: Fix a C compliance issue Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180830180714.36167-8-alexander.levin@microsoft.com \
--to=alexander.levin@microsoft.com \
--cc=axboe@kernel.dk \
--cc=jianchao.w.wang@oracle.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.