linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [BUG][PPC32] Preemption patch for 2.4 Kernels
@ 2004-10-07 13:29 Gerhard Jaeger
  2004-10-07 17:34 ` Eugene Surovegin
  0 siblings, 1 reply; 4+ messages in thread
From: Gerhard Jaeger @ 2004-10-07 13:29 UTC (permalink / raw)
  To: linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 1774 bytes --]

Hi Robert,

maybe the 2.4 series is somewhat outdatet, but nevertheless used in
several embedded systems and also with your preemption patches.
During some investigations, we found out that the patches found on 
http://www.kernel.org/pub/linux/kernel/people/rml/preempt-kernel/
contain a severe bug, when using the patches on PPC systems. 
The affected function is get_pgd_fast() which is buried in
include/asm-ppc/pgalloc.h

While the original function looks like:
extern __inline__ pgd_t *get_pgd_fast(void)
{
        unsigned long *ret;

        if ((ret = pgd_quicklist) != NULL) {
                pgd_quicklist = (unsigned long *)(*ret);
                ret[0] = 0;
                pgtable_cache_size--;
        } else
                ret = (unsigned long *)get_pgd_slow();
        return (pgd_t *)ret;
}

the patched one is:
extern __inline__ pgd_t *get_pgd_fast(void)
{
        unsigned long *ret;

        preempt_disable();
        if ((ret = pgd_quicklist) != NULL) {
                pgd_quicklist = (unsigned long *)(*ret);
                ret[0] = 0;
                pgtable_cache_size--;
                preempt_enable();
        } else 
                preempt_enable();
                ret = (unsigned long *)get_pgd_slow();
        return (pgd_t *)ret;
}

And exactly the "else" path causes the problems ;) I guess it should be

       } else {
                preempt_enable();
                ret = (unsigned long *)get_pgd_slow();
       }

The attached patch will do it the right way, and you might want to correct
the patches on your web-space.

Best regards,
  Gerhard Jaeger

-- 
Gerhard Jaeger <gjaeger@sysgo.com>            
SYSGO AG                      Embedded and Real-Time Software
www.sysgo.com | www.elinos.com | www.osek.de | www.imerva.com

[-- Attachment #2: pgalloc.h.diff --]
[-- Type: text/x-diff, Size: 1474 bytes --]

--- pgalloc.h.orig	2003-11-28 19:26:21.000000000 +0100
+++ pgalloc.h	2004-10-07 14:41:28.000000000 +0200
@@ -72,20 +72,26 @@ extern __inline__ pgd_t *get_pgd_fast(vo
 {
         unsigned long *ret;
 
+	preempt_disable();
         if ((ret = pgd_quicklist) != NULL) {
                 pgd_quicklist = (unsigned long *)(*ret);
                 ret[0] = 0;
                 pgtable_cache_size--;
-        } else
+		preempt_enable();
+        } else {
+		preempt_enable();
                 ret = (unsigned long *)get_pgd_slow();
+        }
         return (pgd_t *)ret;
 }
 
 extern __inline__ void free_pgd_fast(pgd_t *pgd)
 {
+	preempt_disable();
         *(unsigned long **)pgd = pgd_quicklist;
         pgd_quicklist = (unsigned long *) pgd;
         pgtable_cache_size++;
+	preempt_enable();
 }
 
 extern __inline__ void free_pgd_slow(pgd_t *pgd)
@@ -124,19 +130,23 @@ static inline pte_t *pte_alloc_one_fast(
 {
         unsigned long *ret;
 
+	preempt_disable();
         if ((ret = pte_quicklist) != NULL) {
                 pte_quicklist = (unsigned long *)(*ret);
                 ret[0] = 0;
                 pgtable_cache_size--;
 	}
+	preempt_enable();
         return (pte_t *)ret;
 }
 
 extern __inline__ void pte_free_fast(pte_t *pte)
 {
+	preempt_disable();
         *(unsigned long **)pte = pte_quicklist;
         pte_quicklist = (unsigned long *) pte;
         pgtable_cache_size++;
+	preempt_enable();
 }
 
 extern __inline__ void pte_free_slow(pte_t *pte)

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

* Re: [BUG][PPC32] Preemption patch for 2.4 Kernels
  2004-10-07 13:29 [BUG][PPC32] Preemption patch for 2.4 Kernels Gerhard Jaeger
@ 2004-10-07 17:34 ` Eugene Surovegin
  2004-10-07 18:21   ` Jaap-Jan Boor
  0 siblings, 1 reply; 4+ messages in thread
From: Eugene Surovegin @ 2004-10-07 17:34 UTC (permalink / raw)
  To: Gerhard Jaeger; +Cc: linuxppc-dev

On Thu, Oct 07, 2004 at 03:29:12PM +0200, Gerhard Jaeger wrote:
> maybe the 2.4 series is somewhat outdatet, but nevertheless used in
> several embedded systems and also with your preemption patches.
> During some investigations, we found out that the patches found on 
> http://www.kernel.org/pub/linux/kernel/people/rml/preempt-kernel/
> contain a severe bug, when using the patches on PPC systems. 

Yes, it's a known problem with rml preempt patches - DON'T USE THEM 
on PPC. I sent him similar patch _two_ years ago - nothing happened.
MVL tree is IMHO better place to get preempt stuff for 2.4 - it's 
actually tested and works.

Also, I wish -embedded archives were online, this problem was 
discussed there around a year ago as well.

--
Eugene

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

* Re: [BUG][PPC32] Preemption patch for 2.4 Kernels
  2004-10-07 17:34 ` Eugene Surovegin
