From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752885AbdDCNNb (ORCPT ); Mon, 3 Apr 2017 09:13:31 -0400 Received: from mail-eopbgr50122.outbound.protection.outlook.com ([40.107.5.122]:33626 "EHLO EUR03-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752093AbdDCNNa (ORCPT ); Mon, 3 Apr 2017 09:13:30 -0400 Authentication-Results: linux-foundation.org; dkim=none (message not signed) header.d=none;linux-foundation.org; dmarc=none action=none header.from=virtuozzo.com; Subject: Re: [PATCH] mm/zswap: fix potential deadlock in zswap_frontswap_store() To: Michal Hocko References: <20170331153009.11397-1-aryabinin@virtuozzo.com> <20170403084729.GG24661@dhcp22.suse.cz> <20170403124544.GN24661@dhcp22.suse.cz> CC: Shakeel Butt , Seth Jennings , Dan Streetman , Linux MM , LKML , Andrew Morton From: Andrey Ryabinin Message-ID: <0908e647-d60b-4340-e6d2-4f6023663401@virtuozzo.com> Date: Mon, 3 Apr 2017 16:14:51 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 MIME-Version: 1.0 In-Reply-To: <20170403124544.GN24661@dhcp22.suse.cz> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR09CA0051.eurprd09.prod.outlook.com (10.174.50.19) To HE1PR0801MB2057.eurprd08.prod.outlook.com (10.168.95.22) X-MS-Office365-Filtering-Correlation-Id: 09a970b5-b760-44db-ab2f-08d47a933717 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(201703131423075)(201703031133081);SRVR:HE1PR0801MB2057; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB2057;3:b92Ar+SDNifmul23uG3eeIcVJ2dNvkGFejohe6vUX4JgcM0mWBhOYvuTnIGk/6paLgB/msjzdpVevkgSGd3FHNnu4ASx+HF3E9JY95MQH01guAMNQVpMe3IrXa5X3jbzdONQD6jiTyAZt5C5Rg5Yoc3TbgdGCrtPcZseCLOaGJgAf0nAfdBviP+/sCkhN39mr/Gz6twFAbDCubYKHFAyPhgFEaFIYQhn6CwBFiVHSG99ulwAt3Gf6XRfYk/Ys/0Sov8Jg23wma9yu3ef/LTaROsWEltmaRfgj8A58NMWi9gkFjHcJwkLzXeZqf8CBDCo4584EYpsw5fJkTVrMMkYow==;25:V+mY46i4nIjGoHh82r+AmsJlzXp3qN1SmqKUvhd95YeWPx78oh90MyaLkeGTj86IrwHebX+f14hef67fu0aAYuXPdbBbDb/tebnYRDxO6dur1+SLszLJiVG+mAIvpgg/d5IjN0+t0ALCyv3BTLXYuUP9KVnLowALLVloSm3XcB0R4EaI0CcYV3aeHatwXh9imbTTQgvx5AID7mNmcpt231vWS2BRlRVYufnn++DzQKIyPXAGajwxUFaTvMTCs8owwYgYYSQKrtswEkGYV7+3GFcQx6y6o8PpOBupC5pGERiAke/jGMP6CiegQkGRKlaBvZjNCN4vSIGMSRu+6/cwAbN8l8INlX62VYKldM6idd7xipPvPgQrZJr0+hAO/9K2zBl2dozXYRYQHCNq8u/3HuetVizlutqRm3zy8PJ4ea5Cd5SceSnDjTq/bgw25sED6Ddpjzgkr9esYO2VvbHbVQ== X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB2057;31:F6uL1Ad6xbx+BUlDHfu5Z7lRAZV+/e+I57Bcn34ymGJbi+LDPa1pDAWXWA2oOVfcGjUgrBr5/2mc4SMJKGIyx1ucwudwYvLBc3x3MUUlJdYp/UXI0b2ykQqMPfvF2MjZBDu5uaIzDSB+SUKWUrzNCooI+Zuoqqp4T9PQwCeQk3bPgSULAiFqbUKh48LYI9QI9NPszlzE54T81F6DBWW6tHOujEUAZQBwGCxWE4VhXHdVWoq3HYbFdNfATM5i769MCfMADZN0FIQZG/JBEkey+HxZVL7qThvH2M43DcqRZvU=;20:U9nsaT7ecpm7w3cL2d5dauTts0tSmwsUEeKqBE2YSA4B8Abqc0L08lR//eY03D+v6HvD1dqXrV/EQs+YXmAlliAoOJ9LYV55QKp0lLOKbrtXA52qc51KXoOnRuFEIHUiT45U+yS3eA60ZQAJUu9GkAPSuPuiswnkbffZLEXCTC60oUMHeFIUf7+lUQ4kachL6UMaxUG0cxaqJ7XqNBz0EOLQyky6M+2UraCihvbVpZ9tB7jvbnTyMvlZyEy80g5W/Fq/DZMf/bxeUtLSuTgapAAkpa8G+MuCpnpN1cBlZdK5QEBL2rvQuZvadGmupH2DZkFQ9hEu4PNpOSnN24/Dd0UFlRPLUG81Qz4s2vuv3BMsmxlxWi0NfslDVvMie8MwxaWxgH9iHzJgMxvt8LIE8K50vWuEb96GXgc1ec8tPy4= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(93006095)(93001095)(6041248)(20161123555025)(20161123562025)(20161123564025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(6072148);SRVR:HE1PR0801MB2057;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB2057; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB2057;4:eOSeLGQMerFKY9L4gr1qv1tZrd8uuVL6MI+GSusDFtLnEMz/jgsjgYXI/7tMO81pPKhCGxjbaC2++Icdr7xEylz68fwGUhH9g2L2J1T5jbw8EgjlrLDDFT86FLwkn5j31YyaHrO6GDTtTJ/yo9fI45H4En6e+SvLHu7ptnW6UYpHtX8+X4UlJc6QfXrhPxBdlIYAg9XbGUhgT/WUlgFLzxoyiCO3yTAOfwhG1ipMyF5iOqCdLjaCYk7CFFxSTpowv7AO4gsaDHHRvd3C1nWPlCl8yuKTN4tj9O9cfNPvljmRCCby0U42nVN4k2QjRQcw3LYxmt6eKsJWtjRm5bVU2AmD8OfNd3zD4Bc7gr5q6Px0uigabT8x37km5nI71ritEbGSJ6KvpSAB2QmteeResxzWq51jPdJLmQG7iBXhR/9FOgo5qosnJG43GKWJufFW5Y2RxpimQ52Ly5Y4DfEF87F/7QSETW9gAkbhTSxxRdsJErqIVO8OJF2niXA02lhBNruL493QiUJp7MEHjNzs1vL1SuD0CZ2KRnJzDacTQrYdDEeiEwBzfiNJDngzvZM0z2OfguluSBE1HQiMkSVORXosm7/7FOne1ATeUti0g85nsjRXGn6cGVSt+8WnLT9txjwpNz3IAzk6EYwBKYXY88wIpJcN5AaNuPORbYCHqb6P9gI0ox995f8y2/5CHlQZwKdTTWf+G2jGt0balPL6kA== X-Forefront-PRVS: 0266491E90 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6049001)(6009001)(39840400002)(39450400003)(39400400002)(39410400002)(377424004)(24454002)(377454003)(31696002)(53936002)(31686004)(42186005)(23746002)(50466002)(54906002)(33646002)(6666003)(76176999)(25786009)(54356999)(53546009)(50986999)(6916009)(2950100002)(65826007)(6246003)(6486002)(77096006)(90366009)(4326008)(5660300001)(229853002)(8676002)(2906002)(81166006)(189998001)(47776003)(4001350100001)(66066001)(230700001)(7736002)(3846002)(6116002)(305945005)(110136004)(38730400002)(36756003)(83506001)(86362001);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB2057;H:[172.16.25.12];FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;HE1PR0801MB2057;23:ZQhaw6qESNQDO3mYzAqDKUf42cJFB90iIXH?= =?Windows-1252?Q?PiUaSxhFPPN7eqBy7ugRrpU/0RY4rNMAhzbV7Gda7UUQtY+xOChbQv0o?= =?Windows-1252?Q?rvzbbgU0IO58B1jdGhuYxlfsfDdy/dfBcYLmq+q4lIaSGCPdKNSuLMfH?= =?Windows-1252?Q?ms2W7SnbbB7woggmdAu3aSR5vNlfZm3opQx+EMjHABDSfvX0B4LT6f3h?= =?Windows-1252?Q?t63SGrRNuXBrvb3P6YiVfvPnhB3TFBUg8AgmI+NwK+ZKGFe3OJdbiYLT?= =?Windows-1252?Q?ShkvR9WoGq3PM5pOeVJJ91aDSYBdWYWuHTy/EJFY8Q1zkcmM3cfrJnZ+?= =?Windows-1252?Q?wnb+/EzTh8De4jKxVQCoH8OnS2hOekA6o1heEJOR/SGRvk3yeR/xFDtI?= =?Windows-1252?Q?KgGZ8x6TzZw+dNtLDW21t+GWQleBQsSskPJVMRGa7YlZWQPC5Rt/XZ6k?= =?Windows-1252?Q?DPwiSk+NH9TPB5l4LTjJHU18vwO24se0GarZItNGNo8x4paI9dRRP2J8?= =?Windows-1252?Q?i5XXZROrh88LAnhnd/124dbf/xslqCikDgI4uCYddyChJnpjMI3gTOQc?= =?Windows-1252?Q?9HnBtu9sNGt/SR1jRv7DBfv3s8IKHjVhtjp03wA3VPFgNm53e5rXFTAG?= =?Windows-1252?Q?N5Sk58J/ia0lrEdaDS4/u4+ERoMQnpii+da7MXSieKBbiQW0PUgPwp9A?= =?Windows-1252?Q?QqLW5zdhzu0C8rllgS6NU7IEAwF+yS4Ka4j5kAGoXOQovDU08aOkeFXF?= =?Windows-1252?Q?TdfC/HoT+rr60ATaR1A908XWwlIMykcaCVbh0I7oNTEuNYYAaoHI6dqu?= =?Windows-1252?Q?2vBKsv2PowE+aa9qA5jAdQZoeKI4Vaht4tRnshtBYrzVrmXsavtx8Izn?= =?Windows-1252?Q?CzWEMsTPIloQae0Jcksahx6UcLHgNQ7AoOmbC9VNbKAezXtHAR0iZbvQ?= =?Windows-1252?Q?d85yztlnBfnh5fabllAlgjEjfX4CACUhHpqUhQGpo+6cR5LebECcwu8I?= =?Windows-1252?Q?n+ysQ5PUvbmHe80ssydRPvhxxTTzYZRrMB0sOrLa3jtXn7QYDcD1iMj8?= =?Windows-1252?Q?zMNE1/Engz0M14cVCF3u+8TPkPipE4BN4gnDyEFMAi9TRWzVxcE0/ktD?= =?Windows-1252?Q?+VujYuuKnQ2OlLHyF1l2yFLNmAAMszve+J3kN8lsIOfy6oSzxbRahdN8?= =?Windows-1252?Q?aOyqKIKm4tscjDmWVW7+llS4357eIMg5BmTMrnQ74xjLM/jjNOpor7rr?= =?Windows-1252?Q?5LRvzO+031Z0flMNxwwcsU9fAKNfg+VuAaIWvEQCiR8yo8t+7Ey/fyL+?= =?Windows-1252?Q?KqtzPhQg2/9G19QsXaczWInw8yYCb20U+d+2i3Yvp+eN6CCgHMwi3AQT?= =?Windows-1252?Q?vwL1rCmvQboHD?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB2057;6:c2xYsfHPXcpwwC/JjXnLzHX1Q5QXhIB0jEoYalz5eozePQCFWYpOTD6c9EhJDRCaIYKVS+pqc0PepZW/wMey+Zi5ta8wCrSsHtpK+ZYRlTtJLClSLyMfHIg8L0U8pCYunDgdtk6fORH/gApdxaYLMQdzzSeHffaLXDEGtvbpX3i5qr6yjRsImpj0yRVGV3qpJnvA6XS2Hf11KttUObHSKxgI+xiPmBL/8KDCD2nQpJ3dPop2OlGIM/9AEq9Cz7//cw1+MrR1s5Ds8l2wMLBuAMq2yayBUOHfRd8fzR5Oqlkaid5pVEPhySATVA3qNEwWQngp8j/9XidScCxeefqcZpnJgRLQn583/fUXrOF80UfTRq5ooXxPq3b3x915pmQ0McD/ZC+i2FRaGR2zyEZXGQ==;5:KbiTD20KLybuyA2+eLfxFvRFmv7dRdPYp+hx6ZcooGOXdT8Bazm+9cUEVpA9kpGRQSou07cy0u587ORLx1Dc9hSElQrLAKbm+LuUJHKCGllUzC2ViwV8z0Fbh9Y9CEfNmU5jzGIA+GSMjHsekFJ9vQ==;24:p2GAlakzPXz4Pnf0/VuowDjGWGbx1frHhK3efdq7cMFS1irP3PUEDX3uoJpQwCbmk75zFnQhlmqNHi8YHz4A35VHpjKqQpgfJmmvmFEMXX0= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB2057;7:ZJyS/PF3UJvf5H/KjWnNE0DL7ilF73Q/zZ8t3N4OnMuPwwinylJ+takbmJPj/XSmapwcyNdleHfIYplsnQgSTqMqGxEJd4yrdEnKcp2kUCAw4bRS2hPz1bqGIwLKDn5fiRmBR+hRlRPv7/jD+wucLf1hSeSd6dVQKyxQJ2TReO+4Gq8tllQqlY+180gbrhu4kJKD9CsUzg7GyLAZuFW7E+L0WqUGNqUXbcKZfCe/PMjHWzNNPSwOx2mzEDGYeI6hT2zMbfr1DHRA5Zm8q5ZGaXUTlFdeoVwCKv7Iw2e2krUhVMfM0F5it/pJmgu21+Wv3ELiMQh6tGFs7Ub4ztilfQ==;20:wGQ+wh1fkDq7+Enuj88KyZEaWr1eOsP5F9r3RQGDPH04qoTJ6lYxhVGaxk14vo1r2AOMhVanpHHXDfm046G7GXt6/3ALMyjeTjEWNud8BUMu+KjKmPCPY4gj/H3ruH106ai7o5yvRr5AEQObFw2z+EKTnYblSgnf6fiCZLbHVLM= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Apr 2017 13:13:26.4678 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB2057 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 04/03/2017 03:45 PM, Michal Hocko wrote: > On Mon 03-04-17 15:37:07, Andrey Ryabinin wrote: >> >> >> On 04/03/2017 11:47 AM, Michal Hocko wrote: >>> On Fri 31-03-17 10:00:30, Shakeel Butt wrote: >>>> On Fri, Mar 31, 2017 at 8:30 AM, Andrey Ryabinin >>>> wrote: >>>>> zswap_frontswap_store() is called during memory reclaim from >>>>> __frontswap_store() from swap_writepage() from shrink_page_list(). >>>>> This may happen in NOFS context, thus zswap shouldn't use __GFP_FS, >>>>> otherwise we may renter into fs code and deadlock. >>>>> zswap_frontswap_store() also shouldn't use __GFP_IO to avoid recursion >>>>> into itself. >>>>> >>>> >>>> Is it possible to enter fs code (or IO) from zswap_frontswap_store() >>>> other than recursive memory reclaim? However recursive memory reclaim >>>> is protected through PF_MEMALLOC task flag. The change seems fine but >>>> IMHO reasoning needs an update. Adding Michal for expert opinion. >>> >>> Yes this is true. >> >> Actually, no. I think we have a bug in allocator which may lead to >> recursive direct reclaim. >> >> E.g. for costly order allocations (or order > 0 && >> ac->migratetype != MIGRATE_MOVABLE) with __GFP_NOMEMALLOC >> (gfp_pfmemalloc_allowed() returns false) __alloc_pages_slowpath() >> may call __alloc_pages_direct_compact() and unconditionally clear >> PF_MEMALLOC: > > Not sure what is the bug here. __GFP_NOMEMALLOC is supposed to inhibit > PF_MEMALLOC. And we do not recurse to the reclaim path. We only do the > compaction. Or what am I missing? > The bug here is that __alloc_pages_direct_compact() will *unconditionally* clear PF_MEMALLOC. So if we already under direct reclaim (so PF_MEMALLOC was already set) __alloc_pages_direct_compact() will clear that PF_MEMALLOC. If compaction failed we may go into direct reclaim again because the following following if in __alloc_pages_slowpath() is false: /* Avoid recursion of direct reclaim */ if (current->flags & PF_MEMALLOC) goto nopage; /* Try direct reclaim and then allocating */ page = __alloc_pages_direct_reclaim(gfp_mask, order, alloc_flags, ac, So, recursion might look like this: alloc_pages() __perform_reclaim() current->flags |= PF_MEMALLOC; try_to_free_pages() alloc_pages(__GFP_NONMEMALLOC): __alloc_pages_direct_compact(): current->flags &= ~PF_MEMALLOC; if (current->flags & PF_MEMALLOC) //now it's false goto nopage; __alloc_pages_direct_reclaim() __perform_reclaim()