Messages in this thread Patch in this message | | | Date | Tue, 27 Sep 2011 20:02:13 -0700 | From | Frank Rowand <> | Subject | [PATCH] PREEMPT_RT_FULL: arm coredump fails for cpu >= 4 |
| |
ARM can not use SPLIT_PTLOCK_CPUS if PREEMPT_RT_FULL because vectors_user_mapping() creates a VM_ALWAYSDUMP mapping of the vector page, but no ptl->lock has been allocated for the page. An attempt to coredump that page will result in a kernel NULL pointer dereference when follow_page() attempts to lock the page.
The call tree to the NULL pointer dereference is:
do_notify_resume() get_signal_to_deliver() do_coredump() elf_core_dump() get_dump_page() __get_user_pages() follow_page() pte_offset_map_lock() <----- a #define ... rt_spin_lock()
This patch is needed only if mm-shrink-the-page-frame-to-rt-size.patch is applied.
Signed-off-by: Frank Rowand <frank.rowand@am.sony.com> --- mm/Kconfig | 9 9 + 0 - 0 ! 1 file changed, 9 insertions(+)
Index: b/mm/Kconfig =================================================================== --- a/mm/Kconfig +++ b/mm/Kconfig @@ -172,13 +172,22 @@ config PAGEFLAGS_EXTENDED # page_table_lock, so that faults on different parts of the user address # space can be handled with less contention: split it at this NR_CPUS. # Default to 4 for wider testing, though 8 might be more appropriate. +# # ARM's adjust_pte (unused if VIPT) depends on mm-wide page_table_lock. +# +# ARM can not use SPLIT_PTLOCK_CPUS if PREEMPT_RT_FULL because +# vectors_user_mapping() creates a VM_ALWAYSDUMP mapping of the vector page, +# but no ptl->lock has been allocated for the page. An attempt to coredump +# that page will result in a kernel NULL pointer dereference when +# follow_page() attempts to lock the page. +# # PA-RISC 7xxx's spinlock_t would enlarge struct page from 32 to 44 bytes. # DEBUG_SPINLOCK and DEBUG_LOCK_ALLOC spinlock_t also enlarge struct page. # config SPLIT_PTLOCK_CPUS int default "999999" if ARM && !CPU_CACHE_VIPT + default "999999" if ARM && PREEMPT_RT_FULL default "999999" if PARISC && !PA20 default "999999" if DEBUG_SPINLOCK || DEBUG_LOCK_ALLOC default "4"
| |