From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CEDE3C432C2 for ; Thu, 26 Sep 2019 09:41:27 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 9B5E3222BE for ; Thu, 26 Sep 2019 09:41:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9B5E3222BE Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 506318E0001; Thu, 26 Sep 2019 05:41:27 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4909E6B0272; Thu, 26 Sep 2019 05:41:27 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 357368E0001; Thu, 26 Sep 2019 05:41:27 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0178.hostedemail.com [216.40.44.178]) by kanga.kvack.org (Postfix) with ESMTP id 0E0806B0271 for ; Thu, 26 Sep 2019 05:41:27 -0400 (EDT) Received: from smtpin27.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with SMTP id B783D256EE for ; Thu, 26 Sep 2019 09:41:26 +0000 (UTC) X-FDA: 75976578972.27.ants35_80fa8bb4dff63 X-HE-Tag: ants35_80fa8bb4dff63 X-Filterd-Recvd-Size: 5838 Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by imf27.hostedemail.com (Postfix) with ESMTP for ; Thu, 26 Sep 2019 09:41:26 +0000 (UTC) Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 87B06C057F88 for ; Thu, 26 Sep 2019 09:41:25 +0000 (UTC) Received: by mail-pg1-f198.google.com with SMTP id w13so1071512pge.15 for ; Thu, 26 Sep 2019 02:41:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Zt8EwZyFUvlwT1VYMNYV6I/TnTem7aMxIFLElv6YJ/M=; b=myw+xMugXwmSOvdMOhN+AxLjQ8W0ZdBZ9xQ5Sq670EHHowuOAefGYOmIu/49UKBAZn aI0NhQ+Wq8zbkOvaFMmxzDzNF7APds3ij0LpzEt4kn98P5ncRbYl6o5NosVK0t7tb95Q 43oJyHEeaT6JYwMF5r4vEYDKk9Bx1Nm033TB7019dFLoQpQyuAiXDQlz/Pbhq49WZobm XHRQcgel+ui6nSUa2bnQoGHpwp9xNMLrPQ1gAJOKJ0Z4uOgxcHrlY98sNp0Eizw34iHP loM966nEUw8wM9Ocp+xrFN3fv56jPXS8WybDXXzL2fTXJGA6EeXCB1T5yJoJFGTdeSuN FDvg== X-Gm-Message-State: APjAAAVtefd113uzVO5wa7otxaWUanVoi345+jn/MIVmG1YKt7WhAyAT 5wOWLTa9MUdicA8S+MSHJjnF+iVfer/+J+Qmox1fabm/k2iG7jGbwEhmBvxt2ExSV+L7gd7OCgZ Qjw1Slanrpjo= X-Received: by 2002:a17:90a:356d:: with SMTP id q100mr2591438pjb.53.1569490884000; Thu, 26 Sep 2019 02:41:24 -0700 (PDT) X-Google-Smtp-Source: APXvYqwUAI+/pkWVPqCwKNAGhjD7zSseN3FtCOt463W8scMo/2YSN4J0PKUhijZxIeZhAEgd+EwMDQ== X-Received: by 2002:a17:90a:356d:: with SMTP id q100mr2591405pjb.53.1569490883699; Thu, 26 Sep 2019 02:41:23 -0700 (PDT) Received: from xz-x1.redhat.com ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id p68sm3224982pfp.9.2019.09.26.02.41.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Sep 2019 02:41:23 -0700 (PDT) From: Peter Xu To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: David Hildenbrand , Hugh Dickins , Maya Gokhale , Jerome Glisse , Pavel Emelyanov , Johannes Weiner , peterx@redhat.com, Martin Cracauer , Matthew Wilcox , Shaohua Li , Marty McFadden , Andrea Arcangeli , Mike Kravetz , Denis Plotnikov , Mike Rapoport , Linus Torvalds , Mel Gorman , "Kirill A . Shutemov" , "Dr . David Alan Gilbert" Subject: [PATCH v5 15/16] mm/gup: Allow to react to fatal signals Date: Thu, 26 Sep 2019 17:39:03 +0800 Message-Id: <20190926093904.5090-16-peterx@redhat.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190926093904.5090-1-peterx@redhat.com> References: <20190926093904.5090-1-peterx@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: The existing gup code does not react to the fatal signals in many code paths. For example, in one retry path of gup we're still using down_read() rather than down_read_killable(). Also, when doing page faults we don't pass in FAULT_FLAG_KILLABLE as well, which means that within the faulting process we'll wait in non-killable way as well. These were spotted by Linus during the code review of some other patches. Let's allow the gup code to react to fatal signals to improve the responsiveness of threads when during gup and being killed. Signed-off-by: Peter Xu --- mm/gup.c | 12 +++++++++--- mm/hugetlb.c | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/mm/gup.c b/mm/gup.c index d2811bb15a25..4c638473db83 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -640,7 +640,7 @@ static int faultin_page(struct task_struct *tsk, stru= ct vm_area_struct *vma, if (*flags & FOLL_REMOTE) fault_flags |=3D FAULT_FLAG_REMOTE; if (locked) - fault_flags |=3D FAULT_FLAG_ALLOW_RETRY; + fault_flags |=3D FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; if (*flags & FOLL_NOWAIT) fault_flags |=3D FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_RETRY_NOWAIT; if (*flags & FOLL_TRIED) { @@ -973,7 +973,7 @@ int fixup_user_fault(struct task_struct *tsk, struct = mm_struct *mm, vm_fault_t ret, major =3D 0; =20 if (unlocked) - fault_flags |=3D FAULT_FLAG_ALLOW_RETRY; + fault_flags |=3D FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; =20 retry: vma =3D find_extend_vma(mm, address); @@ -1086,7 +1086,13 @@ static __always_inline long __get_user_pages_locke= d(struct task_struct *tsk, break; =20 *locked =3D 1; - down_read(&mm->mmap_sem); + ret =3D down_read_killable(&mm->mmap_sem); + if (ret) { + BUG_ON(ret > 0); + if (!pages_done) + pages_done =3D ret; + break; + } =20 ret =3D __get_user_pages(tsk, mm, start, 1, flags | FOLL_TRIED, pages, NULL, locked); diff --git a/mm/hugetlb.c b/mm/hugetlb.c index d0c98cff5b0f..84034154d50e 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -4342,7 +4342,8 @@ long follow_hugetlb_page(struct mm_struct *mm, stru= ct vm_area_struct *vma, if (flags & FOLL_WRITE) fault_flags |=3D FAULT_FLAG_WRITE; if (locked) - fault_flags |=3D FAULT_FLAG_ALLOW_RETRY; + fault_flags |=3D FAULT_FLAG_ALLOW_RETRY | + FAULT_FLAG_KILLABLE; if (flags & FOLL_NOWAIT) fault_flags |=3D FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_RETRY_NOWAIT; --=20 2.21.0