From patchwork Mon Jun 25 19:55:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Valente X-Patchwork-Id: 139884 Delivered-To: patch@linaro.org Received: by 2002:a2e:970d:0:0:0:0:0 with SMTP id r13-v6csp4377594lji; Mon, 25 Jun 2018 12:55:59 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJbl6S/TEle/h6GtFHzILD3L8sOSxIxCafgo8NsuxlhbZVCWMjhiNaui4HXKV6RpfPpScoJ X-Received: by 2002:a62:2605:: with SMTP id m5-v6mr3790150pfm.223.1529956559327; Mon, 25 Jun 2018 12:55:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529956559; cv=none; d=google.com; s=arc-20160816; b=o9cuqDYzBqVKkxCQAxocLX1/myauUt+BjxpFbWyj9vXF4Tspc7ogDOyH4FbisS1Uih S0/ypv+UjI4tX1bC+Lxq/Qs2Gm+QwnBeXH/gVjynhrc7XhIE5u6DxtAhLbEro9dIklt+ 2OMp7hDmM05NlpM/EArH21/sn8PlADNg6wtck5jWWK1n7BVIUws00W+tdEILN5ytzRao IV3D0twq2LaQ49uDYlPkwqi8nWtF1yFkSgdnfQVHXB0VjqQWiKvNA7m/U5jCfXoHWrHH F05OkcYnYDJSt46MBvPyDWyiBTR4xGwvZzvdf507ilzCheZaDtIYVn7dkhkhTgov0Ecd jm9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=j7GMIIGaIORm8b6LjrnaeSpizBl5u4j6T5VX4NtEKP0=; b=fAKkTnKkkTa2rSlfgI5CYlk6FXcLkNRIbzhaBPETPsRCgusUdUM0/dY6U7TQ9xF4c2 aODh7sExRQUfE2F7qsE+Ut984/FzUv/7pxc1SOD89EuzMHO91aLSVR6BpmjvV01Xo5mh dcJXMOIFIeeonrVeG0ZOpY1Fyk5U+kTFY/fELy67jEozJk0Donl38d1dTujLXWOeBAd1 26O0MYqG1nL4Y4+PWTeCO2DQrPyelsVBCQnBLIrC+GEd9z3WcsPUi4sU0gNKR9WYGeW0 DkG/cH+EUObv83y+bAhaK3zY5RNTmPGlNzhzO/h/i0uoRPfzE67JDCAuNDblCIK5ov1K Txng== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=gQvYuzhK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v12-v6si14642244plo.264.2018.06.25.12.55.58; Mon, 25 Jun 2018 12:55:59 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=gQvYuzhK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965100AbeFYTz4 (ORCPT + 31 others); Mon, 25 Jun 2018 15:55:56 -0400 Received: from mail-wr0-f193.google.com ([209.85.128.193]:44122 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965042AbeFYTzx (ORCPT ); Mon, 25 Jun 2018 15:55:53 -0400 Received: by mail-wr0-f193.google.com with SMTP id p12-v6so13232642wrn.11 for ; Mon, 25 Jun 2018 12:55:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=j7GMIIGaIORm8b6LjrnaeSpizBl5u4j6T5VX4NtEKP0=; b=gQvYuzhKyf5+4vtV9Yb7lZ/XQ5uVesz/M1GB+b5Jdp8aqoEPm4/wzV35RD06fmYjKO ouw7xTWeDmnX/QIsWP443pkQDhBZ3IrUzXXb4btWoMYol7Q3cljstUEVHOuDtfUXUKjT d9bdCvxgF7+cOhRi5t3UjFLRMYi8ixOYw5RLg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=j7GMIIGaIORm8b6LjrnaeSpizBl5u4j6T5VX4NtEKP0=; b=JPfgJPiTywQ7o0lBE4aRHs+ehyQP4AiTjW5V7UlTXVQR/CDIbU5vIW2vor+Ho7X5Ou V+m1o+mpvZSOmt5w1+htf06At/fxrJbzw4W/1PUVo6AeluXqUMei4BEUr318ZSDBrVG/ IefV5ieBpq5ehaNAuOA2qBjfEiYsJcxUczr1rZl8Qgl8T27CY0zAjVNRUSMal2wuy3kO tk0X0Vtle1ubYfgpiNXBkSFprIFEEj8G3jzsOi1q+CIJVy4CVv1HOJg7JSE6IIX/Rbm3 khqb9zgaLabz3MBTKEBdd4AxgpZALMisN2ZR5BVhmhBQSYr1kbcezzBXorIjE+uswHA7 5JJg== X-Gm-Message-State: APt69E2SdsB6OI+3lJO5LsIMs72CJB3MW2TY1l65gBP4oKwzD+5QQ7VP mcmsb2WQbuIabrZZVhC2A6F5xw== X-Received: by 2002:adf:88e3:: with SMTP id g32-v6mr4282569wrg.62.1529956552337; Mon, 25 Jun 2018 12:55:52 -0700 (PDT) Received: from localhost.localdomain (146-241-36-97.dyn.eolo.it. [146.241.36.97]) by smtp.gmail.com with ESMTPSA id n18-v6sm29072897wrj.58.2018.06.25.12.55.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Jun 2018 12:55:51 -0700 (PDT) From: Paolo Valente To: Jens Axboe Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, ulf.hansson@linaro.org, broonie@kernel.org, linus.walleij@linaro.org, bfq-iosched@googlegroups.com, oleksandr@natalenko.name, Paolo Valente Subject: [PATCH BUGFIX RESEND 2/4] block, bfq: do not expire a queue that will deserve dispatch plugging Date: Mon, 25 Jun 2018 21:55:35 +0200 Message-Id: <20180625195537.7769-3-paolo.valente@linaro.org> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180625195537.7769-1-paolo.valente@linaro.org> References: <20180625195537.7769-1-paolo.valente@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For some bfq_queues, BFQ plugs I/O dispatching when the queue becomes idle, and keeps the plug until a new request of the queue arrives, or a timeout fires. BFQ does so either to boost throughput or to preserve service guarantees for the queue. More precisely, for such a queue, plugging starts when the queue happens to have either no request enqueued, or no request in flight, that is, no request already dispatched but not yet completed. On the opposite end, BFQ may happen to expire a queue with no request enqueued, without doing any plugging, if the queue still has some request in flight. Unfortunately, such a premature expiration causes the queue to lose its chance to enjoy dispatch plugging a moment later, i.e., when its in-flight requests finally get completed. This breaks service guarantees for the queue. This commit prevents BFQ from expiring an empty queue if the latter still has in-flight requests. Signed-off-by: Paolo Valente --- block/bfq-iosched.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) -- 2.16.1 diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c index 3f32e88c7e9b..4fd4f1996498 100644 --- a/block/bfq-iosched.c +++ b/block/bfq-iosched.c @@ -3597,8 +3597,14 @@ static struct bfq_queue *bfq_select_queue(struct bfq_data *bfqd) bfq_log_bfqq(bfqd, bfqq, "select_queue: already in-service queue"); + /* + * Do not expire bfqq for budget timeout if bfqq may be about + * to enjoy device idling. The reason why, in this case, we + * prevent bfqq from expiring is the same as in the comments + * on the case where bfq_bfqq_must_idle() returns true, in + * bfq_completed_request(). + */ if (bfq_may_expire_for_budg_timeout(bfqq) && - !bfq_bfqq_wait_request(bfqq) && !bfq_bfqq_must_idle(bfqq)) goto expire; @@ -4674,8 +4680,32 @@ static void bfq_completed_request(struct bfq_queue *bfqq, struct bfq_data *bfqd) * or if we want to idle in case it has no pending requests. */ if (bfqd->in_service_queue == bfqq) { - if (bfqq->dispatched == 0 && bfq_bfqq_must_idle(bfqq)) { - bfq_arm_slice_timer(bfqd); + if (bfq_bfqq_must_idle(bfqq)) { + if (bfqq->dispatched == 0) + bfq_arm_slice_timer(bfqd); + /* + * If we get here, we do not expire bfqq, even + * if bfqq was in budget timeout or had no + * more requests (as controlled in the next + * conditional instructions). The reason for + * not expiring bfqq is as follows. + * + * Here bfqq->dispatched > 0 holds, but + * bfq_bfqq_must_idle() returned true. This + * implies that, even if no request arrives + * for bfqq before bfqq->dispatched reaches 0, + * bfqq will, however, not be expired on the + * completion event that causes bfqq->dispatch + * to reach zero. In contrast, on this event, + * bfqq will start enjoying device idling + * (I/O-dispatch plugging). + * + * But, if we expired bfqq here, bfqq would + * not have the chance to enjoy device idling + * when bfqq->dispatched finally reaches + * zero. This would expose bfqq to violation + * of its reserved service guarantees. + */ return; } else if (bfq_may_expire_for_budg_timeout(bfqq)) bfq_bfqq_expire(bfqd, bfqq, false,