From patchwork Fri May 25 03:46:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ming Lei X-Patchwork-Id: 10426091 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 1C8B6602D6 for ; Fri, 25 May 2018 03:50:18 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0B13A294F9 for ; Fri, 25 May 2018 03:50:18 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F2E79295A4; Fri, 25 May 2018 03:50:17 +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 5E21E294F9 for ; Fri, 25 May 2018 03:50:17 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7BC1B6B02AE; Thu, 24 May 2018 23:50:16 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 7412F6B02B0; Thu, 24 May 2018 23:50:16 -0400 (EDT) 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 5E4596B02B1; Thu, 24 May 2018 23:50:16 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-qk0-f199.google.com (mail-qk0-f199.google.com [209.85.220.199]) by kanga.kvack.org (Postfix) with ESMTP id 2A9CF6B02AE for ; Thu, 24 May 2018 23:50:16 -0400 (EDT) Received: by mail-qk0-f199.google.com with SMTP id z140-v6so2895173qka.12 for ; Thu, 24 May 2018 20:50:16 -0700 (PDT) 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=qnww7szmb6+qMhargpUtkVxmYjcWTTnOzObOCJ6yAQA=; b=t8MXiKSjCsp5vz++Fyu7pdouMYLcvAbhIRvaJ00jVxJ2zF5u+uzNb9uNYJ1E7CphDc CcJTUVEyvOhKlfoSUo5a/uvU+q++jOJQzEX9J8ZtUmzP9kq/XSamEyAZ4Fzx/SpuwQcf wJ6yPg9TQfHGELJ2pUmrKwoHQLmLhT7a1iGsqWpnaJjSmuuMg/e/wrEKwKThRbwIXXZ6 2iXw2XfUGhm/HoQKAR87kH2mysqJSpOARV16QQKRcOFxWSVMeSglbF8s11iNGbxa7MeU KEcOV/Qzm3aUtWb8eGQMdGy0IqT89O98vOslpKWjbV+oiezFIjahI3Vbjn9DCpXbiIVo Gzgw== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ming.lei@redhat.com designates 66.187.233.73 as permitted sender) smtp.mailfrom=ming.lei@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com X-Gm-Message-State: ALKqPwdBk3SGZGBmNEQ08/3IRedwP45uSpZ6VaWVZYrbQg7T66iRrUbW OIgK9P2vpK17wxxh1RO91vFNV7N0LUeRDPUSyprWAcwncgvaUrLeOld2JaW4AbHGxU/PSBihe6c Zh+YXMurcExZwqC7uyHqfWWeXGqjLmwralI4k6nmDoNnEXmD82S6yS9QwVK3DXIw+aA== X-Received: by 2002:ac8:2acc:: with SMTP id c12-v6mr558052qta.389.1527220215947; Thu, 24 May 2018 20:50:15 -0700 (PDT) X-Google-Smtp-Source: ADUXVKK0uoDmx7j6z1flgXp63HEoqIHNl0gqG4nyx7J83kzKM0/x7sPSFHfVd2+CpmIVfH6CbeR4 X-Received: by 2002:ac8:2acc:: with SMTP id c12-v6mr558024qta.389.1527220215094; Thu, 24 May 2018 20:50:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527220215; cv=none; d=google.com; s=arc-20160816; b=gfVxv2wUiZUzv93bCpKrImuwrpvBIS9dqj27IdiOL0CAgsuNx5rwE1163fCGh5Ld2p SfHJv5uCrw2w02PrCbg8BixHXpQH3i4pPR0IooEXh5zqYxz1ymHRJuAYde4xKg6Jk/eE TrUaXOnylWqm7l7Wny3Td7SzlAr1zXFyOni+S7EIOE6Flu5uE7+Xv1dG+ATnDxk3NB6B K0bQo6iQjGrCu0AfvxhE/xz8oiZKcVCSa1J0pxv7QAdPKcVfmibtJ8x2ucmAOG7wNs56 MpYdXLxvmpmTDTbvBdt7QEo9hW3E1fH1RiThsh18rbpp/ri8iz/6FeX2scwThJmqt1+K JnvQ== 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 :arc-authentication-results; bh=qnww7szmb6+qMhargpUtkVxmYjcWTTnOzObOCJ6yAQA=; b=h4kYZEXWg16wPYTTInugyGVnjy0Wr5581mvCB/rA/RS4XmhRJH8AvtNi7zOcvQgbW5 pcYW4Z0Zsekb+bfkGZHQEMxT7mQm1uueOwrHTlzR71OlYYZdKG8ccRqSeWxHcIsE8gqN pormS1fuoHUionJDjW9qnP6Hil5KBDLH4EsnqP9ehJ7LO/H/QDi0/isPy7rgqgJwHLk3 m4HB/DarxcSp+nPx/KOm0afPNCkJpFXkd9E7U3RCm9fwplZO7OIXCK14uHpdc84U48h/ o0f+UCsfoEq9IdGR0O8Va6mN6sELrwWAbj6QwNU32EfLOSRLEbL+97BMAv8KHGHKPlDq Y25w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ming.lei@redhat.com designates 66.187.233.73 as permitted sender) smtp.mailfrom=ming.lei@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from mx1.redhat.com (mx3-rdu2.redhat.com. [66.187.233.73]) by mx.google.com with ESMTPS id n4-v6si4169691qkl.110.2018.05.24.20.50.14 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 24 May 2018 20:50:15 -0700 (PDT) Received-SPF: pass (google.com: domain of ming.lei@redhat.com designates 66.187.233.73 as permitted sender) client-ip=66.187.233.73; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ming.lei@redhat.com designates 66.187.233.73 as permitted sender) smtp.mailfrom=ming.lei@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B696E402290A; Fri, 25 May 2018 03:50:14 +0000 (UTC) Received: from localhost (ovpn-12-30.pek2.redhat.com [10.72.12.30]) by smtp.corp.redhat.com (Postfix) with ESMTP id 97CF72166BB2; Fri, 25 May 2018 03:50:06 +0000 (UTC) From: Ming Lei To: Jens Axboe , Christoph Hellwig , Alexander Viro , Kent Overstreet Cc: David Sterba , Huang Ying , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, Theodore Ts'o , "Darrick J . Wong" , Coly Li , Filipe Manana , Ming Lei Subject: [RESEND PATCH V5 18/33] block: deal with dirtying pages for multipage bvec Date: Fri, 25 May 2018 11:46:06 +0800 Message-Id: <20180525034621.31147-19-ming.lei@redhat.com> In-Reply-To: <20180525034621.31147-1-ming.lei@redhat.com> References: <20180525034621.31147-1-ming.lei@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Fri, 25 May 2018 03:50:14 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Fri, 25 May 2018 03:50:14 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'ming.lei@redhat.com' RCPT:'' 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 In bio_check_pages_dirty(), bvec->bv_page is used as flag for marking if the page has been dirtied & released, and if no, it will be dirtied in deferred workqueue. With multipage bvec, we can't do that any more, so change the logic into checking all pages in one mp bvec, and only release all these pages if all are dirtied, otherwise dirty them all in deferred wrokqueue. This patch introduces segment_for_each_page_all() to deal with the case a bit easier. Signed-off-by: Ming Lei --- block/bio.c | 45 +++++++++++++++++++++++++++++++++++++-------- include/linux/bvec.h | 7 +++++++ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/block/bio.c b/block/bio.c index 63d4fe85f42e..a200c42e55dc 100644 --- a/block/bio.c +++ b/block/bio.c @@ -1630,8 +1630,9 @@ void bio_set_pages_dirty(struct bio *bio) { struct bio_vec *bvec; int i; + struct bvec_iter_all bia; - bio_for_each_page_all(bvec, bio, i) { + bio_for_each_page_all2(bvec, bio, i, bia) { struct page *page = bvec->bv_page; if (page && !PageCompound(page)) @@ -1640,16 +1641,26 @@ void bio_set_pages_dirty(struct bio *bio) } EXPORT_SYMBOL_GPL(bio_set_pages_dirty); +static inline void release_mp_bvec_pages(struct bio_vec *bvec) +{ + struct bio_vec bv; + struct bvec_iter iter; + + segment_for_each_page_all(bv, bvec, iter) + put_page(bv.bv_page); +} + static void bio_release_pages(struct bio *bio) { struct bio_vec *bvec; int i; - bio_for_each_page_all(bvec, bio, i) { + /* iterate each mp bvec */ + bio_for_each_segment_all(bvec, bio, i) { struct page *page = bvec->bv_page; if (page) - put_page(page); + release_mp_bvec_pages(bvec); } } @@ -1693,20 +1704,38 @@ static void bio_dirty_fn(struct work_struct *work) } } +static inline void check_mp_bvec_pages(struct bio_vec *bvec, + int *nr_dirty, int *nr_pages) +{ + struct bio_vec bv; + struct bvec_iter iter; + + segment_for_each_page_all(bv, bvec, iter) { + struct page *page = bv.bv_page; + + if (PageDirty(page) || PageCompound(page)) + (*nr_dirty)++; + (*nr_pages)++; + } +} + void bio_check_pages_dirty(struct bio *bio) { struct bio_vec *bvec; int nr_clean_pages = 0; int i; - bio_for_each_page_all(bvec, bio, i) { - struct page *page = bvec->bv_page; + bio_for_each_segment_all(bvec, bio, i) { + int nr_dirty = 0, nr_pages = 0; + + check_mp_bvec_pages(bvec, &nr_dirty, &nr_pages); - if (PageDirty(page) || PageCompound(page)) { - put_page(page); + /* release all pages in the mp bvec if all are dirtied */ + if (nr_dirty == nr_pages) { + release_mp_bvec_pages(bvec); bvec->bv_page = NULL; } else { - nr_clean_pages++; + nr_clean_pages += nr_pages; } } diff --git a/include/linux/bvec.h b/include/linux/bvec.h index 2deee87b823e..893e8fef0dd0 100644 --- a/include/linux/bvec.h +++ b/include/linux/bvec.h @@ -225,6 +225,13 @@ static inline bool bvec_iter_seg_advance(const struct bio_vec *bv, .bi_bvec_done = 0, \ } +#define segment_for_each_page_all(pg_bvl, seg_bvec, iter) \ + for (iter = BVEC_ITER_ALL_INIT, \ + (iter).bi_size = (seg_bvec)->bv_len - (iter).bi_bvec_done;\ + (iter).bi_size && \ + ((pg_bvl = bvec_iter_bvec((seg_bvec), (iter))), 1); \ + bvec_iter_advance((seg_bvec), &(iter), (pg_bvl).bv_len)) + /* get the last page from the multipage bvec and store it in @pg */ static inline void segment_last_page(const struct bio_vec *seg, struct bio_vec *pg)