From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 733AA35F182 for ; Wed, 1 Jul 2026 23:27:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782948457; cv=none; b=jT7dqayEyoH2uz7mEphD90grx6fU8VquQONTPu1NmAGJX/SSiR6YnMaTmM2TfHZL6hessiAIDbUnMGeTwG9za9OOcGpLrrCXFIX6LwxFe/agONsTfdEeUw0L+XGpg/0dxxeuwXd4Wut32WGO7SuJ+Zz+2DJfKq5ZERx/SAeVYBg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782948457; c=relaxed/simple; bh=HqFa8t0Mu0St/c7ueD8Wr857Xx6Rk9ijgm+fvHfiV34=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=ZRclGfXOsuSCeOmevokskAQ4A9RaBcqCHbAbxGlFxP1fHo/VGAyvaHxSabmyP374R+gLrIBLZVYE/UTVDachcTDR2DWlyCAbLkC0ym/iFiW89M5hiDGkd7MHe1YmanOUyjMF7vEPs+2idv9HE9LNAgEh185dvFUpfvptKZ6YMk8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Namclkn8; arc=none smtp.client-ip=209.85.214.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Namclkn8" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2c821a50615so8468835ad.0 for ; Wed, 01 Jul 2026 16:27:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782948455; x=1783553255; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:references:cc:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=/3Kgk9bdMHQMKWT8xLRkESCb3V8jhwc8jniCVPFYClk=; b=Namclkn8tVk5w8zKiTa1BWq6+XqjNw147xchCigXAEHmLk/A2YjnVnBgSWk5x5JPcD 7oCeZsO+oivng3qlR8bpwxFRMMBlQokPtIm6P5o88VGJlEV0dHwFHxxITdAj0l5jwejY HoLVV9plSzWpjzuG35n6E2Vkx+SgWPR/UHzwrwJW2pPg09I4ROWJKf5y1JTWHac06DMs d0dlx2OdhBWeN/+JbbedvHo3FYqvHFlkWSAbr4vSt7rEJe99fmKhx8D5t6bb9CALJKA3 D/a1VrLvAaFNyhgDckCDuQMtqPWsg3ojwDDpeECfM0Tb2h8aGcaCBEvr7jhtg4zQ7m+K l9tQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782948455; x=1783553255; h=content-transfer-encoding:in-reply-to:from:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-gg:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=/3Kgk9bdMHQMKWT8xLRkESCb3V8jhwc8jniCVPFYClk=; b=j8QuJ6yreCbKS/qVKoOtYg74BiAwKlyeUKaZE5hm/SsOuwY/Sm9W+wjEO4EPuyev4a 7rGiQTcWNM70iE+SqFE+b4kv3KcvRRo3Y1jTDPteONaWTe1g74e+woTiKddV2ocWag/o 1Xm2Wu5lESOj5PNkAaDQwnJIvJHadl0EmodPimXHlQv3OcsWVDiMFsmfR4f7HjZDGQJB HO7TVBtiT3V9mxpJF5SlV5S2xfCKDNfQ1SV5hQSHGYIuj75lYBrANDAzLDuhjc9te/e0 sqau741eb9YDMGJkpdd9iXj2M7/P3zIshi14ISYxRm3MJ0jXpJiBZtLS70HpmXMREsf9 CLjA== X-Forwarded-Encrypted: i=1; AHgh+RrABLReXIJNhMYwUhqq6cGaUi1cT9kC0/iLdHaY8XVoUaF67zyrXtlKvXd+7Vj4rTaUbqdNjTp1qHYqeLQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzCxFJU+vHv4NhO01fw02Lg0YgWQrXHyi/uwubjWfICYNtHqmsA BPJJRC+baW0psugmPaMuWYVAMNe9QzaLPwfA3JDgrADEOU7db/dGj/0m X-Gm-Gg: AfdE7ckdFsyXQCyLkK/ENfBFfELk2DbjCHfup7IHsY/qZMOXUyTjb/zZ78iv0dljOdK KiWo2NfLmnk378FhxRqCijBg1XaoEOh1sEF+wEZrirMqS0ROayU9Sx5R2SWVrEHjPz/bX4bZ93i jQRqVnfH1Wu+/1BL/tiNzMBoSWteR0vn6TUlcTTlBKw1kuzqRrCyFspysaU/eI2n+2OuhzfP69h GQBDU1DTWvRdhqFtXoVbhRjeTajmFjzC9XTjRgAsIpOgCGhSzYNRHnSXgYpA1xDdnffGa+/yunl sUe5BPpLHRQ0vy1/RTRCWNGO691NNFa/c4XbJgYefwveGIkVqvYgF4lhcEE+U30Tyochh38G+Bj rx11i6dRcDyzMOGu6zNwtdGGAgT4acyAqJ/5b68n64kEWp8wVLZdAY/j3BYmPEw0kSGXhIiGHAa SYPjp7zBJrWniSG6b5ueFndsJZm9f5wKA= X-Received: by 2002:a17:902:f650:b0:2ca:6c8:abd4 with SMTP id d9443c01a7336-2ca911f336cmr27682945ad.34.1782948454275; Wed, 01 Jul 2026 16:27:34 -0700 (PDT) Received: from [10.0.97.160] ([61.213.176.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ca9a9e9792sm4794115ad.58.2026.07.01.16.27.32 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 01 Jul 2026 16:27:33 -0700 (PDT) Message-ID: <980612c3-ca06-423c-88af-e69d00e770f9@gmail.com> Date: Thu, 2 Jul 2026 07:27:31 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] block: Make WBT latency writes honor enable state To: Jens Axboe Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org References: <20260621014030.1625306-1-guzebing1612@gmail.com> From: guzebing In-Reply-To: <20260621014030.1625306-1-guzebing1612@gmail.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Gentle ping. This patch addresses a case where writing the current default WBT latency to queue/wbt_lat_usec returns success but does not enable WBT when WBT was disabled by default, for example after selecting BFQ. If this is intended behavior, then perhaps no fix is needed. Please let me know if I missed the intended semantics here. Thanks, Guzebing On 6/21/26 9:40 AM, guzebing wrote: > From: Guzebing > > queue/wbt_lat_usec controls both the stored WBT latency target and the > effective WBT enable state. > > The old no-op check skipped updates whenever the converted latency > matched the stored min_lat_nsec. That check ignored whether the current > WBT state already matched the state requested by the write. For a queue > disabled by default, attempting to enable WBT by writing the default > value through sysfs could return success while the enable state was left > unchanged. > > Treat a write as a no-op only when both the stored latency and the > effective WBT enabled state already match the converted value. > > Signed-off-by: Guzebing > --- > Background: > > The issue can be reproduced on an NVMe namespace when BFQ is available: > > echo bfq > /sys/block/nvme0n1/queue/scheduler > cat /sys/block/nvme0n1/queue/wbt_lat_usec > echo 2000 > /sys/block/nvme0n1/queue/wbt_lat_usec > cat /sys/block/nvme0n1/queue/wbt_lat_usec > > After BFQ selects the queue, WBT is disabled by default. On a > non-rotational NVMe namespace the stored default latency remains > 2000000 nsec, while the sysfs file reports 0 because the effective WBT > state is disabled: > > queue/wbt_lat_usec = 0 > debugfs enabled = 3 > debugfs min_lat_nsec = 2000000 > > Writing the default value succeeds, but the old no-op check skips the > state transition because min_lat_nsec already matches the converted > value: > > echo 2000 > /sys/block/nvme0n1/queue/wbt_lat_usec > # echo returns success, but: > queue/wbt_lat_usec = 0 > debugfs enabled = 3 > debugfs min_lat_nsec = 2000000 > > As a control, writing a non-default value first does work: > > echo 5000 > /sys/block/nvme0n1/queue/wbt_lat_usec > queue/wbt_lat_usec = 5000 > debugfs enabled = 2 > debugfs min_lat_nsec = 5000000 > > Writing the default value after that also works, because the stored > latency changes from 5000000 nsec back to 2000000 nsec: > > echo 2000 > /sys/block/nvme0n1/queue/wbt_lat_usec > queue/wbt_lat_usec = 2000 > debugfs enabled = 2 > debugfs min_lat_nsec = 2000000 > > With this patch, writing the default value after BFQ default-disables > WBT also re-enables WBT as expected: > > queue/wbt_lat_usec = 2000 > debugfs enabled = 2 > debugfs min_lat_nsec = 2000000 > > block/blk-wbt.c | 21 ++++++++++++++++++++- > 1 file changed, 20 insertions(+), 1 deletion(-) > > diff --git a/block/blk-wbt.c b/block/blk-wbt.c > index dcc2438ca16dc..953d400fd0137 100644 > --- a/block/blk-wbt.c > +++ b/block/blk-wbt.c > @@ -813,6 +813,21 @@ static void wbt_queue_depth_changed(struct rq_qos *rqos) > wbt_update_limits(RQWB(rqos)); > } > > +static bool wbt_set_lat_changed(struct request_queue *q, u64 val) > +{ > + struct rq_qos *rqos = wbt_rq_qos(q); > + struct rq_wb *rwb; > + > + if (!rqos) > + return true; > + > + rwb = RQWB(rqos); > + if (rwb->min_lat_nsec != val) > + return true; > + > + return rwb_enabled(rwb) != !!val; > +} > + > static void wbt_exit(struct rq_qos *rqos) > { > struct rq_wb *rwb = RQWB(rqos); > @@ -1005,8 +1020,12 @@ int wbt_set_lat(struct gendisk *disk, s64 val) > else if (val >= 0) > val *= 1000ULL; > > - if (wbt_get_min_lat(q) == val) > + mutex_lock(&disk->rqos_state_mutex); > + if (!wbt_set_lat_changed(q, val)) { > + mutex_unlock(&disk->rqos_state_mutex); > goto out; > + } > + mutex_unlock(&disk->rqos_state_mutex); > > blk_mq_quiesce_queue(q); >