mirror of https://gitee.com/openkylin/linux.git
powerpc/book3s64/radix: Remove WARN_ON in destroy_context()
On failed task initialization due to memory allocation failures, we can call into destroy_context() with process_tb entry already populated. This patch forces the process_tb entry to zero in destroy_context(). With this patch, we lose the ability to track if we are destroying a context without flushing the process table entry. WARNING: CPU: 4 PID: 6368 at arch/powerpc/mm/mmu_context_book3s64.c:246 destroy_context+0x58/0x340 NIP [c0000000000875f8] destroy_context+0x58/0x340 LR [c00000000013da18] __mmdrop+0x78/0x270 Call Trace: [c000000f7db77c80] [c00000000013da18] __mmdrop+0x78/0x270 [c000000f7db77cf0] [c0000000004d6a34] __do_execve_file.isra.13+0xbd4/0x1000 [c000000f7db77e00] [c0000000004d7428] sys_execve+0x58/0x70 [c000000f7db77e30] [c00000000000b388] system_call+0x5c/0x70 Reported-by: Priya M.A <priyama2@in.ibm.com> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> [mpe: Reformat/tweak comment wording] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20190918140103.24395-1-aneesh.kumar@linux.ibm.com
This commit is contained in:
parent
a003365cab
commit
7aec584eaf
|
@ -256,8 +256,21 @@ void destroy_context(struct mm_struct *mm)
|
|||
#ifdef CONFIG_SPAPR_TCE_IOMMU
|
||||
WARN_ON_ONCE(!list_empty(&mm->context.iommu_group_mem_list));
|
||||
#endif
|
||||
/*
|
||||
* For tasks which were successfully initialized we end up calling
|
||||
* arch_exit_mmap() which clears the process table entry. And
|
||||
* arch_exit_mmap() is called before the required fullmm TLB flush
|
||||
* which does a RIC=2 flush. Hence for an initialized task, we do clear
|
||||
* any cached process table entries.
|
||||
*
|
||||
* The condition below handles the error case during task init. We have
|
||||
* set the process table entry early and if we fail a task
|
||||
* initialization, we need to ensure the process table entry is zeroed.
|
||||
* We need not worry about process table entry caches because the task
|
||||
* never ran with the PID value.
|
||||
*/
|
||||
if (radix_enabled())
|
||||
WARN_ON(process_tb[mm->context.id].prtb0 != 0);
|
||||
process_tb[mm->context.id].prtb0 = 0;
|
||||
else
|
||||
subpage_prot_free(mm);
|
||||
destroy_contexts(&mm->context);
|
||||
|
|
Loading…
Reference in New Issue