All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH block-5.18] iocost: don't reset the inuse weight of under-weighted debtors
@ 2022-04-27  5:01 Tejun Heo
  2022-04-27 14:41 ` Jens Axboe
  0 siblings, 1 reply; 2+ messages in thread
From: Tejun Heo @ 2022-04-27  5:01 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block, linux-kernel, kernel-team, Rik van Riel

When an iocg is in debt, its inuse weight is owned by debt handling and
should stay at 1. This invariant was broken when determining the amount of
surpluses at the beginning of donation calculation - when an iocg's
hierarchical weight is too low, the iocg is excluded from donation
calculation and its inuse is reset to its active regardless of its
indebtedness, triggering warnings like the following:

 WARNING: CPU: 5 PID: 0 at block/blk-iocost.c:1416 iocg_kick_waitq+0x392/0x3a0
 ...
 RIP: 0010:iocg_kick_waitq+0x392/0x3a0
 Code: 00 00 be ff ff ff ff 48 89 4d a8 e8 98 b2 70 00 48 8b 4d a8 85 c0 0f 85 4a fe ff ff 0f 0b e9 43 fe ff ff 0f 0b e9 4d fe ff ff <0f> 0b e9 50 fe ff ff e8 a2 ae 70 00 66 90 0f 1f 44 00 00 55 48 89
 RSP: 0018:ffffc90000200d08 EFLAGS: 00010016
 ...
  <IRQ>
  ioc_timer_fn+0x2e0/0x1470
  call_timer_fn+0xa1/0x2c0
 ...

As this happens only when an iocg's hierarchical weight is negligible, its
impact likely is limited to triggering the warnings. Fix it by skipping
resetting inuse of under-weighted debtors.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Rik van Riel <riel@surriel.com>
Fixes: c421a3eb2e27 ("blk-iocost: revamp debt handling")
Cc: stable@vger.kernel.org # v5.10+
---
 block/blk-iocost.c |   12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/block/blk-iocost.c b/block/blk-iocost.c
index 70a0a3d680a35..9bd670999d0af 100644
--- a/block/blk-iocost.c
+++ b/block/blk-iocost.c
@@ -2322,7 +2322,17 @@ static void ioc_timer_fn(struct timer_list *timer)
 				iocg->hweight_donating = hwa;
 				iocg->hweight_after_donation = new_hwi;
 				list_add(&iocg->surplus_list, &surpluses);
-			} else {
+			} else if (!iocg->abs_vdebt) {
+				/*
+				 * @iocg doesn't have enough to donate. Reset
+				 * its inuse to active.
+				 *
+				 * Don't reset debtors as their inuse's are
+				 * owned by debt handling. This shouldn't affect
+				 * donation calculuation in any meaningful way
+				 * as @iocg doesn't have a meaningful amount of
+				 * share anyway.
+				 */
 				TRACE_IOCG_PATH(inuse_shortage, iocg, &now,
 						iocg->inuse, iocg->active,
 						iocg->hweight_inuse, new_hwi);

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH block-5.18] iocost: don't reset the inuse weight of under-weighted debtors
  2022-04-27  5:01 [PATCH block-5.18] iocost: don't reset the inuse weight of under-weighted debtors Tejun Heo
@ 2022-04-27 14:41 ` Jens Axboe
  0 siblings, 0 replies; 2+ messages in thread
From: Jens Axboe @ 2022-04-27 14:41 UTC (permalink / raw)
  To: tj; +Cc: riel, linux-kernel, kernel-team, linux-block

On Tue, 26 Apr 2022 19:01:01 -1000, Tejun Heo wrote:
> When an iocg is in debt, its inuse weight is owned by debt handling and
> should stay at 1. This invariant was broken when determining the amount of
> surpluses at the beginning of donation calculation - when an iocg's
> hierarchical weight is too low, the iocg is excluded from donation
> calculation and its inuse is reset to its active regardless of its
> indebtedness, triggering warnings like the following:
> 
> [...]

Applied, thanks!

[1/1] iocost: don't reset the inuse weight of under-weighted debtors
      commit: 8c936f9ea11ec4e35e288810a7503b5c841a355f

Best regards,
-- 
Jens Axboe



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-04-27 14:41 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-27  5:01 [PATCH block-5.18] iocost: don't reset the inuse weight of under-weighted debtors Tejun Heo
2022-04-27 14:41 ` Jens Axboe

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.