From patchwork Tue Dec 11 17:21:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kara X-Patchwork-Id: 10724265 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8C99113BF for ; Tue, 11 Dec 2018 17:22:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6EEA82B553 for ; Tue, 11 Dec 2018 17:22:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 62A9A2B561; Tue, 11 Dec 2018 17:22:00 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EE7B22B553 for ; Tue, 11 Dec 2018 17:21:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 668098E00B8; Tue, 11 Dec 2018 12:21:52 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 1E5FA8E00B4; Tue, 11 Dec 2018 12:21:52 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id EBC1D8E00B5; Tue, 11 Dec 2018 12:21:51 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by kanga.kvack.org (Postfix) with ESMTP id 93FE38E00B6 for ; Tue, 11 Dec 2018 12:21:51 -0500 (EST) Received: by mail-pl1-f200.google.com with SMTP id c14so10998522pls.21 for ; Tue, 11 Dec 2018 09:21:51 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=xTWVXPZMynHyyB/Xpz095FuvdPrtjUfdZ8FU5/jeDNo=; b=hdi7HVy/+9y/sWwoTIKZghORrMStIYNWu6x6mSuTkB4LwPUY+87T/q1IOAzqBKhJOU O7YuXXn55rdMuuT9wE1QpjUKWI20qsBP0u4z+dmwwQJY1YrjgBvD9Jt7iAO/X9ZUHwfH huVTGA8H+fHaxGKaLBpAejw7SM5TolDXsEvmforqSXhxfhiC3eNCBsgBw9bzUSxEEh7v zLYDq7VprQSwK7Avixf4+oVi8g+0R0kvwLfurcMKicr1s7Zkc+nQMzNIF+V8BlBj9JDs wSjaqtIG1vrrOLvXP//EnTlNzd6RZkzFymO5WVwOHxck3J7U7hO9ZX9qHFD9aWPe3KTC IwiQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of jack@suse.cz designates 195.135.220.15 as permitted sender) smtp.mailfrom=jack@suse.cz X-Gm-Message-State: AA+aEWY3UVOw63d/cTVwN1aYL1AzSPSpu6vGAI6soSKAJbb307e0BrOJ hMWp8Fg9C4FZyQSFZE1OlROwWKlYVWZNJ+gOfPwiqmrbLJ3TKvRd7wFPGJfO38oqcpJovbZmcGv vGGMzpjxbNAbw1k2egv9abjLAY7ix38Gn1Nh10lesCsQ7QOuij9yxoku0LLAWjmrn0g== X-Received: by 2002:a17:902:27e6:: with SMTP id i35mr16456062plg.222.1544548911205; Tue, 11 Dec 2018 09:21:51 -0800 (PST) X-Google-Smtp-Source: AFSGD/UAf3BK/tc36lcz2sSK/+bSgAaXk5y4SdbZlDrokOphEZ7okvcLvCTTztSrDOic2BK73ohr X-Received: by 2002:a17:902:27e6:: with SMTP id i35mr16456010plg.222.1544548910376; Tue, 11 Dec 2018 09:21:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544548910; cv=none; d=google.com; s=arc-20160816; b=Ie0c9F4nyLETzRr8O3L5VhdgDUbW0qybZgauMsGiKHh/2MSPld/UCjgDwqfWFESWqY iF8ccvobyeuzomKecVohZL0Po5L327hTcqoqSI5N/CGhd6DGqLWAShFA71Cy3zbpPpRr yWMqmzRx2uArzSsart9tiU/hKUSZtYD6Z1hYNmhR3JFiOKMFTrdgza+KfWOlfU96mOXm igJlqRCMGiY6nqap2tLy/PoytxhAMnLrP+vTVqJT4o5aIq7yqb7mpGsy16AjtvHCF4Ks 2Qga2i5QR6NDfGNeZPCkfEEbgc/wpKIDRt6uO0hIHx/WrnZo0N+gUg1kPltyIX+eS+6v +4DA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from; bh=xTWVXPZMynHyyB/Xpz095FuvdPrtjUfdZ8FU5/jeDNo=; b=DoGB3uX3sQllZdlRCV9RxP+NHOCii7WO2oFC5ZLWfbILgR0Vt/Gka/iqnFtqP+Xh/c P72R8/pVwrkTqDOVp9jvi0JvLKRXTL6NcEaivxdKgh4zDBVIU6iAt5wkT0xzN7AsTmmB 582hXCodZzNT+BjobyN+aF3BKxWiJFxBzrxY0SK1wLi+ojuK6+vlGh9M3HXnWK+JTHvT xtmhatoTHL2Bfqv4a19pBYoIDgLkJ4jR3f1340tNe6W5DJtM8KKFQnAL34qh8OhiL+zK ygYnVt7NfPLDB+EPcQpzQblwsG758Rv7GL7A7nYkQvxoKV58tLceyKEj+RmI6eBrX0ZK zuWQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of jack@suse.cz designates 195.135.220.15 as permitted sender) smtp.mailfrom=jack@suse.cz Received: from mx1.suse.de (mx2.suse.de. [195.135.220.15]) by mx.google.com with ESMTPS id j21si12437231pll.150.2018.12.11.09.21.50 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Dec 2018 09:21:50 -0800 (PST) Received-SPF: pass (google.com: domain of jack@suse.cz designates 195.135.220.15 as permitted sender) client-ip=195.135.220.15; Authentication-Results: mx.google.com; spf=pass (google.com: domain of jack@suse.cz designates 195.135.220.15 as permitted sender) smtp.mailfrom=jack@suse.cz X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id BE8E6B012 for ; Tue, 11 Dec 2018 17:21:48 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 62A201E140E; Tue, 11 Dec 2018 18:21:48 +0100 (CET) From: Jan Kara To: Cc: mhocko@suse.cz, mgorman@suse.de, Jan Kara Subject: [PATCH 2/6] mm: migrate: Lock buffers before migrate_page_move_mapping() Date: Tue, 11 Dec 2018 18:21:39 +0100 Message-Id: <20181211172143.7358-3-jack@suse.cz> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20181211172143.7358-1-jack@suse.cz> References: <20181211172143.7358-1-jack@suse.cz> 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: X-Virus-Scanned: ClamAV using ClamSMTP Lock buffers before calling into migrate_page_move_mapping() so that that function doesn't have to know about buffers (which is somewhat unexpected anyway) and all the buffer head logic is in buffer_migrate_page(). Signed-off-by: Jan Kara Acked-by: Mel Gorman --- mm/migrate.c | 39 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/mm/migrate.c b/mm/migrate.c index 789c7bc90a0c..d58a8ecf275e 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -490,20 +490,6 @@ int migrate_page_move_mapping(struct address_space *mapping, return -EAGAIN; } - /* - * In the async migration case of moving a page with buffers, lock the - * buffers using trylock before the mapping is moved. If the mapping - * was moved, we later failed to lock the buffers and could not move - * the mapping back due to an elevated page count, we would have to - * block waiting on other references to be dropped. - */ - if (mode == MIGRATE_ASYNC && head && - !buffer_migrate_lock_buffers(head, mode)) { - page_ref_unfreeze(page, expected_count); - xas_unlock_irq(&xas); - return -EAGAIN; - } - /* * Now we know that no one else is looking at the page: * no turning back from here. @@ -779,24 +765,23 @@ int buffer_migrate_page(struct address_space *mapping, { struct buffer_head *bh, *head; int rc; + int expected_count; if (!page_has_buffers(page)) return migrate_page(mapping, newpage, page, mode); - head = page_buffers(page); + /* Check whether page does not have extra refs before we do more work */ + expected_count = expected_page_refs(page); + if (page_count(page) != expected_count) + return -EAGAIN; - rc = migrate_page_move_mapping(mapping, newpage, page, head, mode, 0); + head = page_buffers(page); + if (!buffer_migrate_lock_buffers(head, mode)) + return -EAGAIN; + rc = migrate_page_move_mapping(mapping, newpage, page, NULL, mode, 0); if (rc != MIGRATEPAGE_SUCCESS) - return rc; - - /* - * In the async case, migrate_page_move_mapping locked the buffers - * with an IRQ-safe spinlock held. In the sync case, the buffers - * need to be locked now - */ - if (mode != MIGRATE_ASYNC) - BUG_ON(!buffer_migrate_lock_buffers(head, mode)); + goto unlock_buffers; ClearPagePrivate(page); set_page_private(newpage, page_private(page)); @@ -818,6 +803,8 @@ int buffer_migrate_page(struct address_space *mapping, else migrate_page_states(newpage, page); + rc = MIGRATEPAGE_SUCCESS; +unlock_buffers: bh = head; do { unlock_buffer(bh); @@ -826,7 +813,7 @@ int buffer_migrate_page(struct address_space *mapping, } while (bh != head); - return MIGRATEPAGE_SUCCESS; + return rc; } EXPORT_SYMBOL(buffer_migrate_page); #endif