Received: by 2002:a05:6a10:6d25:0:0:0:0 with SMTP id gq37csp1852253pxb; Mon, 13 Sep 2021 06:57:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyBj1/eb33WpIiuOKwm4GsNhC6jhbnB+FPMIRzZOsdxLjzNNrG2Q4kBvberVtsb4eH5/Sqx X-Received: by 2002:aa7:c3cb:: with SMTP id l11mr13347004edr.310.1631541460530; Mon, 13 Sep 2021 06:57:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631541460; cv=none; d=google.com; s=arc-20160816; b=xQ7p9WR5HK2kDrAXtvfmQEdW0yh+mexufYLANz633pc/fAurBHOLat/JeIBxCJwGJY xm51BE55d27JKvKE4VSmTCwKrTcaaj/KXFgSurRHoizsb2b7++5qNwuLRgFPdzsnVfU0 vmXMlZjbPPrLLyjGslqXdbbdksjOwVY9UlvQ5F+/gmeg1n+FqEXhG9/O8JUV4FRPQmng JYqp3gnMPcuIIjx3rlp4w+JJQ3EBYL7rrS745YfEN62yiIBZYSZiwfWwA29hascI+o6B yElOtgrKWDFApI84Mj758SK4w/MYdgr3dAg5m/18ZGqS5fcQC1qm/Q8NBRhXUHiNHvev zpGQ== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=bE4VrPIjlKEPdA0qEa0n1EvPIoisXzsT7YUQF5c4G2c=; b=D8YDXO0EP0g0KGf9ECRDBt+q5Q47oA2H2odSOP9dxGD6Q+nXYIQgJGgw7lg8Lo8Cr4 Xn6qNdGJjy7+O5OwfbUBqm+SmbrBui+rgXMFuGoDoEclH+tuu5iHXbQhpVAk3OhfsR3K xnhGWW1NqTarEmGDQ/B2q2eH9Mjf6eNaHaoq1Xdc1/Zcx/7pbZwTF78UrjMXy3GJkkS9 OxDzSTXNWS/NTBZc0+tshwhP8+t2yApJI3Pc2d9Fa3/C1KuIR9EPS3cQzVdUOr9va5N9 wZrQlR7QpjBAQ6jiQRbBsfqEpvxICLOhLaiwX/TsmKQ8Fu5Pf2WRWpNsy8NnAehdkfvv NXNw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=uCLvtdBw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d17si7176711edy.412.2021.09.13.06.57.17; Mon, 13 Sep 2021 06:57:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=uCLvtdBw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244330AbhIMN4T (ORCPT + 99 others); Mon, 13 Sep 2021 09:56:19 -0400 Received: from mail.kernel.org ([198.145.29.99]:40310 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245021AbhIMNxg (ORCPT ); Mon, 13 Sep 2021 09:53:36 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id D8E3F613A1; Mon, 13 Sep 2021 13:34:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1631540087; bh=e/5B6Q4wAkatjvj1iKFdGuQCiiDt4FxzISndYCaHJqg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uCLvtdBwDr3bW6ywst3CwiZ8KSYJSq7aWTDIvSDZEOaL8DXHYNd9Lc1BVnmN3PSW8 /x27UfB9R3FxchMKEKw7iNaRTQCK49GZ6Tdn8KU0BVZjSgCucL2smhBfirWWYNPp2X LXUEun0BSpcYad5FuoLXP5cYtaPDfjPvGMNRuFfg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Peter Oberparleiter , Heiko Carstens , Sasha Levin Subject: [PATCH 5.13 045/300] s390/debug: fix debug area life cycle Date: Mon, 13 Sep 2021 15:11:46 +0200 Message-Id: <20210913131110.861666907@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210913131109.253835823@linuxfoundation.org> References: <20210913131109.253835823@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Peter Oberparleiter [ Upstream commit 9372a82892c2caa6bccab9a4081166fa769699f8 ] Currently allocation and registration of s390dbf debug areas are tied together. As a result, a debug area cannot be unregistered and re-registered while any process has an associated debugfs file open. Fix this by splitting alloc/release from register/unregister. Signed-off-by: Peter Oberparleiter Signed-off-by: Heiko Carstens Signed-off-by: Sasha Levin --- arch/s390/kernel/debug.c | 102 +++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 46 deletions(-) diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index 7d3649dbaa8c..a142671c449b 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c @@ -314,24 +314,6 @@ static debug_info_t *debug_info_create(const char *name, int pages_per_area, goto out; rc->mode = mode & ~S_IFMT; - - /* create root directory */ - rc->debugfs_root_entry = debugfs_create_dir(rc->name, - debug_debugfs_root_entry); - - /* append new element to linked list */ - if (!debug_area_first) { - /* first element in list */ - debug_area_first = rc; - rc->prev = NULL; - } else { - /* append element to end of list */ - debug_area_last->next = rc; - rc->prev = debug_area_last; - } - debug_area_last = rc; - rc->next = NULL; - refcount_set(&rc->ref_count, 1); out: return rc; @@ -391,27 +373,10 @@ static void debug_info_get(debug_info_t *db_info) */ static void debug_info_put(debug_info_t *db_info) { - int i; - if (!db_info) return; - if (refcount_dec_and_test(&db_info->ref_count)) { - for (i = 0; i < DEBUG_MAX_VIEWS; i++) { - if (!db_info->views[i]) - continue; - debugfs_remove(db_info->debugfs_entries[i]); - } - debugfs_remove(db_info->debugfs_root_entry); - if (db_info == debug_area_first) - debug_area_first = db_info->next; - if (db_info == debug_area_last) - debug_area_last = db_info->prev; - if (db_info->prev) - db_info->prev->next = db_info->next; - if (db_info->next) - db_info->next->prev = db_info->prev; + if (refcount_dec_and_test(&db_info->ref_count)) debug_info_free(db_info); - } } /* @@ -635,6 +600,31 @@ static int debug_close(struct inode *inode, struct file *file) return 0; /* success */ } +/* Create debugfs entries and add to internal list. */ +static void _debug_register(debug_info_t *id) +{ + /* create root directory */ + id->debugfs_root_entry = debugfs_create_dir(id->name, + debug_debugfs_root_entry); + + /* append new element to linked list */ + if (!debug_area_first) { + /* first element in list */ + debug_area_first = id; + id->prev = NULL; + } else { + /* append element to end of list */ + debug_area_last->next = id; + id->prev = debug_area_last; + } + debug_area_last = id; + id->next = NULL; + + debug_register_view(id, &debug_level_view); + debug_register_view(id, &debug_flush_view); + debug_register_view(id, &debug_pages_view); +} + /** * debug_register_mode() - creates and initializes debug area. * @@ -664,19 +654,16 @@ debug_info_t *debug_register_mode(const char *name, int pages_per_area, if ((uid != 0) || (gid != 0)) pr_warn("Root becomes the owner of all s390dbf files in sysfs\n"); BUG_ON(!initialized); - mutex_lock(&debug_mutex); /* create new debug_info */ rc = debug_info_create(name, pages_per_area, nr_areas, buf_size, mode); - if (!rc) - goto out; - debug_register_view(rc, &debug_level_view); - debug_register_view(rc, &debug_flush_view); - debug_register_view(rc, &debug_pages_view); -out: - if (!rc) + if (rc) { + mutex_lock(&debug_mutex); + _debug_register(rc); + mutex_unlock(&debug_mutex); + } else { pr_err("Registering debug feature %s failed\n", name); - mutex_unlock(&debug_mutex); + } return rc; } EXPORT_SYMBOL(debug_register_mode); @@ -705,6 +692,27 @@ debug_info_t *debug_register(const char *name, int pages_per_area, } EXPORT_SYMBOL(debug_register); +/* Remove debugfs entries and remove from internal list. */ +static void _debug_unregister(debug_info_t *id) +{ + int i; + + for (i = 0; i < DEBUG_MAX_VIEWS; i++) { + if (!id->views[i]) + continue; + debugfs_remove(id->debugfs_entries[i]); + } + debugfs_remove(id->debugfs_root_entry); + if (id == debug_area_first) + debug_area_first = id->next; + if (id == debug_area_last) + debug_area_last = id->prev; + if (id->prev) + id->prev->next = id->next; + if (id->next) + id->next->prev = id->prev; +} + /** * debug_unregister() - give back debug area. * @@ -718,8 +726,10 @@ void debug_unregister(debug_info_t *id) if (!id) return; mutex_lock(&debug_mutex); - debug_info_put(id); + _debug_unregister(id); mutex_unlock(&debug_mutex); + + debug_info_put(id); } EXPORT_SYMBOL(debug_unregister); -- 2.30.2