From: David Sterba <dsterba@suse.cz>
To: Arnd Bergmann <arnd@arndb.de>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>,
David Sterba <dsterba@suse.com>,
linux-btrfs <linux-btrfs@vger.kernel.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] btrfs: scrub: per-device bandwidth control
Date: Fri, 21 May 2021 17:16:13 +0200 [thread overview]
Message-ID: <20210521151613.GN7604@twin.jikos.cz> (raw)
In-Reply-To: <CAK8P3a3_O5CdbUqvJsnTh5p0RbSCsXyFhkO6afaLsnwf176Kiw@mail.gmail.com>
On Thu, May 20, 2021 at 03:14:03PM +0200, Arnd Bergmann wrote:
> On Thu, May 20, 2021 at 9:43 AM Geert Uytterhoeven <geert@linux-m68k.org> wrote:
> > On Tue, 18 May 2021, David Sterba wrote:
> > > + /* Start new epoch, set deadline */
> > > + now = ktime_get();
> > > + if (sctx->throttle_deadline == 0) {
> > > + sctx->throttle_deadline = ktime_add_ms(now, time_slice / div);
> >
> > ERROR: modpost: "__udivdi3" [fs/btrfs/btrfs.ko] undefined!
> >
> > div_u64(bwlimit, div)
>
> If 'time_slice' is in nanoseconds, the best interface to use
> is ktime_divns().
It's in miliseconds and the division above is int/int, the problematic
one is below.
>
> > > + sctx->throttle_sent = 0;
> > > + }
> > > +
> > > + /* Still in the time to send? */
> > > + if (ktime_before(now, sctx->throttle_deadline)) {
> > > + /* If current bio is within the limit, send it */
> > > + sctx->throttle_sent += sbio->bio->bi_iter.bi_size;
> > > + if (sctx->throttle_sent <= bwlimit / div)
> > > + return;
>
> Doesn't this also need to be changed?
>
> > > + /* We're over the limit, sleep until the rest of the slice */
> > > + delta = ktime_ms_delta(sctx->throttle_deadline, now);
> > > + } else {
> > > + /* New request after deadline, start new epoch */
> > > + delta = 0;
> > > + }
> > > +
> > > + if (delta)
> > > + schedule_timeout_interruptible(delta * HZ / 1000);
> >
> > ERROR: modpost: "__divdi3" [fs/btrfs/btrfs.ko] undefined!
> >
> > I'm a bit surprised gcc doesn't emit code for the division by the
> > constant 1000, but emits a call to __divdi3(). So this has to become
> > div_u64(), too.
>
> There is schedule_hrtimeout(), which takes a ktime_t directly
> but has slightly different behavior. There is also an msecs_to_jiffies
> helper that should produce a fast division.
I'll use msecs_to_jiffies, thanks. If 'hr' in schedule_hrtimeout stands
for high resolution, it's not necessary here.
next prev parent reply other threads:[~2021-05-21 15:19 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20210518144935.15835-1-dsterba@suse.com>
2021-05-20 7:43 ` Geert Uytterhoeven
2021-05-20 12:55 ` David Sterba
2021-05-20 13:04 ` Geert Uytterhoeven
2021-05-20 13:14 ` Arnd Bergmann
2021-05-20 13:26 ` Geert Uytterhoeven
2021-05-21 15:16 ` David Sterba [this message]
2021-05-21 15:38 ` Geert Uytterhoeven
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=20210521151613.GN7604@twin.jikos.cz \
--to=dsterba@suse.cz \
--cc=arnd@arndb.de \
--cc=dsterba@suse.com \
--cc=geert@linux-m68k.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-kernel@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®