diff mbox

[RFC] jffs2: use cond_resched() instead of yield()

Message ID 1283357021-16187-1-git-send-email-w.sang@pengutronix.de
State RFC
Headers show

Commit Message

Wolfram Sang Sept. 1, 2010, 4:03 p.m. UTC
yield() has different semantics meanwhile and even causes RT-kernels to
BUG. Replace the only appearance left in jffs2.

Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Cc: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Cc: Ingo Molnar <mingo@elte.hu>
---

The aforementioned BUG() showed up in one of our customer's RT-projects. While
this could be handled by rearranging his thread-priorities, I wondered if such
a patch would be worthwhile, still. Reading through the material covering
yield() and related replacements, I believe this patch should be appropriate.
Please say if I missed some side-effects.

 fs/jffs2/erase.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

Comments

Artem Bityutskiy Sept. 1, 2010, 6:35 p.m. UTC | #1
This 'yield()' was introduced by dwmw2, so he may have strong feelings
about it. CCed.

On Wed, 2010-09-01 at 18:03 +0200, Wolfram Sang wrote:
> yield() has different semantics meanwhile and even causes RT-kernels to
> BUG. Replace the only appearance left in jffs2.
> 
> Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> Cc: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
> Cc: Ingo Molnar <mingo@elte.hu>
> ---
> 
> The aforementioned BUG() showed up in one of our customer's RT-projects. While
> this could be handled by rearranging his thread-priorities, I wondered if such
> a patch would be worthwhile, still. Reading through the material covering
> yield() and related replacements, I believe this patch should be appropriate.
> Please say if I missed some side-effects.
> 
>  fs/jffs2/erase.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c
> index abac961..e513f19 100644
> --- a/fs/jffs2/erase.c
> +++ b/fs/jffs2/erase.c
> @@ -151,7 +151,7 @@ int jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count)
>  		}
>  
>  		/* Be nice */
> -		yield();
> +		cond_resched();
>  		mutex_lock(&c->erase_free_sem);
>  		spin_lock(&c->erase_completion_lock);
>  	}
Joakim Tjernlund Sept. 2, 2010, 7:01 a.m. UTC | #2
>

> This 'yield()' was introduced by dwmw2, so he may have strong feelings

> about it. CCed.


Actually, it was introduced by me with commit fd5324909e410a3202c1b01bd507c2dfba58fca5 :

[JFFS2] Fix hanging close for /dev/mtd character device.

    When pdflush is erasing lots of sectors, drivers calling
    mtd->sync will hang until all blocks are erased. Be nicer.

    Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>

    Signed-off-by: David Woodhouse <dwmw2@infradead.org>



@@ -142,7 +142,7 @@ void jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count)
 		}

 		/* Be nice */
-		cond_resched();
+		yield();
 		spin_lock(&c->erase_completion_lock);
 	}

At the time cond_resched() was a problem but now I don't know. The erasing
has moved to the GC thread and been somewhat reworked. I don't know if
it still needs yield(). Perhaps David can tell?

    Jocke
>

> On Wed, 2010-09-01 at 18:03 +0200, Wolfram Sang wrote:

> > yield() has different semantics meanwhile and even causes RT-kernels to

> > BUG. Replace the only appearance left in jffs2.

> >

> > Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>

> > Cc: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>

> > Cc: Ingo Molnar <mingo@elte.hu>

> > ---

> >

> > The aforementioned BUG() showed up in one of our customer's RT-projects. While

> > this could be handled by rearranging his thread-priorities, I wondered if such

> > a patch would be worthwhile, still. Reading through the material covering

> > yield() and related replacements, I believe this patch should be appropriate.

> > Please say if I missed some side-effects.

> >

> >  fs/jffs2/erase.c |    2 +-

> >  1 files changed, 1 insertions(+), 1 deletions(-)

> >

> > diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c

> > index abac961..e513f19 100644

> > --- a/fs/jffs2/erase.c

> > +++ b/fs/jffs2/erase.c

> > @@ -151,7 +151,7 @@ int jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count)

> >        }

> >

> >        /* Be nice */

> > -      yield();

> > +      cond_resched();

> >        mutex_lock(&c->erase_free_sem);

> >        spin_lock(&c->erase_completion_lock);

> >     }

>

> --

> Best Regards,

> Artem Bityutskiy (Битюцкий Артём)

>

>

> ______________________________________________________

> Linux MTD discussion mailing list

> http://lists.infradead.org/mailman/listinfo/linux-mtd/
Artem Bityutskiy Sept. 2, 2010, 10:59 a.m. UTC | #3
On Thu, 2010-09-02 at 09:01 +0200, Joakim Tjernlund wrote:
> At the time cond_resched() was a problem but now I don't know. The erasing
> has moved to the GC thread and been somewhat reworked. I don't know if
> it still needs yield(). Perhaps David can tell?

I think 'yield()' is rather a hack than a real solution.
Joakim Tjernlund Sept. 2, 2010, 1:52 p.m. UTC | #4
Artem Bityutskiy <dedekind1@gmail.com> wrote on 2010/09/02 12:59:09:
>
> On Thu, 2010-09-02 at 09:01 +0200, Joakim Tjernlund wrote:
> > At the time cond_resched() was a problem but now I don't know. The erasing
> > has moved to the GC thread and been somewhat reworked. I don't know if
> > it still needs yield(). Perhaps David can tell?
>
> I think 'yield()' is rather a hack than a real solution.

Yes, the real fix is to move erasing to GC and that has been done now.
There is a good chance yield() can be removed without regression
but I am not sure nor do I have the time to test that.

 Jocke
Artem Bityutskiy Sept. 20, 2010, 1 p.m. UTC | #5
On Wed, 2010-09-01 at 18:03 +0200, Wolfram Sang wrote:
> yield() has different semantics meanwhile and even causes RT-kernels to
> BUG. Replace the only appearance left in jffs2.
> 
> Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> Cc: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
> Cc: Ingo Molnar <mingo@elte.hu>

FYI, I've pushed this patch to my l2-mtd-2.6.git tree, thanks.
diff mbox

Patch

diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c
index abac961..e513f19 100644
--- a/fs/jffs2/erase.c
+++ b/fs/jffs2/erase.c
@@ -151,7 +151,7 @@  int jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count)
 		}
 
 		/* Be nice */
-		yield();
+		cond_resched();
 		mutex_lock(&c->erase_free_sem);
 		spin_lock(&c->erase_completion_lock);
 	}