UBIFS: slightly optimize write-buffer timer usage

This patch adds the following minor optimization:

1. If write-buffer does not use the timer, indicate it with the
   wbuf->no_timer variable, instead of using the wbuf->softlimit
   variable. This is better because wbuf->softlimit is of ktime_t
   type, and the ktime_to_ns function contains 64-bit multiplication.

2. Do not call the 'hrtimer_cancel()' function for write-buffers
   which do not use timers.

3. Do not cancel the timer in 'ubifs_put_super()' because the
   synchronization function does this.

This patch also removes a confusing comment.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
Artem Bityutskiy 2009-06-23 12:30:43 +03:00
parent 70aee2f153
commit 0b335b9d7d
3 changed files with 9 additions and 12 deletions

View file

@ -312,7 +312,7 @@ static void new_wbuf_timer_nolock(struct ubifs_wbuf *wbuf)
{ {
ubifs_assert(!hrtimer_active(&wbuf->timer)); ubifs_assert(!hrtimer_active(&wbuf->timer));
if (!ktime_to_ns(wbuf->softlimit)) if (wbuf->no_timer)
return; return;
dbg_io("set timer for jhead %d, %llu-%llu millisecs", wbuf->jhead, dbg_io("set timer for jhead %d, %llu-%llu millisecs", wbuf->jhead,
ktime_to_ns(wbuf->softlimit)/USEC_PER_SEC, ktime_to_ns(wbuf->softlimit)/USEC_PER_SEC,
@ -327,11 +327,8 @@ static void new_wbuf_timer_nolock(struct ubifs_wbuf *wbuf)
*/ */
static void cancel_wbuf_timer_nolock(struct ubifs_wbuf *wbuf) static void cancel_wbuf_timer_nolock(struct ubifs_wbuf *wbuf)
{ {
/* if (wbuf->no_timer)
* If the syncer is waiting for the lock (from the background thread's return;
* context) and another task is changing write-buffer then the syncing
* should be canceled.
*/
wbuf->need_sync = 0; wbuf->need_sync = 0;
hrtimer_cancel(&wbuf->timer); hrtimer_cancel(&wbuf->timer);
} }

View file

@ -797,7 +797,7 @@ static int alloc_wbufs(struct ubifs_info *c)
* does not need to be synchronized by timer. * does not need to be synchronized by timer.
*/ */
c->jheads[GCHD].wbuf.dtype = UBI_LONGTERM; c->jheads[GCHD].wbuf.dtype = UBI_LONGTERM;
c->jheads[GCHD].wbuf.softlimit = ktime_set(0, 0); c->jheads[GCHD].wbuf.no_timer = 1;
return 0; return 0;
} }
@ -1754,10 +1754,8 @@ static void ubifs_put_super(struct super_block *sb)
/* Synchronize write-buffers */ /* Synchronize write-buffers */
if (c->jheads) if (c->jheads)
for (i = 0; i < c->jhead_cnt; i++) { for (i = 0; i < c->jhead_cnt; i++)
ubifs_wbuf_sync(&c->jheads[i].wbuf); ubifs_wbuf_sync(&c->jheads[i].wbuf);
hrtimer_cancel(&c->jheads[i].wbuf.timer);
}
/* /*
* On fatal errors c->ro_media is set to 1, in which case we do * On fatal errors c->ro_media is set to 1, in which case we do

View file

@ -654,7 +654,8 @@ typedef int (*ubifs_lpt_scan_callback)(struct ubifs_info *c,
* @delta: hard and soft timeouts delta (the timer expire inteval is @softlimit * @delta: hard and soft timeouts delta (the timer expire inteval is @softlimit
* and @softlimit + @delta) * and @softlimit + @delta)
* @timer: write-buffer timer * @timer: write-buffer timer
* @need_sync: it is set if its timer expired and needs sync * @no_timer: non-zero if this write-buffer does not timer
* @need_sync: non-zero if its timer expired and needs sync
* @next_ino: points to the next position of the following inode number * @next_ino: points to the next position of the following inode number
* @inodes: stores the inode numbers of the nodes which are in wbuf * @inodes: stores the inode numbers of the nodes which are in wbuf
* *
@ -683,7 +684,8 @@ struct ubifs_wbuf {
ktime_t softlimit; ktime_t softlimit;
unsigned long long delta; unsigned long long delta;
struct hrtimer timer; struct hrtimer timer;
int need_sync; unsigned int no_timer:1;
unsigned int need_sync:1;
int next_ino; int next_ino;
ino_t *inodes; ino_t *inodes;
}; };