@ 2004-10-07 18:21   ` Jaap-Jan Boor
  2004-10-07 18:35     ` Eugene Surovegin
  0 siblings, 1 reply; 4+ messages in thread
From: Jaap-Jan Boor @ 2004-10-07 18:21 UTC (permalink / raw)
  To: Gerhard Jaeger; +Cc: linuxppc-dev


On 7-okt-04, at 19:34, Eugene Surovegin wrote:

> On Thu, Oct 07, 2004 at 03:29:12PM +0200, Gerhard Jaeger wrote:
>> maybe the 2.4 series is somewhat outdatet, but nevertheless used in
>> several embedded systems and also with your preemption patches.
>> During some investigations, we found out that the patches found on
>> http://www.kernel.org/pub/linux/kernel/people/rml/preempt-kernel/
>> contain a severe bug, when using the patches on PPC systems.
>
> Yes, it's a known problem with rml preempt patches - DON'T USE THEM
> on PPC. I sent him similar patch _two_ years ago - nothing happened.
> MVL tree is IMHO better place to get preempt stuff for 2.4 - it's
> actually tested and works.

yes, because there are more changes then only the forgotten '{'

Jaap-Jan

>
> Also, I wish -embedded archives were online, this problem was
> discussed there around a year ago as well.
>
> --
> Eugene
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev

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

* Re: [BUG][PPC32] Preemption patch for 2.4 Kernels
  2004-10-07 18:21   ` Jaap-Jan Boor
@ 2004-10-07 18:35     ` Eugene Surovegin
  0 siblings, 0 replies; 4+ messages in thread
From: Eugene Surovegin @ 2004-10-07 18:35 UTC (permalink / raw)
  To: Jaap-Jan Boor; +Cc: linuxppc-dev

On Thu, Oct 07, 2004 at 08:21:54PM +0200, Jaap-Jan Boor wrote:
> 
> On 7-okt-04, at 19:34, Eugene Surovegin wrote:
> 
> >On Thu, Oct 07, 2004 at 03:29:12PM +0200, Gerhard Jaeger wrote:
> >>maybe the 2.4 series is somewhat outdatet, but nevertheless used in
> >>several embedded systems and also with your preemption patches.
> >>During some investigations, we found out that the patches found on
> >>http://www.kernel.org/pub/linux/kernel/people/rml/preempt-kernel/
> >>contain a severe bug, when using the patches on PPC systems.
> >
> >Yes, it's a known problem with rml preempt patches - DON'T USE THEM
> >on PPC. I sent him similar patch _two_ years ago - nothing happened.
> >MVL tree is IMHO better place to get preempt stuff for 2.4 - it's
> >actually tested and works.
> 
> yes, because there are more changes then only the forgotten '{'
> 

You're right, there were other (not so obvious) problems which rml 
patch (like preempt_enable_no_resched() in 
irq.c::preempt_intercept()), maybe others I don't remember now)...

--
Eugene

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

end of thread, other threads:[~2004-10-07 18:46 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-10-07 13:29 [BUG][PPC32] Preemption patch for 2.4 Kernels Gerhard Jaeger
2004-10-07 17:34 ` Eugene Surovegin
2004-10-07 18:21   ` Jaap-Jan Boor
2004-10-07 18:35     ` Eugene Surovegin

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).