From patchwork Wed May 26 08:42:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Jianchao X-Patchwork-Id: 1483920 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=tEOtbEnz; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4Fqkwy1pBbz9s24 for ; Wed, 26 May 2021 18:42:58 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232240AbhEZIo2 (ORCPT ); Wed, 26 May 2021 04:44:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38392 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231519AbhEZIo1 (ORCPT ); Wed, 26 May 2021 04:44:27 -0400 Received: from mail-pl1-x62e.google.com (mail-pl1-x62e.google.com [IPv6:2607:f8b0:4864:20::62e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1328FC061574; Wed, 26 May 2021 01:42:57 -0700 (PDT) Received: by mail-pl1-x62e.google.com with SMTP id a7so267653plh.3; Wed, 26 May 2021 01:42:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=5RwlVOYSug509Gc2kX91BzKkmEP4KOrbTpcGxbCLpLE=; b=tEOtbEnzP+JICK+N7zH7511zB6UwkgugYwApCq3TelLIE9hrcmF6aomjk6+/u6XkrG 6Jp5uuOhHvrqlBhcPHAMJEv1OdVXxv1A9GjcDOKHtQHZ1BN1nRD8qNGFWNrfcrV6hwF5 7f6hn0iqPycFewZR6tw7py+RMSoOe6QipJkDo4EoEDSQn/phPbAaCinGvPm/MhQEMxQl YnEfM7Uz5M/hzUb4yDVuEuKNibNVxr8lRf3zOt21NHwgTIgmFr4OAdqPkm3WKZeXTpuO z36eHVqF5RoYfb4Q9b+Z7rkv4yClYO2UZjkUacQKv9FF8a9osbx4wW0X4iUnnfs8BmiK 1jwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=5RwlVOYSug509Gc2kX91BzKkmEP4KOrbTpcGxbCLpLE=; b=noH06DKTmqPnD6zVzub/rI0Env4Pa6N6A/7qrwTY2cteVc0JPjjPjT7pSBeoTdZsmZ mUyCSdz1fP2U+wK1cyejz5D/sA7jtoNXHPKY8vcSG7GMg2vDhdtRrphPALS41B/qcQRs DB2BVkc2V8sFLvpqu9l1KSfYz9Q2P6r/YtLs4+4vR1XaCZOjY+RzflzlgdAJ+2x6NE90 0/S9szoeu//ijLCAi+fg3s+pVm+CDXERzCykFVogRqj8BcpH5FBm5dqVh5qo9zbioBjZ bsbG+QLWBXDf3MqJn0lNiKdowA9AoDItl1v6jhMkUqF5nzkjTuDCsg3H78GeBwizEBEK id0w== X-Gm-Message-State: AOAM530wYu2qj3N4btm+ckcfZrybaJL42RWx98rWmBlt8noB5BZnaqnX ZVhCdqV9wae9C+fZuJl1c1etYWExmi8= X-Google-Smtp-Source: ABdhPJxB2a1HvSyJn5znRWmhf5aOLrDu2VRWB2cRMzAOUPnfGYbLAAx4+qdpPffKLbJ0HAh0k/bE9w== X-Received: by 2002:a17:90b:81:: with SMTP id bb1mr34570730pjb.167.1622018576567; Wed, 26 May 2021 01:42:56 -0700 (PDT) Received: from jianchwadeMacBook-Pro.local ([154.48.252.66]) by smtp.gmail.com with ESMTPSA id x184sm16801191pgb.36.2021.05.26.01.42.54 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 May 2021 01:42:56 -0700 (PDT) From: Wang Jianchao Subject: [PATCH V2 1/7] ext4: remove the 'group' parameter of ext4_trim_extent To: Theodore Ts'o , Andreas Dilger Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, lishujin@kuaishou.com References: <164ffa3b-c4d5-6967-feba-b972995a6dfb@gmail.com> Message-ID: <61eceb4c-6e5f-34d0-9317-a833d7c63b6f@gmail.com> Date: Wed, 26 May 2021 16:42:53 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 MIME-Version: 1.0 In-Reply-To: <164ffa3b-c4d5-6967-feba-b972995a6dfb@gmail.com> Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Get rid of the 'group' parameter of ext4_trim_extent as we can get it from the 'e4b'. Signed-off-by: Wang Jianchao Reviewed-by: Andreas Dilger --- fs/ext4/mballoc.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index a02fadf..d81f1fd22 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -5650,19 +5650,19 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, * @sb: super block for the file system * @start: starting block of the free extent in the alloc. group * @count: number of blocks to TRIM - * @group: alloc. group we are working with * @e4b: ext4 buddy for the group * * Trim "count" blocks starting at "start" in the "group". To assure that no * one will allocate those blocks, mark it as used in buddy bitmap. This must * be called with under the group lock. */ -static int ext4_trim_extent(struct super_block *sb, int start, int count, - ext4_group_t group, struct ext4_buddy *e4b) +static int ext4_trim_extent(struct super_block *sb, + int start, int count, struct ext4_buddy *e4b) __releases(bitlock) __acquires(bitlock) { struct ext4_free_extent ex; + ext4_group_t group = e4b->bd_group; int ret = 0; trace_ext4_trim_extent(sb, group, start, count); @@ -5738,8 +5738,7 @@ static int ext4_trim_extent(struct super_block *sb, int start, int count, next = mb_find_next_bit(bitmap, max + 1, start); if ((next - start) >= minblocks) { - ret = ext4_trim_extent(sb, start, - next - start, group, &e4b); + ret = ext4_trim_extent(sb, start, next - start, &e4b); if (ret && ret != -EOPNOTSUPP) break; ret = 0; From patchwork Wed May 26 08:43:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Jianchao X-Patchwork-Id: 1483922 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=TJDwf28b; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4FqkxK3YNLz9s24 for ; Wed, 26 May 2021 18:43:17 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232984AbhEZIor (ORCPT ); Wed, 26 May 2021 04:44:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38484 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232918AbhEZIor (ORCPT ); Wed, 26 May 2021 04:44:47 -0400 Received: from mail-pj1-x1032.google.com (mail-pj1-x1032.google.com [IPv6:2607:f8b0:4864:20::1032]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7EEA5C061574; Wed, 26 May 2021 01:43:16 -0700 (PDT) Received: by mail-pj1-x1032.google.com with SMTP id mp9-20020a17090b1909b029015fd1e3ad5aso290385pjb.3; Wed, 26 May 2021 01:43:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=4LdU1IyFk5jvDk1Nl40hPYUk7CeobfdR18WaEyapyXQ=; b=TJDwf28bqzJFlal2kVIxfgBd6L+rgX6x0lMFzoAcLO52VggIinNKRDoMjet0sUlJ3G 0PpFHCDzit1bkD8V4bBin43MOojojRHpKwsZfGd0oi+gMJgM3VCRZMsAA1+54CwCAMDl rfcJfcQl//tERIfFg6SrDIcWQjySjMAa62Y1XnGK1dFErt/l0k/5NI+heKBMvmby1fjx xKbpN0lrx91GuvAMSs9fdAOE/9ucqbtwOt3GpsjXwAWwKzmxahQZId/xziva3V/w8tqt Pbg9/bDxNM/73BQG26y9N2ruhnrZQnxB1q6MncxDC27G0jZvXU4dUcWxulO/UPk0nq0A 2BzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=4LdU1IyFk5jvDk1Nl40hPYUk7CeobfdR18WaEyapyXQ=; b=MuSkxbt54PLHiO2cVJxaIKZvP3zt8gV1I8g6z+t0mpZWrg3iYq4LV7vFIQ9Fds57hN 0iNHRT55xZRu8jo6zeU62AR21zCGKWEmdFAP6nCHc7oI9+idHswkwCEhMaXDfGC/w2Oy RrIaOUExNjp4xrLV263dLfxX5euL1UeJOeUZRNt7WbqenC9OL0SY3ZI36n8CmR9ThCH2 G3vuXr7tFNPW3sVP07RFiU7sbER4r6Gaz+bradTC3sNDdjLe18MUnb2bmk8uDQG62fCx c9yxEdP/RHkZ5jqVhfWvFOGZziOF+NSZw1ZqrwQXW/FX8qvZzKjfzXkTK0qUDVbiK0PR 0sug== X-Gm-Message-State: AOAM531RNf5fWTe/IgZFUPGCvWfqZVCx69IeXxgBXVnu6l89IzRWTWEh TWtndHls5pQ73XZyTFGdVHscVj1s5A7STQ== X-Google-Smtp-Source: ABdhPJz4BZozaSwOS57pOi6QKanMU3cOaeheRqfbhyN54+cz8zNn33YQ2Sssg4VWNrE+j6xc8BjZmQ== X-Received: by 2002:a17:902:f281:b029:f0:bdf2:2fe5 with SMTP id k1-20020a170902f281b02900f0bdf22fe5mr33908602plc.68.1622018596099; Wed, 26 May 2021 01:43:16 -0700 (PDT) Received: from jianchwadeMacBook-Pro.local ([103.112.79.203]) by smtp.gmail.com with ESMTPSA id d91sm899593pjk.6.2021.05.26.01.43.14 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 May 2021 01:43:15 -0700 (PDT) From: Wang Jianchao Subject: [PATCH V2 2/7] ext4: add new helper interface ext4_try_to_trim_range() To: Theodore Ts'o , Andreas Dilger Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, lishujin@kuaishou.com References: <164ffa3b-c4d5-6967-feba-b972995a6dfb@gmail.com> Message-ID: <72360aac-48f9-95c6-539f-739464f9fc9e@gmail.com> Date: Wed, 26 May 2021 16:43:13 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org There is no functional change in this patch but just split the codes, which serachs free block and does trim, into a new function ext4_try_to_trim_range. This is preparing for the following async backgroup discard. Signed-off-by: Wang Jianchao Reviewed-by: Andreas Dilger --- fs/ext4/mballoc.c | 102 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 57 insertions(+), 45 deletions(-) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index d81f1fd22..f984f15 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -5685,6 +5685,54 @@ static int ext4_trim_extent(struct super_block *sb, return ret; } +static int ext4_try_to_trim_range(struct super_block *sb, + struct ext4_buddy *e4b, ext4_grpblk_t start, + ext4_grpblk_t max, ext4_grpblk_t minblocks) +{ + ext4_grpblk_t next, count, free_count; + void *bitmap; + int ret = 0; + + bitmap = e4b->bd_bitmap; + start = (e4b->bd_info->bb_first_free > start) ? + e4b->bd_info->bb_first_free : start; + count = 0; + free_count = 0; + + while (start <= max) { + start = mb_find_next_zero_bit(bitmap, max + 1, start); + if (start > max) + break; + next = mb_find_next_bit(bitmap, max + 1, start); + + if ((next - start) >= minblocks) { + ret = ext4_trim_extent(sb, start, next - start, e4b); + if (ret && ret != -EOPNOTSUPP) + break; + ret = 0; + count += next - start; + } + free_count += next - start; + start = next + 1; + + if (fatal_signal_pending(current)) { + count = -ERESTARTSYS; + break; + } + + if (need_resched()) { + ext4_unlock_group(sb, e4b->bd_group); + cond_resched(); + ext4_lock_group(sb, e4b->bd_group); + } + + if ((e4b->bd_info->bb_free - free_count) < minblocks) + break; + } + + return count; +} + /** * ext4_trim_all_free -- function to trim all free space in alloc. group * @sb: super block for file system @@ -5708,10 +5756,8 @@ static int ext4_trim_extent(struct super_block *sb, ext4_grpblk_t start, ext4_grpblk_t max, ext4_grpblk_t minblocks) { - void *bitmap; - ext4_grpblk_t next, count = 0, free_count = 0; struct ext4_buddy e4b; - int ret = 0; + int ret; trace_ext4_trim_all_free(sb, group, start, max); @@ -5721,57 +5767,23 @@ static int ext4_trim_extent(struct super_block *sb, ret, group); return ret; } - bitmap = e4b.bd_bitmap; ext4_lock_group(sb, group); - if (EXT4_MB_GRP_WAS_TRIMMED(e4b.bd_info) && - minblocks >= atomic_read(&EXT4_SB(sb)->s_last_trim_minblks)) - goto out; - - start = (e4b.bd_info->bb_first_free > start) ? - e4b.bd_info->bb_first_free : start; - while (start <= max) { - start = mb_find_next_zero_bit(bitmap, max + 1, start); - if (start > max) - break; - next = mb_find_next_bit(bitmap, max + 1, start); - - if ((next - start) >= minblocks) { - ret = ext4_trim_extent(sb, start, next - start, &e4b); - if (ret && ret != -EOPNOTSUPP) - break; - ret = 0; - count += next - start; - } - free_count += next - start; - start = next + 1; - - if (fatal_signal_pending(current)) { - count = -ERESTARTSYS; - break; - } - - if (need_resched()) { - ext4_unlock_group(sb, group); - cond_resched(); - ext4_lock_group(sb, group); - } - - if ((e4b.bd_info->bb_free - free_count) < minblocks) - break; + if (!EXT4_MB_GRP_WAS_TRIMMED(e4b.bd_info) || + minblocks < atomic_read(&EXT4_SB(sb)->s_last_trim_minblks)) { + ret = ext4_try_to_trim_range(sb, &e4b, start, max, minblocks); + if (ret >= 0) + EXT4_MB_GRP_SET_TRIMMED(e4b.bd_info); + } else { + ret = 0; } - if (!ret) { - ret = count; - EXT4_MB_GRP_SET_TRIMMED(e4b.bd_info); - } -out: ext4_unlock_group(sb, group); ext4_mb_unload_buddy(&e4b); ext4_debug("trimmed %d blocks in the group %d\n", - count, group); + ret, group); return ret; } From patchwork Wed May 26 08:43:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Jianchao X-Patchwork-Id: 1483923 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=kDPhnwVd; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4FqkxV1YdWz9s24 for ; Wed, 26 May 2021 18:43:26 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233087AbhEZIo4 (ORCPT ); Wed, 26 May 2021 04:44:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232933AbhEZIoz (ORCPT ); Wed, 26 May 2021 04:44:55 -0400 Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com [IPv6:2607:f8b0:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B8EEBC061574; Wed, 26 May 2021 01:43:24 -0700 (PDT) Received: by mail-pg1-x529.google.com with SMTP id q15so340418pgg.12; Wed, 26 May 2021 01:43:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=F9BawxCs/7ZIyDa37Le2Yvwu2P1I/URUI6MTJkKviLw=; b=kDPhnwVdxb5ddOeUc94E3Dv00TVTJkO1AcdyDcgSID6DIDCD7wUPRykSaHwBRlicck hzKXCDVqo6fNLBS3a6XWlzKLtPNEMV13USEbznBTPK8osgYCTarqEuzg3JiurA2ydX7b cVe+0C900liuDmb4I6cSjReBMMKPczvF8Hp0o9vIbmE1R2fV3DMRAl62NV43ne4l5iXD jTSA7q7BRh14N+7kGeBuMupEFMjgJswGBcTpLK8eI3nO0GMh02rt+b4qrWuNrg3OVoWE lWl5GJdAXutL/7ROjJ7nqBUkrCF3hnJnH8Cs3JWr0gKoxV2qA4tpilfmZxYw4BVlOR+L cWFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=F9BawxCs/7ZIyDa37Le2Yvwu2P1I/URUI6MTJkKviLw=; b=bkcZDZm5bl40jlr7smJzAPR+feZdo79HgJpHtrqw1m5DlRIiibGlny+/LaX5kgfL+W tFNWwejK2A1udAG97PnU3vA+t2r9Xlh9w7+WWm/QjiHR/IEH8q3Az2u8Zl9AshMhg5AZ MSMFJIjKdCR6VaJkRiUGKufs3fTJnlDEawIIjO3fxPiotnYZJ3zZ/sF/jj9iDd+kqZv+ XU0HZgGBncSs1dT6DRO3simBeb/Ae5bD7h85tcuGHlpDTo0xrD07LZ0I6WTIkhqpBW8F +d2i/gb00TmM3yTsQiPKCtrIe3uy0k7aBzqYQDyeQYuM3s72S2Oml4p62BC2QBPf0VCS Y4FA== X-Gm-Message-State: AOAM533ZUTAvEonH20OAenEtKIMgprcmrDY7DPCG5lTjcDcyzd2P08o/ D/wsVIYJprjz+gFz4OWQHBA= X-Google-Smtp-Source: ABdhPJzMH/lzv3MLi4CSFPwKUkhO3j3zh2Mjibq0SETkFvd6dgZ3bPHrRjf9hJoawM8N5C/NTVUbtA== X-Received: by 2002:a63:1260:: with SMTP id 32mr4034907pgs.232.1622018604241; Wed, 26 May 2021 01:43:24 -0700 (PDT) Received: from jianchwadeMacBook-Pro.local ([103.112.79.203]) by smtp.gmail.com with ESMTPSA id 80sm16276183pgc.23.2021.05.26.01.43.22 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 May 2021 01:43:23 -0700 (PDT) From: Wang Jianchao Subject: [PATCH V2 3/7] ext4: remove the repeated comment of ext4_trim_all_free To: Theodore Ts'o , Andreas Dilger Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, lishujin@kuaishou.com References: <164ffa3b-c4d5-6967-feba-b972995a6dfb@gmail.com> <49382052-6238-f1fb-40d1-b6b801b39ff7@gmail.com> Message-ID: Date: Wed, 26 May 2021 16:43:21 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 MIME-Version: 1.0 In-Reply-To: <49382052-6238-f1fb-40d1-b6b801b39ff7@gmail.com> Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Signed-off-by: Wang Jianchao Reviewed-by: Andreas Dilger --- fs/ext4/mballoc.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index f984f15..85418cf 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -5741,15 +5741,10 @@ static int ext4_try_to_trim_range(struct super_block *sb, * @max: last group block to examine * @minblocks: minimum extent block count * - * ext4_trim_all_free walks through group's buddy bitmap searching for free - * extents. When the free block is found, ext4_trim_extent is called to TRIM - * the extent. - * - * * ext4_trim_all_free walks through group's block bitmap searching for free * extents. When the free extent is found, mark it as used in group buddy * bitmap. Then issue a TRIM command on this extent and free the extent in - * the group buddy bitmap. This is done until whole group is scanned. + * the group buddy bitmap. */ static ext4_grpblk_t ext4_trim_all_free(struct super_block *sb, ext4_group_t group, From patchwork Wed May 26 08:43:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Jianchao X-Patchwork-Id: 1483932 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=Gog1hNNt; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4Fqkxn04tvz9s24 for ; Wed, 26 May 2021 18:43:41 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232921AbhEZIpK (ORCPT ); Wed, 26 May 2021 04:45:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38594 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233207AbhEZIpJ (ORCPT ); Wed, 26 May 2021 04:45:09 -0400 Received: from mail-pj1-x102f.google.com (mail-pj1-x102f.google.com [IPv6:2607:f8b0:4864:20::102f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 281EFC061760; Wed, 26 May 2021 01:43:37 -0700 (PDT) Received: by mail-pj1-x102f.google.com with SMTP id lx17-20020a17090b4b11b029015f3b32b8dbso5052pjb.0; Wed, 26 May 2021 01:43:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=Kis25+buAxmOPJmdbeTmrskSftALM8UjFJM551XPpXQ=; b=Gog1hNNtPhESMXt/cHypr8UAUtbI0JJ1dA8NY171oT+EgXYr99q+s+7MaO0Oi1AusK C3lswGj0/9jFqtRivQARXtNXW7W6F3iDySPtr0XZjTQOpidlPTQuI8JLYeDIc/OvNbGe ToRXA9QdbecaKtO5xvydIxUzu1KEDSHs5iFMTZduJxTELpPJ0XniSJJ3fTkdrLoDoGK3 OUQ5S4Qws0Shm9eYhV42lfMMjHfGzKR/v1sxrxSr50Rpj04GliF+fsTRNTSMdtd157oe KeJ03nUSn8uHnXHfBgM50YY2veqFx7KKFCF0VqgtHMqJA9AlENN96SZi7cSe2gQtvuN4 lMoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=Kis25+buAxmOPJmdbeTmrskSftALM8UjFJM551XPpXQ=; b=iKwoJn2qYoih9EatwUN044cnlhj4jsSas1WMWvnDteWMuLPvd1JKnBSDjbT3j9iuQi iqqoWwnNdQNt6/AXXRHa6MuovK0VfT9HfFp6vUCssSHowhAL/ysf64lA4qn5g+xOlUPv jZN8T2MtC/z7u9ldLQtM8gMycf0TdAn7y7eHf3tojBpwTqP7mgeOkhHqNLemUxOizm5l H3us3VeKBx0zwObVVEqb6FOfH0qrb/BNf9JGfwNsOLOkO7qKylykw85r5Ae3EuD/Kcw3 NsPDLdEOCyswekNIcKhhNNDHN+y/w/tV8+fhpIPxNayYSa+i38EmsUIi+OQfUjn2nOHL TnMA== X-Gm-Message-State: AOAM533tqCvmv+k6Otgv9ORD9GaoLblXvaks+J2ph7JsRNu/M/A5bMME 3ejpkIewj48V8SYRucdUfgA= X-Google-Smtp-Source: ABdhPJyBHpgEGyFdxydmpVS7LlONsSH2wlaiyzyvm7xA3SgTC1ECHf2DMHzHfU67nCMAA2Lvta1BRQ== X-Received: by 2002:a17:902:c406:b029:ef:7ba2:f308 with SMTP id k6-20020a170902c406b02900ef7ba2f308mr35220795plk.9.1622018616757; Wed, 26 May 2021 01:43:36 -0700 (PDT) Received: from jianchwadeMacBook-Pro.local ([103.112.79.203]) by smtp.gmail.com with ESMTPSA id k186sm15747268pgk.82.2021.05.26.01.43.34 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 May 2021 01:43:36 -0700 (PDT) From: Wang Jianchao Subject: [PATCH V2 4/7] ext4: add new helper interface ext4_insert_free_data To: Theodore Ts'o , Andreas Dilger Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, lishujin@kuaishou.com References: <164ffa3b-c4d5-6967-feba-b972995a6dfb@gmail.com> <49382052-6238-f1fb-40d1-b6b801b39ff7@gmail.com> <48e33dea-d15e-f211-0191-e01bd3eb17b3@gmail.com> Message-ID: <83fab578-b170-c515-d514-1ed366f07e8a@gmail.com> Date: Wed, 26 May 2021 16:43:33 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 MIME-Version: 1.0 In-Reply-To: <48e33dea-d15e-f211-0191-e01bd3eb17b3@gmail.com> Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Split the codes that inserts and merges ext4_free_data structures into a new interface ext4_insert_free_data. This is preparing for following async background discard. Signed-off-by: Wang Jianchao --- fs/ext4/mballoc.c | 96 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 51 insertions(+), 45 deletions(-) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 85418cf..16f06d2 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -350,6 +350,12 @@ static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, static void ext4_mb_generate_from_freelist(struct super_block *sb, void *bitmap, ext4_group_t group); static void ext4_mb_new_preallocation(struct ext4_allocation_context *ac); +static inline struct ext4_free_data *efd_entry(struct rb_node *n) +{ + return rb_entry_safe(n, struct ext4_free_data, efd_node); +} +static int ext4_insert_free_data(struct ext4_sb_info *sbi, + struct rb_root *root, struct ext4_free_data *nfd); /* * The algorithm using this percpu seq counter goes below: @@ -5069,28 +5075,53 @@ static void ext4_try_merge_freed_extent(struct ext4_sb_info *sbi, kmem_cache_free(ext4_free_data_cachep, entry); } +static int ext4_insert_free_data(struct ext4_sb_info *sbi, + struct rb_root *root, struct ext4_free_data *nfd) +{ + struct rb_node **n = &root->rb_node; + struct rb_node *p = NULL; + struct ext4_free_data *fd; + + while (*n) { + p = *n; + fd = rb_entry(p, struct ext4_free_data, efd_node); + if (nfd->efd_start_cluster < fd->efd_start_cluster) + n = &(*n)->rb_left; + else if (nfd->efd_start_cluster >= + (fd->efd_start_cluster + fd->efd_count)) + n = &(*n)->rb_right; + else + return -EINVAL; + } + + rb_link_node(&nfd->efd_node, p, n); + rb_insert_color(&nfd->efd_node, root); + + /* Now try to see the extent can be merged to left and right */ + fd = efd_entry(rb_prev(&nfd->efd_node)); + if (fd) + ext4_try_merge_freed_extent(sbi, fd, nfd, root); + + fd = efd_entry(rb_next(&nfd->efd_node)); + if (fd) + ext4_try_merge_freed_extent(sbi, fd, nfd, root); + + return 0; +} + static noinline_for_stack int ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b, - struct ext4_free_data *new_entry) + struct ext4_free_data *nfd) { - ext4_group_t group = e4b->bd_group; - ext4_grpblk_t cluster; - ext4_grpblk_t clusters = new_entry->efd_count; - struct ext4_free_data *entry; struct ext4_group_info *db = e4b->bd_info; struct super_block *sb = e4b->bd_sb; struct ext4_sb_info *sbi = EXT4_SB(sb); - struct rb_node **n = &db->bb_free_root.rb_node, *node; - struct rb_node *parent = NULL, *new_node; BUG_ON(!ext4_handle_valid(handle)); BUG_ON(e4b->bd_bitmap_page == NULL); BUG_ON(e4b->bd_buddy_page == NULL); - new_node = &new_entry->efd_node; - cluster = new_entry->efd_start_cluster; - - if (!*n) { + if (!db->bb_free_root.rb_node) { /* first free block exent. We need to protect buddy cache from being freed, * otherwise we'll refresh it from @@ -5099,44 +5130,19 @@ static void ext4_try_merge_freed_extent(struct ext4_sb_info *sbi, get_page(e4b->bd_buddy_page); get_page(e4b->bd_bitmap_page); } - while (*n) { - parent = *n; - entry = rb_entry(parent, struct ext4_free_data, efd_node); - if (cluster < entry->efd_start_cluster) - n = &(*n)->rb_left; - else if (cluster >= (entry->efd_start_cluster + entry->efd_count)) - n = &(*n)->rb_right; - else { - ext4_grp_locked_error(sb, group, 0, - ext4_group_first_block_no(sb, group) + - EXT4_C2B(sbi, cluster), - "Block already on to-be-freed list"); - kmem_cache_free(ext4_free_data_cachep, new_entry); - return 0; - } - } - - rb_link_node(new_node, parent, n); - rb_insert_color(new_node, &db->bb_free_root); - - /* Now try to see the extent can be merged to left and right */ - node = rb_prev(new_node); - if (node) { - entry = rb_entry(node, struct ext4_free_data, efd_node); - ext4_try_merge_freed_extent(sbi, entry, new_entry, - &(db->bb_free_root)); - } - node = rb_next(new_node); - if (node) { - entry = rb_entry(node, struct ext4_free_data, efd_node); - ext4_try_merge_freed_extent(sbi, entry, new_entry, - &(db->bb_free_root)); + if (ext4_insert_free_data(sbi, &db->bb_free_root, nfd)) { + ext4_grp_locked_error(sb, e4b->bd_group, 0, + ext4_group_first_block_no(sb, e4b->bd_group) + + EXT4_C2B(sbi, nfd->efd_start_cluster), + "Block already on to-be-freed list"); + kmem_cache_free(ext4_free_data_cachep, nfd); + return 0; } spin_lock(&sbi->s_md_lock); - list_add_tail(&new_entry->efd_list, &sbi->s_freed_data_list); - sbi->s_mb_free_pending += clusters; + list_add_tail(&nfd->efd_list, &sbi->s_freed_data_list); + sbi->s_mb_free_pending += nfd->efd_count; spin_unlock(&sbi->s_md_lock); return 0; } From patchwork Wed May 26 08:43:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Jianchao X-Patchwork-Id: 1483935 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=jMNPGl5h; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4Fqkxw4hV4z9s24 for ; Wed, 26 May 2021 18:43:48 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233140AbhEZIpS (ORCPT ); Wed, 26 May 2021 04:45:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38648 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233056AbhEZIpR (ORCPT ); Wed, 26 May 2021 04:45:17 -0400 Received: from mail-pf1-x42a.google.com (mail-pf1-x42a.google.com [IPv6:2607:f8b0:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 329B1C061574; Wed, 26 May 2021 01:43:46 -0700 (PDT) Received: by mail-pf1-x42a.google.com with SMTP id x18so409001pfi.9; Wed, 26 May 2021 01:43:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=TA9xJ9PtHz9pmM6zL8ig8SFoo1C9SL8VTQvVBosCszM=; b=jMNPGl5hZ2TsiFuoj5fApo2D75V2A9G6MsWKqnShLLkvlDCrV1E5tBiDCfKJ8Zc0LJ KWdswe46yHbXRTC6SmhS/VMQ64P+UTqF2fH3EbpdlHVn+xZD+Q/IetynJm9zft3RQpbA X/MrvWNVaZ+3juwoFve3LlA0xiyd4m0PJfFGi5z+pmowhCj8op/V9tz98kE7PDEi8W+A +am3qCB+gzBpzdbrJVJr3inEQG0Jt90JIWdRub5wk/2iIWygPUKN79apY2TQdVbe494U FTauRXZPIsZsgcVh+UWmU6bq3A87l6zSU66PsBC0sYEoDvFJDIi6UaxQTiT5lCxV1Omc VYHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=TA9xJ9PtHz9pmM6zL8ig8SFoo1C9SL8VTQvVBosCszM=; b=loFTjOu/tcY+zUIbemudhXPR3bEgYAJu0CyMW1GLFWZku60CVbhgDm5fv9Gs4O6QOG /G/XGec2pt1Qgqa1cFhH5HPIAYSyaSOGSWZ/iR/vR41KfYCqUj6kIVWKrNnkxZ935P57 R/UxwvDaCoArHODOKdp45vNmGGaocd1cYiSmqBdpHZXr9XDQ+PSzLKG/cN95eib4i3XW WYETwCF57BKQpZfbTf/HSMZd0Cpv6Tmm9PNXAunYfr2t2Hfmq4wpwplS4KRfPDheDfsJ 8HI8oSjwi4aHM9bNAPpAsOz+2evrLy99eoEBPHIQIm6tI+fM17ohF+aQJUmlJH6/kQ5U lsVw== X-Gm-Message-State: AOAM531PzwfWi5cOEiS91Zhzviyu0+eJ39KpJE2xHMIlAsXeEVpk4KeM ghBKj8Y0TExx6zZm+nvInwKkUjPNWLA= X-Google-Smtp-Source: ABdhPJzwQPbzmIHVR3qEb9ecRhlQ7RJF+UatmyYVFtmYGY58bPzu06Di7cFaze2FaBtzs25fHqqsfg== X-Received: by 2002:a63:e104:: with SMTP id z4mr16040008pgh.249.1622018625839; Wed, 26 May 2021 01:43:45 -0700 (PDT) Received: from jianchwadeMacBook-Pro.local ([154.48.252.66]) by smtp.gmail.com with ESMTPSA id 66sm17008428pgj.9.2021.05.26.01.43.44 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 May 2021 01:43:45 -0700 (PDT) From: Wang Jianchao Subject: [PATCH V2 5/7] ext4: get buddy cache after insert successfully To: Theodore Ts'o , Andreas Dilger Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, lishujin@kuaishou.com References: <164ffa3b-c4d5-6967-feba-b972995a6dfb@gmail.com> <49382052-6238-f1fb-40d1-b6b801b39ff7@gmail.com> <48e33dea-d15e-f211-0191-e01bd3eb17b3@gmail.com> <67eeb65a-d413-c4f9-c06f-d5dcceca0e4f@gmail.com> Message-ID: <93458049-0d43-617a-a5e7-c7e10325443a@gmail.com> Date: Wed, 26 May 2021 16:43:43 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 MIME-Version: 1.0 In-Reply-To: <67eeb65a-d413-c4f9-c06f-d5dcceca0e4f@gmail.com> Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org The getting of bd_bitmap_page and bd_buddy_page should be done after insert the ext4_free_data successfully. Otherwise, nobody can put them. Signed-off-by: Wang Jianchao --- fs/ext4/mballoc.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index b23010c..3e8ad43 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -5116,21 +5116,12 @@ static int ext4_insert_free_data( struct ext4_sb_info *sbi, struct ext4_group_info *db = e4b->bd_info; struct super_block *sb = e4b->bd_sb; struct ext4_sb_info *sbi = EXT4_SB(sb); + bool first = RB_EMPTY_ROOT(&db->bb_free_root); BUG_ON(!ext4_handle_valid(handle)); BUG_ON(e4b->bd_bitmap_page == NULL); BUG_ON(e4b->bd_buddy_page == NULL); - if (!db->bb_free_root.rb_node) { - /* first free block exent. We need to - protect buddy cache from being freed, - * otherwise we'll refresh it from - * on-disk bitmap and lose not-yet-available - * blocks */ - get_page(e4b->bd_buddy_page); - get_page(e4b->bd_bitmap_page); - } - if (ext4_insert_free_data(sbi, &db->bb_free_root, nfd)) { ext4_grp_locked_error(sb, e4b->bd_group, 0, ext4_group_first_block_no(sb, e4b->bd_group) + @@ -5140,6 +5131,15 @@ static int ext4_insert_free_data( struct ext4_sb_info *sbi, return 0; } + if (first) { + /* first free block exent. We need to protect buddy + * cache from being freed, otherwise we'll refresh it + * from on-disk bitmap and lose not-yet-available blocks + */ + get_page(e4b->bd_buddy_page); + get_page(e4b->bd_bitmap_page); + } + spin_lock(&sbi->s_md_lock); list_add_tail(&nfd->efd_list, &sbi->s_freed_data_list); sbi->s_mb_free_pending += nfd->efd_count; From patchwork Wed May 26 08:43:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Jianchao X-Patchwork-Id: 1483936 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=k5yj/B0j; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4Fqky54M2Jz9s24 for ; Wed, 26 May 2021 18:43:57 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233197AbhEZIp1 (ORCPT ); Wed, 26 May 2021 04:45:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38690 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233195AbhEZIp1 (ORCPT ); Wed, 26 May 2021 04:45:27 -0400 Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 85F09C061574; Wed, 26 May 2021 01:43:55 -0700 (PDT) Received: by mail-pj1-x102a.google.com with SMTP id pi6-20020a17090b1e46b029015cec51d7cdso9048pjb.5; Wed, 26 May 2021 01:43:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=UPD75SrJkwfUqt1p4FKKu9RQG2y83AGNxduxxEZqyhE=; b=k5yj/B0j3yMScGOmCfDBZ7ExlQI5L97BXmR0OXeWAJ4UBKJpZkA6bvboAVgjQCbKVv j2NqvQ8sAyVf/aV6Ow1/z7tPAQOh2hbdfDXipVsJImdVkclaB3tJ3QiQy6AQSeS+yzJO IHMTYV2YaMy70pr4ZtP549JI6EyM5vRChShACKBRYK3uwRvTJuRNnUl1sxLHCHtsGBPI jIecaoQlHmJkB+/VO/VhSaBaYSoT5fw2lrcbVDLjGQ4ktf2jZFE2IGVQkfCVX3Ek3Mql L5X+FcJiDphD90m31Wtqf0K8A2+4oOdviiFEkn9CRXRVBNgDueU8dT7M31I7a2BoYvIT /tyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=UPD75SrJkwfUqt1p4FKKu9RQG2y83AGNxduxxEZqyhE=; b=Qat4HyLi+LrC+XD2FuxvJARfN3/nvmqELUA1w7CZlgKXOJGFiClzejsfrsW32+u0MZ Lh76JFs+gcHFFHA+4rW3yrjyHqDtJxZL1e1L81nsU1hjnFjZfLeWpkBXH0VPAVFKtMgs FZ6Aqmnxr4Ue4M8YBCu72SbaDJ/VjeCTSqNBIaPhaYxlpNl/dgwvqKlAo3UEveuw7qW0 VVnea/7jbC0O1jkNpkiHXXXKhT3/ui7e0L+Vc7xrcoiDyUxwdxNQnw4/Tcb+Uvk2d1XK 6TlsZQ7zBHcXqluJMzUubSMdwQgvNkgM5QAA/xTd6ziN7j4XPeTnXoRmIye35XjE+jTb tzYA== X-Gm-Message-State: AOAM531e/p4PA+Y1SB7tpLuIfcLzcuapNO+9PwUIcZQ7lLA3NN7Bwbxy nBfZ1MwPQMpOImTzYqznffY= X-Google-Smtp-Source: ABdhPJwWklsHulOAnyaOHzkQ8biR+7iB12oOXT3jlWbtZ3+vYXqOHyigM0n7yMUBgBeh2SCLCjiWFg== X-Received: by 2002:a17:90a:784e:: with SMTP id y14mr34167296pjl.29.1622018635109; Wed, 26 May 2021 01:43:55 -0700 (PDT) Received: from jianchwadeMacBook-Pro.local ([103.112.79.203]) by smtp.gmail.com with ESMTPSA id v15sm15058324pfm.187.2021.05.26.01.43.53 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 May 2021 01:43:54 -0700 (PDT) From: Wang Jianchao Subject: [PATCH V2 6/7] ext4: use bb_free_root to get the free data entry To: Theodore Ts'o , Andreas Dilger Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, lishujin@kuaishou.com References: <164ffa3b-c4d5-6967-feba-b972995a6dfb@gmail.com> <49382052-6238-f1fb-40d1-b6b801b39ff7@gmail.com> <48e33dea-d15e-f211-0191-e01bd3eb17b3@gmail.com> <67eeb65a-d413-c4f9-c06f-d5dcceca0e4f@gmail.com> <0b7915bc-193a-137b-4e52-8aaef8d6fef3@gmail.com> Message-ID: <4df93910-d942-2410-f7cd-cc28f7a00a86@gmail.com> Date: Wed, 26 May 2021 16:43:51 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 MIME-Version: 1.0 In-Reply-To: <0b7915bc-193a-137b-4e52-8aaef8d6fef3@gmail.com> Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org This is also preparing for following async background discard. In this patch, the s_freed_data_list is removed and we iterate all of the group's free_data_root rb tree to get the entry. After this, we needn't operate it when insert and merge free data entry any more. Signed-off-by: Wang Jianchao --- fs/ext4/balloc.c | 2 +- fs/ext4/ext4.h | 4 +-- fs/ext4/mballoc.c | 104 +++++++++++++++++++++++++----------------------------- 3 files changed, 50 insertions(+), 60 deletions(-) diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index 74a5172..8053a5f 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c @@ -652,7 +652,7 @@ int ext4_should_retry_alloc(struct super_block *sb, int *retries) * possible we just missed a transaction commit that did so */ smp_mb(); - if (sbi->s_mb_free_pending == 0) + if (!atomic_read(&sbi->s_mb_free_pending)) return ext4_has_free_clusters(sbi, 1, 0); /* diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 826a56e3..5c5c8e4 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -1525,9 +1525,7 @@ struct ext4_sb_info { unsigned short *s_mb_offsets; unsigned int *s_mb_maxs; unsigned int s_group_info_size; - unsigned int s_mb_free_pending; - struct list_head s_freed_data_list; /* List of blocks to be freed - after commit completed */ + atomic_t s_mb_free_pending; /* tunables */ unsigned long s_stripe; diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index c2bf40a..15715e7 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -354,8 +354,7 @@ static inline struct ext4_free_data *efd_entry(struct rb_node *n) { return rb_entry_safe(n, struct ext4_free_data, efd_node); } -static int ext4_insert_free_data(struct ext4_sb_info *sbi, - struct rb_root *root, struct ext4_free_data *nfd); +static int ext4_insert_free_data(struct rb_root *root, struct ext4_free_data *nfd); /* * The algorithm using this percpu seq counter goes below: @@ -2857,8 +2856,7 @@ int ext4_mb_init(struct super_block *sb) spin_lock_init(&sbi->s_md_lock); spin_lock_init(&sbi->s_bal_lock); - sbi->s_mb_free_pending = 0; - INIT_LIST_HEAD(&sbi->s_freed_data_list); + atomic_set(&sbi->s_mb_free_pending, 0); sbi->s_mb_max_to_scan = MB_DEFAULT_MAX_TO_SCAN; sbi->s_mb_min_to_scan = MB_DEFAULT_MIN_TO_SCAN; @@ -3040,9 +3038,7 @@ static void ext4_free_data_in_buddy(struct super_block *sb, /* we expect to find existing buddy because it's pinned */ BUG_ON(err != 0); - spin_lock(&EXT4_SB(sb)->s_md_lock); - EXT4_SB(sb)->s_mb_free_pending -= entry->efd_count; - spin_unlock(&EXT4_SB(sb)->s_md_lock); + atomic_sub(entry->efd_count, &EXT4_SB(sb)->s_mb_free_pending); db = e4b.bd_info; /* there are blocks to put in buddy to make them really free */ @@ -3084,37 +3080,41 @@ static void ext4_free_data_in_buddy(struct super_block *sb, void ext4_process_freed_data(struct super_block *sb, tid_t commit_tid) { struct ext4_sb_info *sbi = EXT4_SB(sb); - struct ext4_free_data *entry, *tmp; + ext4_group_t ngroups = ext4_get_groups_count(sb); + struct ext4_free_data *fd, *nfd; + struct ext4_group_info *grp; struct bio *discard_bio = NULL; struct list_head freed_data_list; - struct list_head *cut_pos = NULL; - int err; + int err, i; - INIT_LIST_HEAD(&freed_data_list); + if (!atomic_read(&sbi->s_mb_free_pending)) + return; - spin_lock(&sbi->s_md_lock); - list_for_each_entry(entry, &sbi->s_freed_data_list, efd_list) { - if (entry->efd_tid != commit_tid) - break; - cut_pos = &entry->efd_list; + INIT_LIST_HEAD(&freed_data_list); + for (i = 0; i < ngroups; i++) { + grp = ext4_get_group_info(sb, i); + ext4_lock_group(sb, i); + rbtree_postorder_for_each_entry_safe(fd, nfd, + &grp->bb_free_root, efd_node) { + if (fd->efd_tid != commit_tid) + continue; + INIT_LIST_HEAD(&fd->efd_list); + list_add_tail(&fd->efd_list, &freed_data_list); + } + ext4_unlock_group(sb, i); } - if (cut_pos) - list_cut_position(&freed_data_list, &sbi->s_freed_data_list, - cut_pos); - spin_unlock(&sbi->s_md_lock); if (test_opt(sb, DISCARD)) { - list_for_each_entry(entry, &freed_data_list, efd_list) { - err = ext4_issue_discard(sb, entry->efd_group, - entry->efd_start_cluster, - entry->efd_count, + list_for_each_entry(fd, &freed_data_list, efd_list) { + err = ext4_issue_discard(sb, fd->efd_group, + fd->efd_start_cluster, + fd->efd_count, &discard_bio); if (err && err != -EOPNOTSUPP) { ext4_msg(sb, KERN_WARNING, "discard request in" " group:%d block:%d count:%d failed" - " with %d", entry->efd_group, - entry->efd_start_cluster, - entry->efd_count, err); + " with %d", fd->efd_group, + fd->efd_start_cluster, fd->efd_count, err); } else if (err == -EOPNOTSUPP) break; } @@ -3125,8 +3125,8 @@ void ext4_process_freed_data(struct super_block *sb, tid_t commit_tid) } } - list_for_each_entry_safe(entry, tmp, &freed_data_list, efd_list) - ext4_free_data_in_buddy(sb, entry); + list_for_each_entry_safe(fd, nfd, &freed_data_list, efd_list) + ext4_free_data_in_buddy(sb, fd); } int __init ext4_init_mballoc(void) @@ -5051,32 +5051,27 @@ ext4_fsblk_t ext4_mb_new_blocks(handle_t *handle, * are contiguous, AND the extents were freed by the same transaction, * AND the blocks are associated with the same group. */ -static void ext4_try_merge_freed_extent(struct ext4_sb_info *sbi, - struct ext4_free_data *entry, - struct ext4_free_data *new_entry, - struct rb_root *entry_rb_root) +static void ext4_try_merge_freed_extent(struct rb_root *root, + struct ext4_free_data *fd, struct ext4_free_data *nfd) { - if ((entry->efd_tid != new_entry->efd_tid) || - (entry->efd_group != new_entry->efd_group)) + if ((fd->efd_tid != nfd->efd_tid) || + (fd->efd_group != nfd->efd_group)) return; - if (entry->efd_start_cluster + entry->efd_count == - new_entry->efd_start_cluster) { - new_entry->efd_start_cluster = entry->efd_start_cluster; - new_entry->efd_count += entry->efd_count; - } else if (new_entry->efd_start_cluster + new_entry->efd_count == - entry->efd_start_cluster) { - new_entry->efd_count += entry->efd_count; + if (fd->efd_start_cluster + fd->efd_count == + nfd->efd_start_cluster) { + nfd->efd_start_cluster = fd->efd_start_cluster; + nfd->efd_count += fd->efd_count; + } else if (nfd->efd_start_cluster + nfd->efd_count == + fd->efd_start_cluster) { + nfd->efd_count += fd->efd_count; } else return; - spin_lock(&sbi->s_md_lock); - list_del(&entry->efd_list); - spin_unlock(&sbi->s_md_lock); - rb_erase(&entry->efd_node, entry_rb_root); - kmem_cache_free(ext4_free_data_cachep, entry); + rb_erase(&fd->efd_node, root); + kmem_cache_free(ext4_free_data_cachep, fd); } -static int ext4_insert_free_data(struct ext4_sb_info *sbi, - struct rb_root *root, struct ext4_free_data *nfd) +static int ext4_insert_free_data(struct rb_root *root, + struct ext4_free_data *nfd) { struct rb_node **n = &root->rb_node; struct rb_node *p = NULL; @@ -5100,11 +5095,11 @@ static int ext4_insert_free_data(struct ext4_sb_info *sbi, /* Now try to see the extent can be merged to left and right */ fd = efd_entry(rb_prev(&nfd->efd_node)); if (fd) - ext4_try_merge_freed_extent(sbi, fd, nfd, root); + ext4_try_merge_freed_extent(root, fd, nfd); fd = efd_entry(rb_next(&nfd->efd_node)); if (fd) - ext4_try_merge_freed_extent(sbi, fd, nfd, root); + ext4_try_merge_freed_extent(root, fd, nfd); return 0; } @@ -5122,7 +5117,7 @@ static int ext4_insert_free_data(struct ext4_sb_info *sbi, BUG_ON(e4b->bd_bitmap_page == NULL); BUG_ON(e4b->bd_buddy_page == NULL); - if (ext4_insert_free_data(sbi, &db->bb_free_root, nfd)) { + if (ext4_insert_free_data(&db->bb_free_root, nfd)) { ext4_grp_locked_error(sb, e4b->bd_group, 0, ext4_group_first_block_no(sb, e4b->bd_group) + EXT4_C2B(sbi, nfd->efd_start_cluster), @@ -5140,10 +5135,7 @@ static int ext4_insert_free_data(struct ext4_sb_info *sbi, get_page(e4b->bd_bitmap_page); } - spin_lock(&sbi->s_md_lock); - list_add_tail(&nfd->efd_list, &sbi->s_freed_data_list); - sbi->s_mb_free_pending += nfd->efd_count; - spin_unlock(&sbi->s_md_lock); + atomic_add(nfd->efd_count, &sbi->s_mb_free_pending); return 0; } From patchwork Wed May 26 08:44:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Jianchao X-Patchwork-Id: 1483938 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=ISLCACru; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4FqkyM5Yhtz9s5R for ; Wed, 26 May 2021 18:44:11 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233193AbhEZIpm (ORCPT ); Wed, 26 May 2021 04:45:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38748 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233093AbhEZIpl (ORCPT ); Wed, 26 May 2021 04:45:41 -0400 Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com [IPv6:2607:f8b0:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C5F5BC061574; Wed, 26 May 2021 01:44:09 -0700 (PDT) Received: by mail-pg1-x529.google.com with SMTP id l70so378647pga.1; Wed, 26 May 2021 01:44:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=DwD1vsDnhGHFvon4AA8L3Y8755uSa8fPYo7gWryDG1E=; b=ISLCACruhT1Bfo3sauqeoqOdn9yt3YeULCXL0B6xXPcj5WE8qQqOxVY3qaZCINP3FZ TRNKeMpvsSmi5iNsGnq0tfVIeuhRdfPSMjEwMN/TnzC5fIzLr/acqLuaWBtapno58oGF ChKmfFUi1Qa9uikN8OgDS12d50+wFzLGzf/eZz/f1scRdWmNnYX+ctcpOvJfooFljbKd 9u7VYfEKw5JuGW8O0L5rRxkxvMuE3QNM/nPA1FnaltTroxR0o/W9T8P3FwIveAJg02rR 3iYHcl0DvsXEttPsEPMp3ZoEn++MJ2m3DIRlfOQOsb05di0uVmjPuUrhQ6GPcoXCTbtr TZsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=DwD1vsDnhGHFvon4AA8L3Y8755uSa8fPYo7gWryDG1E=; b=e8XLFlQ0rCZM97Sy/aG5VhfdkxZ9Jrl9JUekKusAd6ASMnQiCf7Cg00hjsqMn5ohL5 2jub9/BdQSm7DFOmELtkwQgrXUUgz61cWvFyQPsjbZ5vEPKWlfeubxKU4z0tQqhrH5pc l3HG/EteXQSMtLsMM+BC7ccOJ5xDij0fnaU7tihP8J2CHmpyb9tfPKeY2hy0HCbiEtWg sr92v7H+79HS7NguJpjcw5NIV5YQwfAw46m1XgcRF9BMshXUpWRhMSPqr+Q0hIpvo4yW nwYtbz9scdW8cTrTMdg7blQv/UXj4axS5VFS2zL9/2c6CsyTohvNSuvg/X7Wjj+OHzP/ 4f0w== X-Gm-Message-State: AOAM533eWXNLl34W84SDNXJKJ8INaFEchTdAu4ImJSATge/91ZCyyHcy t0pixKw/YoJRpiHCTJAf4jQ= X-Google-Smtp-Source: ABdhPJwfLAUIJ7XsHjJYBXL93zKQLXvTSKmeEiFkgLEDGIzfTuvzl2HAV3sWfVXmeo9ju5pOFyoswQ== X-Received: by 2002:a63:8f0b:: with SMTP id n11mr23535475pgd.342.1622018649377; Wed, 26 May 2021 01:44:09 -0700 (PDT) Received: from jianchwadeMacBook-Pro.local ([154.48.252.66]) by smtp.gmail.com with ESMTPSA id x203sm15177676pfc.86.2021.05.26.01.44.07 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 May 2021 01:44:09 -0700 (PDT) From: Wang Jianchao Subject: [PATCH V2 7/7] ext4: get discard out of jbd2 commit kthread contex To: Theodore Ts'o , Andreas Dilger Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, lishujin@kuaishou.com References: <164ffa3b-c4d5-6967-feba-b972995a6dfb@gmail.com> <49382052-6238-f1fb-40d1-b6b801b39ff7@gmail.com> <48e33dea-d15e-f211-0191-e01bd3eb17b3@gmail.com> <67eeb65a-d413-c4f9-c06f-d5dcceca0e4f@gmail.com> <0b7915bc-193a-137b-4e52-8aaef8d6fef3@gmail.com> Message-ID: Date: Wed, 26 May 2021 16:44:06 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 MIME-Version: 1.0 In-Reply-To: <0b7915bc-193a-137b-4e52-8aaef8d6fef3@gmail.com> Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Right now, discard is issued and waited to be completed in jbd2 commit kthread context after the logs are committed. When large amount of files are deleted and discard is flooding, jbd2 commit kthread can be blocked for long time. Then all of the metadata operations can be blocked to wait the log space. One case is the page fault path with read mm->mmap_sem held, which wants to update the file time but has to wait for the log space. When other threads in the task wants to do mmap, then write mmap_sem is blocked. Finally all of the following read mmap_sem requirements are blocked, even the ps command which need to read the /proc/pid/ -cmdline. Our monitor service which needs to read /proc/pid/cmdline used to be blocked for 5 mins. This patch frees the blocks back to buddy after commit and then do discard in a async kworker context in fstrim fashion, namely, - mark blocks to be discarded as used if they have not been allocated - do discard - mark them free After this, jbd2 commit kthread won't be blocked any more by discard and we won't get NOSPC even if the discard is slow or throttled. Link: https://marc.info/?l=linux-kernel&m=162143690731901&w=2 Suggested-by: Theodore Ts'o Signed-off-by: Wang Jianchao Tested-by: Josh Triplett --- fs/ext4/ext4.h | 2 + fs/ext4/mballoc.c | 162 +++++++++++++++++++++++++++++++++--------------------- fs/ext4/mballoc.h | 3 - 3 files changed, 101 insertions(+), 66 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 5c5c8e4..2e48c88 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -1526,6 +1526,7 @@ struct ext4_sb_info { unsigned int *s_mb_maxs; unsigned int s_group_info_size; atomic_t s_mb_free_pending; + struct work_struct s_discard_work; /* tunables */ unsigned long s_stripe; @@ -3306,6 +3307,7 @@ struct ext4_group_info { unsigned long bb_check_counter; #endif struct rb_root bb_free_root; + struct rb_root bb_discard_root; ext4_grpblk_t bb_first_free; /* first free block */ ext4_grpblk_t bb_free; /* total free blocks */ ext4_grpblk_t bb_fragments; /* nr of freespace fragments */ diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 15715e7..feea439 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -332,6 +332,7 @@ static struct kmem_cache *ext4_pspace_cachep; static struct kmem_cache *ext4_ac_cachep; static struct kmem_cache *ext4_free_data_cachep; +static struct workqueue_struct *ext4_discard_wq; /* We create slab caches for groupinfo data structures based on the * superblock block size. There will be one per mounted filesystem for @@ -355,7 +356,10 @@ static inline struct ext4_free_data *efd_entry(struct rb_node *n) return rb_entry_safe(n, struct ext4_free_data, efd_node); } static int ext4_insert_free_data(struct rb_root *root, struct ext4_free_data *nfd); - +static int ext4_try_to_trim_range(struct super_block *sb, + struct ext4_buddy *e4b, ext4_grpblk_t start, + ext4_grpblk_t max, ext4_grpblk_t minblocks); +static void ext4_discard_work(struct work_struct *work); /* * The algorithm using this percpu seq counter goes below: * 1. We sample the percpu discard_pa_seq counter before trying for block @@ -2657,6 +2661,7 @@ int ext4_mb_add_groupinfo(struct super_block *sb, ext4_group_t group, INIT_LIST_HEAD(&meta_group_info[i]->bb_prealloc_list); init_rwsem(&meta_group_info[i]->alloc_sem); meta_group_info[i]->bb_free_root = RB_ROOT; + meta_group_info[i]->bb_discard_root = RB_ROOT; meta_group_info[i]->bb_largest_free_order = -1; /* uninit */ mb_group_bb_bitmap_alloc(sb, meta_group_info[i], group); @@ -2857,6 +2862,7 @@ int ext4_mb_init(struct super_block *sb) spin_lock_init(&sbi->s_md_lock); spin_lock_init(&sbi->s_bal_lock); atomic_set(&sbi->s_mb_free_pending, 0); + INIT_WORK(&sbi->s_discard_work, ext4_discard_work); sbi->s_mb_max_to_scan = MB_DEFAULT_MAX_TO_SCAN; sbi->s_mb_min_to_scan = MB_DEFAULT_MIN_TO_SCAN; @@ -2949,6 +2955,15 @@ int ext4_mb_release(struct super_block *sb) struct kmem_cache *cachep = get_groupinfo_cache(sb->s_blocksize_bits); int count; + if (test_opt(sb, DISCARD)) { + /* + * wait the discard work to drain all of ext4_free_data + */ + queue_work(ext4_discard_wq, &sbi->s_discard_work); + flush_work(&sbi->s_discard_work); + } + + queue_work(ext4_discard_wq, &sbi->s_discard_work); if (sbi->s_group_info) { for (i = 0; i < ngroups; i++) { cond_resched(); @@ -3024,30 +3039,77 @@ static inline int ext4_issue_discard(struct super_block *sb, return sb_issue_discard(sb, discard_block, count, GFP_NOFS, 0); } -static void ext4_free_data_in_buddy(struct super_block *sb, - struct ext4_free_data *entry) +static void ext4_discard_work(struct work_struct *work) { + struct ext4_sb_info *sbi = container_of(work, + struct ext4_sb_info, s_discard_work); + struct super_block *sb = sbi->s_sb; + ext4_group_t ngroups = ext4_get_groups_count(sb); + struct ext4_group_info *grp; + struct ext4_free_data *fd, *nfd; struct ext4_buddy e4b; - struct ext4_group_info *db; - int err, count = 0, count2 = 0; + int i, err; + + for (i = 0; i < ngroups; i++) { + grp = ext4_get_group_info(sb, i); + if (RB_EMPTY_ROOT(&grp->bb_discard_root)) + continue; - mb_debug(sb, "gonna free %u blocks in group %u (0x%p):", - entry->efd_count, entry->efd_group, entry); + err = ext4_mb_load_buddy(sb, i, &e4b); + if (err) { + ext4_warning(sb, "Error %d loading buddy information for %u", + err, i); + continue; + } - err = ext4_mb_load_buddy(sb, entry->efd_group, &e4b); - /* we expect to find existing buddy because it's pinned */ - BUG_ON(err != 0); + ext4_lock_group(sb, i); + rbtree_postorder_for_each_entry_safe(fd, nfd, + &grp->bb_discard_root, efd_node) { + rb_erase(&fd->efd_node, &grp->bb_discard_root); + /* + * If filesystem is umounting, give up the discard + */ + if (sb->s_flags & SB_ACTIVE) + ext4_try_to_trim_range(sb, &e4b, fd->efd_start_cluster, + fd->efd_start_cluster + fd->efd_count - 1, 1); + kmem_cache_free(ext4_free_data_cachep, fd); + } + ext4_unlock_group(sb, i); + ext4_mb_unload_buddy(&e4b); + } +} - atomic_sub(entry->efd_count, &EXT4_SB(sb)->s_mb_free_pending); +static int ext4_free_data_in_buddy(struct super_block *sb, + ext4_group_t group, tid_t commit_tid) +{ + struct ext4_buddy e4b; + struct ext4_group_info *db; + struct ext4_free_data *fd, *nfd; + int cnt, nr_fd; + /* we expect to find existing buddy because it's pinned */ + BUG_ON(ext4_mb_load_buddy(sb, group, &e4b)); db = e4b.bd_info; - /* there are blocks to put in buddy to make them really free */ - count += entry->efd_count; - count2++; - ext4_lock_group(sb, entry->efd_group); - /* Take it out of per group rb tree */ - rb_erase(&entry->efd_node, &(db->bb_free_root)); - mb_free_blocks(NULL, &e4b, entry->efd_start_cluster, entry->efd_count); + cnt = 0; + nr_fd = 0; + ext4_lock_group(sb, group); + rbtree_postorder_for_each_entry_safe(fd, nfd, + &db->bb_free_root, efd_node) { + if (fd->efd_tid != commit_tid) + continue; + + mb_debug(sb, "gonna free %u blocks in group %u (0x%p):", + fd->efd_count, fd->efd_group, fd); + atomic_sub(fd->efd_count, &EXT4_SB(sb)->s_mb_free_pending); + cnt += fd->efd_count; + nr_fd++; + rb_erase(&fd->efd_node, &db->bb_free_root); + mb_free_blocks(NULL, &e4b, fd->efd_start_cluster, fd->efd_count); + if (test_opt(sb, DISCARD)) + ext4_insert_free_data(&db->bb_discard_root, fd); + else + kmem_cache_free(ext4_free_data_cachep, fd); + } /* * Clear the trimmed flag for the group so that the next @@ -3055,22 +3117,22 @@ static void ext4_free_data_in_buddy(struct super_block *sb, * If the volume is mounted with -o discard, online discard * is supported and the free blocks will be trimmed online. */ - if (!test_opt(sb, DISCARD)) + if (!test_opt(sb, DISCARD) && cnt) EXT4_MB_GRP_CLEAR_TRIMMED(db); - if (!db->bb_free_root.rb_node) { + if (RB_EMPTY_ROOT(&db->bb_free_root) && cnt) { /* No more items in the per group rb tree * balance refcounts from ext4_mb_free_metadata() */ put_page(e4b.bd_buddy_page); put_page(e4b.bd_bitmap_page); } - ext4_unlock_group(sb, entry->efd_group); - kmem_cache_free(ext4_free_data_cachep, entry); + ext4_unlock_group(sb, group); ext4_mb_unload_buddy(&e4b); - mb_debug(sb, "freed %d blocks in %d structures\n", count, - count2); + mb_debug(sb, "freed %d blocks in %d structures\n", cnt, nr_fd); + + return nr_fd; } /* @@ -3081,52 +3143,21 @@ void ext4_process_freed_data(struct super_block *sb, tid_t commit_tid) { struct ext4_sb_info *sbi = EXT4_SB(sb); ext4_group_t ngroups = ext4_get_groups_count(sb); - struct ext4_free_data *fd, *nfd; struct ext4_group_info *grp; - struct bio *discard_bio = NULL; - struct list_head freed_data_list; - int err, i; + int i, nr; if (!atomic_read(&sbi->s_mb_free_pending)) return; - INIT_LIST_HEAD(&freed_data_list); - for (i = 0; i < ngroups; i++) { + for (i = 0, nr = 0; i < ngroups; i++) { grp = ext4_get_group_info(sb, i); - ext4_lock_group(sb, i); - rbtree_postorder_for_each_entry_safe(fd, nfd, - &grp->bb_free_root, efd_node) { - if (fd->efd_tid != commit_tid) - continue; - INIT_LIST_HEAD(&fd->efd_list); - list_add_tail(&fd->efd_list, &freed_data_list); - } - ext4_unlock_group(sb, i); - } - - if (test_opt(sb, DISCARD)) { - list_for_each_entry(fd, &freed_data_list, efd_list) { - err = ext4_issue_discard(sb, fd->efd_group, - fd->efd_start_cluster, - fd->efd_count, - &discard_bio); - if (err && err != -EOPNOTSUPP) { - ext4_msg(sb, KERN_WARNING, "discard request in" - " group:%d block:%d count:%d failed" - " with %d", fd->efd_group, - fd->efd_start_cluster, fd->efd_count, err); - } else if (err == -EOPNOTSUPP) - break; - } - - if (discard_bio) { - submit_bio_wait(discard_bio); - bio_put(discard_bio); - } + if (RB_EMPTY_ROOT(&grp->bb_free_root)) + continue; + nr += ext4_free_data_in_buddy(sb, i, commit_tid); } - list_for_each_entry_safe(fd, nfd, &freed_data_list, efd_list) - ext4_free_data_in_buddy(sb, fd); + if (nr && test_opt(sb, DISCARD)) + queue_work(ext4_discard_wq, &sbi->s_discard_work); } int __init ext4_init_mballoc(void) @@ -3146,8 +3177,13 @@ int __init ext4_init_mballoc(void) if (ext4_free_data_cachep == NULL) goto out_ac_free; - return 0; + ext4_discard_wq = alloc_workqueue("ext4discard", WQ_UNBOUND, 0); + if (!ext4_discard_wq) + goto out_free_data; + return 0; +out_free_data: + kmem_cache_destroy(ext4_free_data_cachep); out_ac_free: kmem_cache_destroy(ext4_ac_cachep); out_pa_free: diff --git a/fs/ext4/mballoc.h b/fs/ext4/mballoc.h index e75b474..d76286b 100644 --- a/fs/ext4/mballoc.h +++ b/fs/ext4/mballoc.h @@ -79,9 +79,6 @@ #define MB_DEFAULT_MAX_INODE_PREALLOC 512 struct ext4_free_data { - /* this links the free block information from sb_info */ - struct list_head efd_list; - /* this links the free block information from group_info */ struct rb_node efd_node;