linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] ext4: a couple writeback path fixes
@ 2010-08-31 13:56 Eric Sandeen
  2010-08-31 13:59 ` PATCH 1/2] ext4: stop looping in ext4_num_dirty_pages when max_pages reached Eric Sandeen
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Eric Sandeen @ 2010-08-31 13:56 UTC (permalink / raw)
  To: ext4 development

I've found a couple small problems in the ext4_da_writepages path;

1) ext4_num_dirty_pages() can continue looping after max_pages is reached
   - this leads to wasted cpu cycles during writeback

2) bumping nr_to_write can wrap if we started with LONG_MAX
   - Not sure of all ramifications, but nr_to_write = -8 can't be good

-Eric

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

* PATCH 1/2] ext4: stop looping in ext4_num_dirty_pages when max_pages reached
  2010-08-31 13:56 [PATCH 0/2] ext4: a couple writeback path fixes Eric Sandeen
@ 2010-08-31 13:59 ` Eric Sandeen
  2010-08-31 14:04 ` [PATCH 2/2] ext4: don't bump nr_to_write if LONG_MAX Eric Sandeen
  2010-09-03 22:11 ` [PATCH 0/2] ext4: a couple writeback path fixes Eric Sandeen
  2 siblings, 0 replies; 6+ messages in thread
From: Eric Sandeen @ 2010-08-31 13:59 UTC (permalink / raw)
  To: ext4 development

Today we simply break out of the inner loop when we have accumulated
max_pages; this keeps scanning forwad and doing pagevec_lookup_tag()
in the while (!done) loop, this does potentially a lot of work
with no net effect.

When we have accumulated max_pages, just clean up and return.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 4b8debe..93497f6 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1207,8 +1207,10 @@ static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx,
 				break;
 			idx++;
 			num++;
-			if (num >= max_pages)
-				break;
+			if (num >= max_pages) {
+				pagevec_release(&pvec);
+				return num;
+			}
 		}
 		pagevec_release(&pvec);
 	}



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

* [PATCH 2/2] ext4: don't bump nr_to_write if LONG_MAX
  2010-08-31 13:56 [PATCH 0/2] ext4: a couple writeback path fixes Eric Sandeen
  2010-08-31 13:59 ` PATCH 1/2] ext4: stop looping in ext4_num_dirty_pages when max_pages reached Eric Sandeen
@ 2010-08-31 14:04 ` Eric Sandeen
  2010-08-31 14:20   ` [PATCH 2/2 V2] " Eric Sandeen
  2010-09-03 22:11 ` [PATCH 0/2] ext4: a couple writeback path fixes Eric Sandeen
  2 siblings, 1 reply; 6+ messages in thread
From: Eric Sandeen @ 2010-08-31 14:04 UTC (permalink / raw)
  To: ext4 development

In some cases we can reach ext4_da_writepages with
wbc->nr_to_write == LONG_MAX, !range_cyclic, and range_whole=1;
in this case we will try to bump it up by a factor of 8, which
leads to a nr_to_write value of -8.

I think we still get through the logic without changing
wbc->nr_to_write because the other tests which would change
it don't trip, but it seems dangerous to overflow 
desired_nr_to_write in the interim, it's not obvious.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 93497f6..2e72a4a 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -3004,9 +3004,11 @@ static int ext4_da_writepages(struct address_space *mapping,
 	 * sbi->max_writeback_mb_bump whichever is smaller.
 	 */
 	max_pages = sbi->s_max_writeback_mb_bump << (20 - PAGE_CACHE_SHIFT);
-	if (!range_cyclic && range_whole)
-		desired_nr_to_write = wbc->nr_to_write * 8;
-	else
+	if (!range_cyclic && range_whole) {
+		desired_nr_to_write = wbc->nr_to_write;
+		if (desired_nr_to_write != LONG_MAX)
+			desired_nr_to_write *= 8;
+	} else
 		desired_nr_to_write = ext4_num_dirty_pages(inode, index,
 							   max_pages);
 	if (desired_nr_to_write > max_pages)



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

