From: Gerhard Jaeger <hidden> Date: 2004-10-07 13:53:23
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 [off-list ref]
SYSGO AG Embedded and Real-Time Software
www.sysgo.com | www.elinos.com | www.osek.de | www.imerva.com
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
On Thu, Oct 07, 2004 at 03:29:12PM +0200, Gerhard Jaeger wrote:
quoted
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
On Thu, Oct 07, 2004 at 08:21:54PM +0200, Jaap-Jan Boor wrote:
On 7-okt-04, at 19:34, Eugene Surovegin wrote:
quoted
On Thu, Oct 07, 2004 at 03:29:12PM +0200, Gerhard Jaeger wrote:
quoted
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