Received: by 10.213.65.68 with SMTP id h4csp118589imn; Wed, 21 Mar 2018 13:57:51 -0700 (PDT) X-Google-Smtp-Source: AG47ELsXA6qpQLPp/F5ZGSMcJDRUKxAUzgxbI3y3Y6AkdfIGQBQ3B8xD2K05xsMXyK8OLnxMHln+ X-Received: by 10.101.66.6 with SMTP id c6mr6598055pgq.35.1521665871356; Wed, 21 Mar 2018 13:57:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521665871; cv=none; d=google.com; s=arc-20160816; b=kLNnKdV//kh2BHIhq3pzx94tU3i8LQeh2ubaLgsXNVZT0IZM9NOP+ddlvUvq6Phv/A sWkSGQorPzEJJyKai6EXBCa01XaQV5zmAUgez7sKZnn2+OCn8K22v1YPeG1ycWh/hB+n UxHOEiNYzBT8Yb68Htsdse+e+s6nKUn69sK2wz7l+asqeMIMD7EMZt/wxqnt9r8IpEvd O2g3M+D81kk9TJukw6PIZnLruu1ejX15wYpEE3tt7mOCz6u5g4ayE4qC2yM2sI9tFDoV Ax989VFJVIW1oHihK0xC8b1CvpdMoOsLEW67nyff3vVLuZUYJVjqMs6MgnEduOtLJJwN R7uw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date :arc-authentication-results; bh=EzDOeV5TZ8CSS6+izJ3xG5SuAkvBLRyysQcrvcDkr18=; b=RdxnZcxvLvKQ/+OGwGteniHsk/GqiU4lCIJE/8hLKnREGGZHR+3X8F/0FpsMteY551 lrfyjssY2bYWAIKvJON5gGQLRMP6noSkMfiqu2d1GZlAzXTG4Rds2F71828yRqp0G/tV 7Q2VIQC08AdLTJUsnMKfGqVFCOh56QXMslsTCr/CfBSR6wozAtW92sSUfRb8APU9PhZ7 TDUotMWoKrhVJT5Ofr7IlBcR06vk1V/ta6DSo7NYWZtN2QIxY4vSN5QVxjuwlUReEHZJ 02Aau9VHU1hfdtniAEOOiwe4VVeG4uq6cp+tlJEWJYmTYDMkJzo/TlfVpIGc9abCUP9c QCDw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m189si3666336pfb.130.2018.03.21.13.57.36; Wed, 21 Mar 2018 13:57:51 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753436AbeCUU4Z (ORCPT + 99 others); Wed, 21 Mar 2018 16:56:25 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:35570 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753210AbeCUU4U (ORCPT ); Wed, 21 Mar 2018 16:56:20 -0400 Received: from akpm3.svl.corp.google.com (unknown [104.133.9.71]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id A311B1258; Wed, 21 Mar 2018 20:56:19 +0000 (UTC) Date: Wed, 21 Mar 2018 13:56:18 -0700 From: Andrew Morton To: Mike Kravetz Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Laurent Dufour , Michal Hocko , Dan Williams , Andrea Arcangeli , stable@vger.kernel.org Subject: Re: [PATCH v2] shm: add split function to shm_vm_ops Message-Id: <20180321135618.f3d4a0c30d9f413ce4092ddf@linux-foundation.org> In-Reply-To: <20180321161314.7711-1-mike.kravetz@oracle.com> References: <0d24f817-303a-7b4d-4603-b2d14e4b391a@oracle.com> <20180321161314.7711-1-mike.kravetz@oracle.com> X-Mailer: Sylpheed 3.6.0 (GTK+ 2.24.31; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 21 Mar 2018 09:13:14 -0700 Mike Kravetz wrote: > If System V shmget/shmat operations are used to create a hugetlbfs > backed mapping, it is possible to munmap part of the mapping and > split the underlying vma such that it is not huge page aligned. > This will untimately result in the following BUG: > > kernel BUG at /build/linux-jWa1Fv/linux-4.15.0/mm/hugetlb.c:3310! > Oops: Exception in kernel mode, sig: 5 [#1] > LE SMP NR_CPUS=2048 NUMA PowerNV > Modules linked in: kcm nfc af_alg caif_socket caif phonet fcrypt > 8<--8<--8<--8< snip 8<--8<--8<--8< > CPU: 18 PID: 43243 Comm: trinity-subchil Tainted: G C E > 4.15.0-10-generic #11-Ubuntu > NIP: c00000000036e764 LR: c00000000036ee48 CTR: 0000000000000009 > REGS: c000003fbcdcf810 TRAP: 0700 Tainted: G C E > (4.15.0-10-generic) > MSR: 9000000000029033 CR: 24002222 XER: > 20040000 > CFAR: c00000000036ee44 SOFTE: 1 > GPR00: c00000000036ee48 c000003fbcdcfa90 c0000000016ea600 c000003fbcdcfc40 > GPR04: c000003fd9858950 00007115e4e00000 00007115e4e10000 0000000000000000 > GPR08: 0000000000000010 0000000000010000 0000000000000000 0000000000000000 > GPR12: 0000000000002000 c000000007a2c600 00000fe3985954d0 00007115e4e00000 > GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 > GPR20: 00000fe398595a94 000000000000a6fc c000003fd9858950 0000000000018554 > GPR24: c000003fdcd84500 c0000000019acd00 00007115e4e10000 c000003fbcdcfc40 > GPR28: 0000000000200000 00007115e4e00000 c000003fbc9ac600 c000003fd9858950 > NIP [c00000000036e764] __unmap_hugepage_range+0xa4/0x760 > LR [c00000000036ee48] __unmap_hugepage_range_final+0x28/0x50 > Call Trace: > [c000003fbcdcfa90] [00007115e4e00000] 0x7115e4e00000 (unreliable) > [c000003fbcdcfb50] [c00000000036ee48] > __unmap_hugepage_range_final+0x28/0x50 > [c000003fbcdcfb80] [c00000000033497c] unmap_single_vma+0x11c/0x190 > [c000003fbcdcfbd0] [c000000000334e14] unmap_vmas+0x94/0x140 > [c000003fbcdcfc20] [c00000000034265c] exit_mmap+0x9c/0x1d0 > [c000003fbcdcfce0] [c000000000105448] mmput+0xa8/0x1d0 > [c000003fbcdcfd10] [c00000000010fad0] do_exit+0x360/0xc80 > [c000003fbcdcfdd0] [c0000000001104c0] do_group_exit+0x60/0x100 > [c000003fbcdcfe10] [c000000000110584] SyS_exit_group+0x24/0x30 > [c000003fbcdcfe30] [c00000000000b184] system_call+0x58/0x6c > Instruction dump: > 552907fe e94a0028 e94a0408 eb2a0018 81590008 7f9c5036 0b090000 e9390010 > 7d2948f8 7d2a2838 0b0a0000 7d293038 <0b090000> e9230086 2fa90000 419e0468 > ---[ end trace ee88f958a1c62605 ]--- > > This bug was introduced by commit 31383c6865a5 ("mm, hugetlbfs: > introduce ->split() to vm_operations_struct"). A split function > was added to vm_operations_struct to determine if a mapping can > be split. This was mostly for device-dax and hugetlbfs mappings > which have specific alignment constraints. > > Mappings initiated via shmget/shmat have their original vm_ops > overwritten with shm_vm_ops. shm_vm_ops functions will call back > to the original vm_ops if needed. Add such a split function to > shm_vm_ops. > > --- a/ipc/shm.c > +++ b/ipc/shm.c > @@ -386,6 +386,17 @@ static int shm_fault(struct vm_fault *vmf) > return sfd->vm_ops->fault(vmf); > } > > +static int shm_split(struct vm_area_struct *vma, unsigned long addr) > +{ > + struct file *file = vma->vm_file; > + struct shm_file_data *sfd = shm_file_data(file); > + > + if (sfd->vm_ops && sfd->vm_ops->split) > + return sfd->vm_ops->split(vma, addr); This will be the only site which tests for NULL shm_file_data.vm_ops. It's a can't-happen, methinks. I think I'll leave it as it is for now and will queue up a non-urgent patch: From: Andrew Morton Subject: ipc/shm.c: shm_split(): remove unneeded test for NULL shm_file_data.vm_ops This was added by the recent "ipc/shm.c: add split function to shm_vm_ops", but it is not necessary. Cc: Laurent Dufour Cc: Dan Williams Cc: Michal Hocko Cc: Davidlohr Bueso Cc: Manfred Spraul Signed-off-by: Andrew Morton --- ipc/shm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff -puN ipc/shm.c~ipc-shmc-shm_split-remove-unneeded-test-for-null-shm_file_datavm_ops ipc/shm.c --- a/ipc/shm.c~ipc-shmc-shm_split-remove-unneeded-test-for-null-shm_file_datavm_ops +++ a/ipc/shm.c @@ -391,7 +391,7 @@ static int shm_split(struct vm_area_stru struct file *file = vma->vm_file; struct shm_file_data *sfd = shm_file_data(file); - if (sfd->vm_ops && sfd->vm_ops->split) + if (sfd->vm_ops->split) return sfd->vm_ops->split(vma, addr); return 0; _