* [PATCH 2/2 V2] ext4: don't bump nr_to_write if LONG_MAX
  2010-08-31 14:04 ` [PATCH 2/2] ext4: don't bump nr_to_write if LONG_MAX Eric Sandeen
@ 2010-08-31 14:20   ` Eric Sandeen
  2010-09-03 21:37     ` Eric Sandeen
  0 siblings, 1 reply; 6+ messages in thread
From: Eric Sandeen @ 2010-08-31 14:20 UTC (permalink / raw)
  To: ext4 development

In some cases we can reach ext4_da_writepages() with
wbc->nr_to_write == LONG_MAX, !range_cyclic, and range_whole=1;
in this case we will try to bump it up by a factor of 8, which
leads to a desired_nr_to_write value of -8.

We still get through the logic without actually changing
wbc->nr_to_write because the other tests which would change
it don't trip due to the negative value, but it seems dangerous
to overflow  desired_nr_to_write in the interim, it's not an 
obvious situation.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

(V2 minor commit message edits)

diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 93497f6..2e72a4a 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -3004,9 +3004,11 @@ static int ext4_da_writepages(struct address_space *mapping,
 	 * sbi->max_writeback_mb_bump whichever is smaller.
 	 */
 	max_pages = sbi->s_max_writeback_mb_bump << (20 - PAGE_CACHE_SHIFT);
-	if (!range_cyclic && range_whole)
-		desired_nr_to_write = wbc->nr_to_write * 8;
-	else
+	if (!range_cyclic && range_whole) {
+		desired_nr_to_write = wbc->nr_to_write;
+		if (desired_nr_to_write != LONG_MAX)
+			desired_nr_to_write *= 8;
+	} else
 		desired_nr_to_write = ext4_num_dirty_pages(inode, index,
 							   max_pages);
 	if (desired_nr_to_write > max_pages)


--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


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

* Re: [PATCH 2/2 V2] ext4: don't bump nr_to_write if LONG_MAX
  2010-08-31 14:20   ` [PATCH 2/2 V2] " Eric Sandeen
@ 2010-09-03 21:37     ` Eric Sandeen
  0 siblings, 0 replies; 6+ messages in thread
From: Eric Sandeen @ 2010-09-03 21:37 UTC (permalink / raw)
  To: ext4 development

Eric Sandeen wrote:
> In some cases we can reach ext4_da_writepages() with
> wbc->nr_to_write == LONG_MAX, !range_cyclic, and range_whole=1;
> in this case we will try to bump it up by a factor of 8, which
> leads to a desired_nr_to_write value of -8.

Sorry Ted, hold off on this, it should have been LLONG_MAX of course,
and I'm still looking for one other bit of brokennes I see.

The 1/2 patch should be good though.

-Eric

> We still get through the logic without actually changing
> wbc->nr_to_write because the other tests which would change
> it don't trip due to the negative value, but it seems dangerous
> to overflow  desired_nr_to_write in the interim, it's not an 
> obvious situation.
> 
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
> 
> (V2 minor commit message edits)
> 
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index 93497f6..2e72a4a 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -3004,9 +3004,11 @@ static int ext4_da_writepages(struct address_space *mapping,
>  	 * sbi->max_writeback_mb_bump whichever is smaller.
>  	 */
>  	max_pages = sbi->s_max_writeback_mb_bump << (20 - PAGE_CACHE_SHIFT);
> -	if (!range_cyclic && range_whole)
> -		desired_nr_to_write = wbc->nr_to_write * 8;
> -	else
> +	if (!range_cyclic && range_whole) {
> +		desired_nr_to_write = wbc->nr_to_write;
> +		if (desired_nr_to_write != LONG_MAX)
> +			desired_nr_to_write *= 8;
> +	} else
>  		desired_nr_to_write = ext4_num_dirty_pages(inode, index,
>  							   max_pages);
>  	if (desired_nr_to_write > max_pages)
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


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

* Re: [PATCH 0/2] ext4: a couple writeback path fixes
  2010-08-31 13:56 [PATCH 0/2] ext4: a couple writeback path fixes Eric Sandeen
  2010-08-31 13:59 ` PATCH 1/2] ext4: stop looping in ext4_num_dirty_pages when max_pages reached Eric Sandeen
  2010-08-31 14:04 ` [PATCH 2/2] ext4: don't bump nr_to_write if LONG_MAX Eric Sandeen
@ 2010-09-03 22:11 ` Eric Sandeen
  2 siblings, 0 replies; 6+ messages in thread
From: Eric Sandeen @ 2010-09-03 22:11 UTC (permalink / raw)
  To: ext4 development

Eric Sandeen wrote:
> I've found a couple small problems in the ext4_da_writepages path;
> 
> 1) ext4_num_dirty_pages() can continue looping after max_pages is reached
>    - this leads to wasted cpu cycles during writeback
> 
> 2) bumping nr_to_write can wrap if we started with LONG_MAX
>    - Not sure of all ramifications, but nr_to_write = -8 can't be good
> 
> -Eric

sigh just nak this whole thing for now, too many errors.

Will resubmit after more careful reading, patching, and testing.

Sorry for the noise.

-Eric

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

end of thread, other threads:[~2010-09-03 22:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-08-31 13:56 [PATCH 0/2] ext4: a couple writeback path fixes Eric Sandeen
2010-08-31 13:59 ` PATCH 1/2] ext4: stop looping in ext4_num_dirty_pages when max_pages reached Eric Sandeen
2010-08-31 14:04 ` [PATCH 2/2] ext4: don't bump nr_to_write if LONG_MAX Eric Sandeen
2010-08-31 14:20   ` [PATCH 2/2 V2] " Eric Sandeen
2010-09-03 21:37     ` Eric Sandeen
2010-09-03 22:11 ` [PATCH 0/2] ext4: a couple writeback path fixes Eric Sandeen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).