Re: [PATCH RFC] m68k: skip kernel premption if interrupts were disabled

Michael Schmitz
2024-03-25T22:32:00Z

Hi Finn,

see below (hopefully not whitespace-damaged).

The set_fc warning is specific to 040 but the bad kernel buserror (null
pointer) causing it isn't. But testing on 030 would be a good idea if
you have one with enough RAM. Haven't tried to boot my Falcon with a
preempt enabled kernel yet.

Cheers,

Michael

diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
index 4d4d390a2df2..96cdcacb94ea 100644
--- a/arch/m68k/mm/motorola.c
+++ b/arch/m68k/mm/motorola.c
@@ -15,6 +15,7 @@
#include <linux/mm.h>
#include <linux/swap.h>
#include <linux/kernel.h>
+#include <linux/preempt.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/init.h>
@@ -195,6 +196,8 @@ int free_pointer_table(void *table, int type)
unsigned long page = ptable & PAGE_MASK;
unsigned int mask = 1U << ((ptable - page)/ptable_size(type));

+       preempt_disable();
+
dp = PD_PTABLE(page);
if (PD_MARKBITS (dp) & mask) {
pr_err("saved from last preempt: nr %x sr %lx %x pc %lx
sp %lx\n",
@@ -213,6 +216,7 @@ int free_pointer_table(void *table, int type)
if (type == TABLE_PTE)
pagetable_pte_dtor(virt_to_ptdesc((void *)page));
free_page (page);
+               sched_preempt_enable_no_resched();
return 1;
} else if (ptable_list[type].next != dp) {
/*
@@ -221,6 +225,7 @@ int free_pointer_table(void *table, int type)
*/
list_move(dp, &ptable_list[type]);
}
+       sched_preempt_enable_no_resched();
return 0;
}

On 26/03/24 11:28, Finn Thain wrote:
> On Mon, 25 Mar 2024, Michael Schmitz wrote:
>
>> Unfortunately, when I add preempt_disable()/
>> sched_preempt_enable_noresched() in free_pointer_table(), I don't get
>> that particular panic() anymore,
> I'd like to try that patch. Would you send it please?
>
>> but the bad kernel buserror with the warning from set_fc() that you
>> reported...
> I think those set_fc() calls are confined to 68040 fault handling. Maybe
> we should try running stress tests on a 68030?