aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2009-06-23 05:30:43 -0400
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2009-07-05 11:45:16 -0400
commit0b335b9d7d5f0b832e90ac469480789c07be80ad (patch)
tree5001522f18092e1cafb538a74eedae3087c17145
parent70aee2f153972f70fad5f7025134fec063f9efbe (diff)
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>
-rw-r--r--fs/ubifs/io.c9
-rw-r--r--fs/ubifs/super.c6
-rw-r--r--fs/ubifs/ubifs.h6
3 files changed, 9 insertions, 12 deletions
diff --git a/fs/ubifs/io.c b/fs/ubifs/io.c
index 2ef689a9a363..9fcf6c38c1bc 100644
--- a/fs/ubifs/io.c
+++ b/fs/ubifs/io.c
@@ -312,7 +312,7 @@ static void new_wbuf_timer_nolock(struct ubifs_wbuf *wbuf)
312{ 312{
313 ubifs_assert(!hrtimer_active(&wbuf->timer)); 313 ubifs_assert(!hrtimer_active(&wbuf->timer));
314 314
315 if (!ktime_to_ns(wbuf->softlimit)) 315 if (wbuf->no_timer)
316 return; 316 return;
317 dbg_io("set timer for jhead %d, %llu-%llu millisecs", wbuf->jhead, 317 dbg_io("set timer for jhead %d, %llu-%llu millisecs", wbuf->jhead,
318 ktime_to_ns(wbuf->softlimit)/USEC_PER_SEC, 318 ktime_to_ns(wbuf->softlimit)/USEC_PER_SEC,
@@ -327,11 +327,8 @@ static void new_wbuf_timer_nolock(struct ubifs_wbuf *wbuf)
327 */ 327 */
328static void cancel_wbuf_timer_nolock(struct ubifs_wbuf *wbuf) 328static void cancel_wbuf_timer_nolock(struct ubifs_wbuf *wbuf)
329{ 329{
330 /* 330 if (wbuf->no_timer)
331 * If the syncer is waiting for the lock (from the background thread's 331 return;
332 * context) and another task is changing write-buffer then the syncing
333 * should be canceled.
334 */
335 wbuf->need_sync = 0; 332 wbuf->need_sync = 0;
336 hrtimer_cancel(&wbuf->timer); 333 hrtimer_cancel(&wbuf->timer);
337} 334}
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
index 79fad43f3c57..5bb272c56a9b 100644
--- a/fs/ubifs/super.c
+++ b/fs/ubifs/super.c
@@ -797,7 +797,7 @@ static int alloc_wbufs(struct ubifs_info *c)
797 * does not need to be synchronized by timer. 797 * does not need to be synchronized by timer.
798 */ 798 */
799 c->jheads[GCHD].wbuf.dtype = UBI_LONGTERM; 799 c->jheads[GCHD].wbuf.dtype = UBI_LONGTERM;
800 c->jheads[GCHD].wbuf.softlimit = ktime_set(0, 0); 800 c->jheads[GCHD].wbuf.no_timer = 1;
801 801
802 return 0; 802 return 0;
803} 803}
@@ -1754,10 +1754,8 @@ static void ubifs_put_super(struct super_block *sb)
1754 1754
1755 /* Synchronize write-buffers */ 1755 /* Synchronize write-buffers */
1756 if (c->jheads) 1756 if (c->jheads)
1757 for (i = 0; i < c->jhead_cnt; i++) { 1757 for (i = 0; i < c->jhead_cnt; i++)
1758 ubifs_wbuf_sync(&c->jheads[i].wbuf); 1758 ubifs_wbuf_sync(&c->jheads[i].wbuf);
1759 hrtimer_cancel(&c->jheads[i].wbuf.timer);
1760 }
1761 1759
1762 /* 1760 /*
1763 * On fatal errors c->ro_media is set to 1, in which case we do 1761 * On fatal errors c->ro_media is set to 1, in which case we do
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h
index 1bf01d820066..97bc9d09d54b 100644
--- a/fs/ubifs/ubifs.h
+++ b/fs/ubifs/ubifs.h
@@ -654,7 +654,8 @@ typedef int (*ubifs_lpt_scan_callback)(struct ubifs_info *c,
654 * @delta: hard and soft timeouts delta (the timer expire inteval is @softlimit 654 * @delta: hard and soft timeouts delta (the timer expire inteval is @softlimit
655 * and @softlimit + @delta) 655 * and @softlimit + @delta)
656 * @timer: write-buffer timer 656 * @timer: write-buffer timer
657 * @need_sync: it is set if its timer expired and needs sync 657 * @no_timer: non-zero if this write-buffer does not timer
658 * @need_sync: non-zero if its timer expired and needs sync
658 * @next_ino: points to the next position of the following inode number 659 * @next_ino: points to the next position of the following inode number
659 * @inodes: stores the inode numbers of the nodes which are in wbuf 660 * @inodes: stores the inode numbers of the nodes which are in wbuf
660 * 661 *
@@ -683,7 +684,8 @@ struct ubifs_wbuf {
683 ktime_t softlimit; 684 ktime_t softlimit;
684 unsigned long long delta; 685 unsigned long long delta;
685 struct hrtimer timer; 686 struct hrtimer timer;
686 int need_sync; 687 unsigned int no_timer:1;
688 unsigned int need_sync:1;
687 int next_ino; 689 int next_ino;
688 ino_t *inodes; 690 ino_t *inodes;
689}; 691};