Skip to contentSkip to conversation

kernel update (third patch relative to 2.4.2)

Linux-ia64 David Mosberger 2 participants 3 messages Mar 27, 2001 – Apr 1, 2001

lore
Share & tools
lore
#0 lore raw

The latest IA-64 patch is now available at:

ftp://ftp.kernel.org/pub/linux/kernel/ports/ia64/

in file linux-2.4.2-ia64-010326.diff*

The only two changes are:

o fix do_csum_partial_copy_from_user() to work properly
o fix ia64_ksyms.c so it compiles for UP as well

Enjoy,

	--david
#1 lore raw

Some of you reported that the 2.4.2 based kernels no longer boot properly because /sbin/init got stuck. Andreas Schwab found that this happened only when using a page size smaller than 16KB. I looked into this and it turned out to be a nasty initialization ordering problem. Basically, ia64_mmu_init() ended up using the "unimpl_va_mask" member in cpu_data[] before it was initialized, which made it appear as if the CPU implements all 64 virtual address bits. With a page size of 16KB or bigger, this happened to work mostly OK (though there could have been corner cases under which this would also have produced problems), but with a page size of 4 or 8KB, the kernel basically told the CPU that the entire address space is used for the virtually mapped page table. Of course, that doesn't work too well... ;-)

A patch to fix the problem is attached below. Please let me know how this goes. If nothing unexpected crops up, I'd like to update the patch on ftp.kernel.org on Monday.

	--david
ia64/kernel/setup.c renamed from ia64/kernel/setup.c~ +8 -2
@@ -398,6 +398,14 @@
 	pal_vm_info_2_u_t vmi;
 	unsigned int max_ctx;
 
+	/*
+	 * We can't pass "local_cpu_data" do identify_cpu() because we haven't called
+	 * ia64_mmu_init() yet.  And we can't call ia64_mmu_init() first because it
+	 * depends on the data returned by identify_cpu().  We break the dependency by
+	 * accessing cpu_data[] the old way, through identity mapped space.
+	 */
+	identify_cpu(&cpu_data[smp_processor_id()]);
+
 	/* Clear the stack memory reserved for pt_regs: */
 	memset(ia64_task_regs(current), 0, sizeof(struct pt_regs));
 
@@ -416,8 +424,6 @@
 	current->active_mm = &init_mm;
 
 	ia64_mmu_init();
-
-	identify_cpu(local_cpu_data);
 
 #ifdef CONFIG_IA32_SUPPORT
 	/* initialize global ia32 state - CR0 and CR4 */
#2 lore raw
In reply to David Mosberger

David Mosberger <[email protected]> writes:

|> The latest IA-64 patch is now available at:
|> 
|>  ftp://ftp.kernel.org/pub/linux/kernel/ports/ia64/
|> 
|> in file linux-2.4.2-ia64-010326.diff*
|> 
|> The only two changes are:
|> 
|> 	o fix do_csum_partial_copy_from_user() to work properly
|> 	o fix ia64_ksyms.c so it compiles for UP as well

Actually, for UP we need to export __flush_tlb_all for the agpgart module.

ia64_ksyms.c +3 -1
@@ -52,9 +52,11 @@
 EXPORT_SYMBOL_NOVERS(__down_write_failed);
 EXPORT_SYMBOL_NOVERS(__rwsem_wake);
 
-#ifdef CONFIG_SMP
 #include <asm/pgalloc.h>
+#ifdef CONFIG_SMP
 EXPORT_SYMBOL(smp_flush_tlb_all);
+#else
+EXPORT_SYMBOL(__flush_tlb_all);
 #endif
 
 #include <asm/page.h>

Andreas.

Signature · 5 lines
Andreas Schwab                                  "And now for something
SuSE Labs                                        completely different."
[email protected]
SuSE GmbH, Schanzäckerstr. 10, D-90443 Nürnberg
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5