From patchwork Sat Mar 4 07:02:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yu Kuai X-Patchwork-Id: 64166 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp808292wrd; Fri, 3 Mar 2023 23:06:54 -0800 (PST) X-Google-Smtp-Source: AK7set+RCdr9cS1mnSQCY9o3nDbm4wl8FaiYDJlGzcN4blUSCXL3QcUqAXMvRS/q0rp1TzLjwTcJ X-Received: by 2002:a62:64cc:0:b0:5db:bade:cf18 with SMTP id y195-20020a6264cc000000b005dbbadecf18mr4576592pfb.13.1677913613779; Fri, 03 Mar 2023 23:06:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677913613; cv=none; d=google.com; s=arc-20160816; b=PcFcrsCrCfDNSZc2yAjiBzcXA8Z76sqRMn1Jw36pzF+aEuokfQbTyJkd+cdeBlvXsp Z2KOLxiVZpD3Ir341CoUtLEoxieBpv9ALYnvC5T2LqhIt0nK8xTXNOBB6J3EWfeDwJ1T nAEIc3KK7C958X4M1fT5/8MUZEusSu0ytwxAQL+HKqIiT6q216/W4KmNlcH2ma8hlFdG vm/zsQfXXbSdxuPhSgnDxElMhdNsDB5VIyC5vuQ4SZK4vytVKln/ontXsCGTIbVlnSNm YlRa0rSlBXwuPzlBG/gnJ1HECqlRfwi3dj46AEg5LOLnSZu+uOF3O1JgtCQ5x5NW4yy6 DjTw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=DjEDlVuBVpp/nycm3UVWjA3bjZXQhXaIzhuVWxQ35iQ=; b=i3uOr+lq5I9Kzwvk626HCmv2eR+fwNs1dDSjvN61c66LAAiBq4gmoonFwBoEO/SJFM yHd50deJCCWzfUGrXjAHaO5/fuhajGwNzUX+L9uRuBPAuKBN26VZXJpqwzrBpgTcE+P/ C31csBWrFHddAwRsfe9oBPenpOBQ5vvMbX50EXnTGKJXZ2MKsKcXVJ1ciL5QldWiWfea 2U8BYwFMZVinYjVSYRXGmhqmJw8NMoIFhI+Xwy8bSeA+qPWUuZp3dKygE3DhCalwdUvh 1wftHUkyqYEOhqYl421bvXexUtdtIYRadELaz7DNi4LGQWLLN7rGhD+kayY52OrZpPAy jzqQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id x15-20020aa79acf000000b0057692dddc15si4274539pfp.19.2023.03.03.23.06.38; Fri, 03 Mar 2023 23:06:53 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229684AbjCDGjB (ORCPT + 99 others); Sat, 4 Mar 2023 01:39:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42578 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229476AbjCDGjA (ORCPT ); Sat, 4 Mar 2023 01:39:00 -0500 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4F5F911656; Fri, 3 Mar 2023 22:38:59 -0800 (PST) Received: from mail02.huawei.com (unknown [172.30.67.169]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4PTFYB2lhtz4f3jJ2; Sat, 4 Mar 2023 14:38:54 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.127.227]) by APP3 (Coremail) with SMTP id _Ch0CgCnUyF_5wJkKh8_EQ--.5411S4; Sat, 04 Mar 2023 14:38:56 +0800 (CST) From: Yu Kuai To: song@kernel.org Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next] md: fix soft lockup in status_resync Date: Sat, 4 Mar 2023 15:02:13 +0800 Message-Id: <20230304070213.1137011-1-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-CM-TRANSID: _Ch0CgCnUyF_5wJkKh8_EQ--.5411S4 X-Coremail-Antispam: 1UD129KBjvJXoW7tw4UXryrCry7tFW3Ar1DWrg_yoW8Aryrpa 93ZFWxArW5tFWxJrZxJF1UXa4rAa4FyFZrKF4Uuw43ZF1fCr1jyr1UCF4DWrykWFykJrW0 qa4Fyr98WF1UZ3DanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUyv14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26ryj6F1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4j 6F4UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s 0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xII jxv20xvE14v26r106r15McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr 1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48J MxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwV AFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUAVWUtwCIc40Y0x0EwIxGrwCI42IY6xIIjxv2 0xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4 v20xvaj40_Gr0_Zr1lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AK xVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VU1a9aPUUUUU== X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_NONE, SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759419945290975645?= X-GMAIL-MSGID: =?utf-8?q?1759419945290975645?= From: Yu Kuai status_resync() will calculate 'curr_resync - recovery_active' to show user a progress bar like following: [============>........] resync = 61.4% 'curr_resync' and 'recovery_active' is updated in md_do_sync(), and status_resync() can read them concurrently, hence it's possible that 'curr_resync - recovery_active' can overflow to a huge number. In this case status_resync() will be stuck in the loop to print a large amount of '=', which will end up soft lockup. Fix the problem by setting 'resync' to MD_RESYNC_ACTIVE in this case, this way resync in progress will be reported to user. Signed-off-by: Yu Kuai --- drivers/md/md.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 927a43db5dfb..ee405e793fc7 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -8029,16 +8029,16 @@ static int status_resync(struct seq_file *seq, struct mddev *mddev) } else if (resync > max_sectors) { resync = max_sectors; } else { - resync -= atomic_read(&mddev->recovery_active); - if (resync < MD_RESYNC_ACTIVE) { - /* - * Resync has started, but the subtraction has - * yielded one of the special values. Force it - * to active to ensure the status reports an - * active resync. - */ + res = atomic_read(&mddev->recovery_active); + /* + * Resync has started, but the subtraction has overflowed or + * yielded one of the special values. Force it to active to + * ensure the status reports an active resync. + */ + if (resync < res || resync - res < MD_RESYNC_ACTIVE) resync = MD_RESYNC_ACTIVE; - } + else + resync -= res; } if (resync == MD_RESYNC_NONE) {