Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp14378581pxu; Mon, 4 Jan 2021 23:08:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJzlTQ12MI1Uc1jTMninpx89q9sl3ZKleqbBxMez2eve2W1b/Nn3FaJn8K32CInGRZLA3tzc X-Received: by 2002:a17:907:b09:: with SMTP id h9mr70717895ejl.155.1609830487212; Mon, 04 Jan 2021 23:08:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609830487; cv=none; d=google.com; s=arc-20160816; b=R8JZNNosCN0KI5SUAsYIJkJl+ONaIN4h4UiwmldQ1J4Dy50cb5M0FalYmrRFT60y8C tN++SrUjq8mFgsMqGCrwnk582OYnCuwjU1wQg0shGrik0GXnc1oyf6wGQJnAVV64P9dw sqBQD/eAkM1kOhl0W4A1Dr+Id7vwROK8Nx3UQ8iQMYxjB07eERaDqRNHZ0TS89vuCovp jNxE4RMQlKr1zky2f7LSIkPaOaqlS9I+6Nbac0MsKdigKwc2FWePyi4wOTzozfC9eEGv h/3jeJPgBAiSmuzE3sJ58qeTtXzEXtVPmiJLgi1DfhGQGoxHI/GRzT2svF7hHgwh4liH W2rQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from:dmarc-filter :sender:dkim-signature; bh=2RibZ3quCogr3Bv7+yL4XndtnXP1rZOfy3IGjqSqr84=; b=Uj7IFfGTTIJbbgICy0t0noado8c9LRTx1LXgvyMRVG4zc91IKl5ZLZrH2u9D9ly1is CviGPmRB/Y0ySkzNST/d749roDMsKneuPecXVv4Oz3+qYwQvpLWsQ6IXcDCUO0bULiF9 E85YvnENtnzQni/+2w/NZ2GyTXIgA8AtURLZZSILq+vtA0ZVQO/0yfBMChIcCteLbWaw GGey65p8T/2vLPYtSc0PMTBqU7OrBzpkL/e+LLT4vcGZJVFO37Y3xGG8YgTI5UNd+U+6 QsxsIPABxzKazIYDy4JD+ByVlprvdmQ7NJrTre+TmTtg9VLZoVWZSxZju7X3eKiRARfc 95fw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=mQwi1KN7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i3si33639652edj.120.2021.01.04.23.07.43; Mon, 04 Jan 2021 23:08:07 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=mQwi1KN7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725868AbhAEHGq (ORCPT + 99 others); Tue, 5 Jan 2021 02:06:46 -0500 Received: from m43-15.mailgun.net ([69.72.43.15]:25824 "EHLO m43-15.mailgun.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725769AbhAEHGp (ORCPT ); Tue, 5 Jan 2021 02:06:45 -0500 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1609830386; h=Message-Id: Date: Subject: Cc: To: From: Sender; bh=2RibZ3quCogr3Bv7+yL4XndtnXP1rZOfy3IGjqSqr84=; b=mQwi1KN7gfxHva0iXsSMR4G8Pes0eiO7pFahNJt/HpQmBSHn/mrEkUvWx9FD8hZWnY1MFUTe SF/8JnKfXGodyRxa/z2xOf6C6DOw0ME8xoV9qmD1igtxvsWnaw5iGvMrX0Njmeh0DnUtAKW4 9Zd7rVlnFzzy/iCTc7b3TnF67ug= X-Mailgun-Sending-Ip: 69.72.43.15 X-Mailgun-Sid: WyI0MWYwYSIsICJsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIiwgImJlOWU0YSJd Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by smtp-out-n09.prod.us-west-2.postgun.com with SMTP id 5ff40fc5f7aeb83bf1a57de6 (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Tue, 05 Jan 2021 07:05:41 GMT Sender: cgoldswo=codeaurora.org@mg.codeaurora.org Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 72B82C43461; Tue, 5 Jan 2021 07:05:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=ALL_TRUSTED,BAYES_00,SPF_FAIL autolearn=no autolearn_force=no version=3.4.0 Received: from cgoldswo-linux.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: cgoldswo) by smtp.codeaurora.org (Postfix) with ESMTPSA id 62A6BC433C6; Tue, 5 Jan 2021 07:05:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 62A6BC433C6 Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=fail smtp.mailfrom=cgoldswo@codeaurora.org From: Chris Goldsworthy To: Alexander Viro , linux-fsdevel@vger.kernel.org, Matthew Wilcox , linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Chris Goldsworthy Subject: [PATCH v2] Resolve LRU page-pinning issue for file-backed pages Date: Mon, 4 Jan 2021 23:05:32 -0800 Message-Id: X-Mailer: git-send-email 2.7.4 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org It is possible for file-backed pages to end up in a contiguous memory area (CMA), such that the relevant page must be migrated using the .migratepage() callback when its backing physical memory is selected for use in an CMA allocation (through cma_alloc()). However, if a set of address space operations (AOPs) for a file-backed page lacks a migratepage() page call-back, fallback_migrate_page() will be used instead, which through try_to_release_page() calls try_to_free_buffers() (which is called directly or through a try_to_free_buffers() callback. try_to_free_buffers() in turn calls drop_buffers() drop_buffers() itself can fail due to the buffer_head associated with a page being busy. However, it is possible that the buffer_head is on an LRU list for a CPU, such that we can try removing the buffer_head from that list, in order to successfully release the page. Do this. v1: https://lore.kernel.org/lkml/cover.1606194703.git.cgoldswo@codeaurora.org/T/#m3a44b5745054206665455625ccaf27379df8a190 Original version of the patch (with updates to make to account for changes in on_each_cpu_cond()). v2: Follow Matthew Wilcox's suggestion of reducing the number of calls to on_each_cpu_cond(), by iterating over a page's busy buffer_heads inside of on_each_cpu_cond(). To copy from his e-mail, we go from: for_each_buffer for_each_cpu for_each_lru_entry to: for_each_cpu for_each_buffer for_each_lru_entry This is done using xarrays, which I found to be the cleanest data structure to use, though a pre-allocated array of page_size(page) / bh->b_size elements might be more performant. Laura Abbott (1): fs/buffer.c: Revoke LRU when trying to drop buffers fs/buffer.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- fs/internal.h | 5 ++++ 2 files changed, 85 insertions(+), 5 deletions(-) -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project