Re: [PATCH] Kernel panic on IA-64 Linux with SELinux

Kaigai Kohei
2004-06-15T09:37:25Z

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

Dear David

The attached patch moves the current of cpu_idle from region 7 to region 5.

The init_task can be viewed from either region 5 or 7.
But the current(r13) of cpu_idle was a region 7 address while &init_task
referes to a region 5 address. Thus, some bad effects occurred.
(This problem came to the front first time by enabling SELinux.)

Signed-off-by: Kazuto MIYOSHI <k-miyoshi@cb.jp.nec.com>
Signed-off-by: Takayoshi Kochi <t-kochi@bq.jp.nec.com>
Signed-off-by: Kaigai Kohei <kaigai@ak.jp.nec.com>

Thanks, so much.
--------
Kaigai Kohei, Linux Promotion Center, NEC
E-mail: kaigai@ak.jp.nec.com

> Hi Kaigai,
>
> Thanks for looking into this issue.
>
> >>>>> On Tue, 15 Jun 2004 11:28:14 +0900, "Kaigai Kohei" <kaigai@ak.jp.nec.com> said:
>
> Kaigai> I have applied this patch to 2.6.6 kernel, and system stall
> Kaigai> occurred while booting up. The problem is in
> Kaigai> init_mount_tree(). The init_mount_tree() function uses
> Kaigai> do_each_thread() macro defined as follows:
>
> Kaigai> #define do_each_thread(g, t) \
> Kaigai> for (g = t = &init_task ; (g = t = next_task(g)) != &init_task ; ) do
>
> Yeah, that'd do it.
>
> Kaigai> There are several solutions against this problem.
>
> Kaigai> (1) Initializing only wait_chldexit as my first patch.
>
> Kaigai> (2) Moving current of swapper from region 7 to region 5 as
> Kaigai> Miyoshi's second patch.
>
> Kaigai> (3) Replacing &init_task with task_t *p_init_task which
> Kaigai> refers to init_task in region 7, and refers to init_task
> Kaigai> directly on other archtectures.
>
> Kaigai> (1) is easy but ad hoc. (3) needs to correct generic code.
> Kaigai> (2) is consistent on &init_task is in region 5 and
> Kaigai> current(r13) for cpu_idle refers to region 5. But the number
> Kaigai> of steps in switch_to() macro will increase. This overhead
> Kaigai> is not a big problem, I guess.
>
> Kaigai> For reasons already stated I prefer (2). What do you think?
>
> I agree, (2) seems to best solution so far. It maintains the
> invariant that static data will be in region 5. The extra
> instructions should be pretty much free since it should be possible to
> schedule them into existing stalls.
>
> Can you resend the tested patch with proper changelog and "Signed-off-by"
> trailer?
>
> Thanks,
>
> --david
>

[-- Attachment #2: migrate.init_task.2.6.7-rc3.patch --]
[-- Type: application/octet-stream, Size: 1156 bytes --]

diff -rNU2 linux-2.6.7-rc3/arch/ia64/kernel/entry.S linux-2.6.7-rc3.selinux/arch/ia64/kernel/entry.S
--- linux-2.6.7-rc3/arch/ia64/kernel/entry.S 2004-06-08 04:14:02.000000000 +0900
+++ linux-2.6.7-rc3.selinux/arch/ia64/kernel/entry.S 2004-06-15 15:19:24.925797780 +0900
@@ -178,5 +178,8 @@
DO_SAVE_SWITCH_STACK
.body
-
+
+ movl r22=init_task;;
+ cmp.eq p7,p6=r22,in0
+
adds r22=IA64_TASK_THREAD_KSP_OFFSET,r13
mov r27=IA64_KR(CURRENT_STACK)
@@ -190,5 +193,5 @@
* If we've already mapped this task's page, we can skip doing it again.
*/
- cmp.eq p7,p6=r26,r27
+(p6) cmp.eq p7,p6=r26,r27
(p6) br.cond.dpnt .map
;;
diff -rNU2 linux-2.6.7-rc3/arch/ia64/kernel/head.S linux-2.6.7-rc3.selinux/arch/ia64/kernel/head.S
--- linux-2.6.7-rc3/arch/ia64/kernel/head.S 2004-06-08 04:14:42.000000000 +0900
+++ linux-2.6.7-rc3.selinux/arch/ia64/kernel/head.S 2004-06-15 15:15:57.434480607 +0900
@@ -182,4 +182,6 @@

// load the "current" pointer (r13) and ar.k6 with the current task
+ (isBP) movl r2=init_task // migrate to region 5
+ ;;
mov IA64_KR(CURRENT)=r2 // virtual address
mov IA64_KR(CURRENT_STACK)=r16