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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 98B0DCE7B10 for ; Thu, 28 Sep 2023 09:55:23 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E47616B01A5; Thu, 28 Sep 2023 05:55:22 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id DF8006B01A8; Thu, 28 Sep 2023 05:55:22 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D0D746B01AA; Thu, 28 Sep 2023 05:55:22 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id C255F6B01A5 for ; Thu, 28 Sep 2023 05:55:22 -0400 (EDT) Received: from smtpin04.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 8A37D1CA5B0 for ; Thu, 28 Sep 2023 09:55:22 +0000 (UTC) X-FDA: 81285548484.04.85D95C3 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf20.hostedemail.com (Postfix) with ESMTP id 8F0F11C0005 for ; Thu, 28 Sep 2023 09:55:20 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf20.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1695894921; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:in-reply-to: references; bh=No5/YyJryPcWGRInZgo70uvW3QAUPqIZybSGncEAKIA=; b=6fzyrHZdzPuVvw7/QNtYcyZyZGHytR3s0TPq2p7UEgHV2puubfiaiYLboS5K6t4hXAzmpv vW8M76dB2JokkkO0f7V0f5HiJ08SdSs0Ob6O4NQEqRxrSM1622dxbe6zumleEUJaJ5Eoki JZNtgqYZ9Z5YR7RLnfmG98Grg0pxOEQ= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf20.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1695894921; a=rsa-sha256; cv=none; b=hzBfX6f4R7CKzTsYD1i4Wvwo9Y6SARSap4eByvl81ytQ83bEcwskevpWHUzR3ca64NL92A vjCLq3eRSYcygaxFv/a2vLp8nFupUy7qxVvbXMAPByAR/y1zgAUEHu6mIFospWg9ao5TiS uAYXKShnsigFZ0VEZU6xtOBkwLWtKSQ= Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 059061FB; Thu, 28 Sep 2023 02:55:58 -0700 (PDT) Received: from [10.1.37.161] (XHFQ2J9959.cambridge.arm.com [10.1.37.161]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C91CD3F59C; Thu, 28 Sep 2023 02:55:18 -0700 (PDT) Message-ID: <4d6c9b19-cdbb-4a00-9a40-5ed5c36332e5@arm.com> Date: Thu, 28 Sep 2023 10:55:17 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-GB From: Ryan Roberts Subject: BUG: MADV_COLLAPSE doesn't work for XFS files To: Hugh Dickins , David Hildenbrand , Matthew Wilcox , zokeefe@google.com Cc: Linux-MM Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Rspam-User: X-Stat-Signature: aq3wb3e1a1siki4hfwcbhre8kq6of61z X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 8F0F11C0005 X-HE-Tag: 1695894920-997401 X-HE-Meta: U2FsdGVkX1/SYId9tZ2q+DiOQ8kw/ss5vIIt3bDLyDm2x7qa+8lu2ANpaIlghivGC9GH0806+1NY08AxwjGrjf+/v8O9L9WwFOClmbIEATKc3MdQ8NuX7LRnEAMcD0DDQptRfrycEW9yAE7z6fn2KiIzkQpUTmIRwXG6QCygQcsAM3wEVbLhIfYtF1DQCGJGJo3xrGrzr9xuyKloav2SdyM98SHTLNfUi6LFBed73nIXLpk4fggb8ttFbzog8UY430HR+O/8zooTDIFPUVCHnogui2Fr5NQpZAU5uHq6Gz1Ji2n5zku75Tz5NPsCQR8BGwieFyK36V4pBr9GJlPGZK9eMj7T4EU39yM33y2c/Sug37j+NGxCehiAqe3klmAS6qYjQSFrwxjvRHlO0eaMIw5XRD6G+TVXy9S+Y9zRDvHAz7UfkgvknHw4UCRs2PIweLB23KqJ4NT03VGpnpevDb7DvwLlwK5Rgncc04bH6Wqi57uXCexUIdeZLxEtopQC9jwMT7WhFBGk3I525GFFDmHxt7AUbn1gp36HAPBQPFXVgKMmsrewU9wnkecZWICFRWfW4GiHKMzLrNCA4k0zkAO/QfQn2cPju2AaLu5zTMd/H/+VIBqSkgcI+OnQFEFYv53kwTCy5Y/5lqUBblCsZ/rPjG2GoGc/rFiCynHCIXuyQGAp7Sd20TdOKnY6tNihVQz6PON+HGqn7GUguWj2cS44+P3Aj5phNvBdvXX1lYxi8/rn5+yqPdLu24bgmGCaLGPTWU7br4set55SHikEcknWVBG65FlU7QY7I+keQ3YpId/ij63K1+3A48omNXZT0/mU0b2Zwr+bNknzFuLVGwRSzf29hhC3Yx8mBp3Nryxu633jDTtO0njEi9DDXbW+PzpcV2s7LPKi5zRmcpJNPA11m3k/cuP9Z+0S5el++O7Lmr3lWOZDIZJ4J+pq+A3k165dmTcFbAsqIrkBeqg TesYGWLS sQirM2nHYUahAv7EKezgD3KJaBKtjIbnqlk+h3UuInqtEviQN6nCSNvBHzOptYYtYb5d6YWiwhtE2RwvC/GQH5J5TBJuBEZV4L82SK4SkY8kEkfNZ/mkMu+vra8V0gtLuILa2v6awBjmIimtCF1T6T/FtAkC8lkfLvuI4mK5wOHz6TMGBAkxMY+Y3UfjioEJ98VUg 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: Hi all, I've just noticed that when applied to a file mapping for a file on xfs, MADV_COLLAPSE returns EINVAL. The same test case works fine if the file is on ext4. I think the root cause is that the implementation bails out if it finds a (non-PMD-sized) large folio in the page cache for any part of the file covered by the region. XFS does readahead into large folios so we hit this issue. See khugepaged.h:collapse_file(): if (PageTransCompound(page)) { struct page *head = compound_head(page); result = compound_order(head) == HPAGE_PMD_ORDER && head->index == start /* Maybe PMD-mapped */ ? SCAN_PTE_MAPPED_HUGEPAGE : SCAN_PAGE_COMPOUND; goto out_unlock; } I'm not sure if this is already a known issue? I don't have time to work on a fix for this right now, so thought I would highlight it at least. I might get around to it at some point in the future if nobody else tackles it. Thanks, Ryan Test case I've been using: -->8-- #include #include #include #include #include #include #include #ifndef MADV_COLLAPSE #define MADV_COLLAPSE 25 #endif #define handle_error(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0) #define SZ_1K 1024 #define SZ_1M (SZ_1K * SZ_1K) #define ALIGN(val, align) (((val) + ((align) - 1)) & ~((align) - 1)) #if 1 // ext4 #define DATA_FILE "/home/ubuntu/data.txt" #else // xfs #define DATA_FILE "/boot/data.txt" #endif int main(void) { int fd; char *mem; int ret; fd = open(DATA_FILE, O_RDONLY); if (fd == -1) handle_error("open"); mem = mmap(NULL, SZ_1M * 4, PROT_READ | PROT_EXEC, MAP_PRIVATE, fd, 0); close(fd); if (mem == MAP_FAILED) handle_error("mmap"); printf("1: pid=%d, mem=%p\n", getpid(), mem); getchar(); mem = (char *)ALIGN((unsigned long)mem, SZ_1M * 2); ret = madvise(mem, SZ_1M * 2, MADV_COLLAPSE); if (ret) handle_error("madvise"); printf("2: pid=%d, mem=%p\n", getpid(), mem); getchar(); return 0; } -->8--