Received: by 2002:a05:6a10:6d25:0:0:0:0 with SMTP id gq37csp1880452pxb; Mon, 13 Sep 2021 07:26:42 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz65eJdwpTPoqMdJ2FxdsNoohij1tPbz3ZGxgEOYz8+uZtXcrofeIi7sRg1VlO8/HJtBIRL X-Received: by 2002:a05:6e02:921:: with SMTP id o1mr4488807ilt.289.1631543202210; Mon, 13 Sep 2021 07:26:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631543202; cv=none; d=google.com; s=arc-20160816; b=vnZCEi2ZbO7yNCvQSr6+DlfMt3G4DJ7EPn3ySEQ5NbShVv9HMuXdVRvOXlaOyFPTEe eDgBzo1fRUvua8WuSYJcu3bRqkpXX46Ra2ZkaVngIxwSwdRr/Tv7occ2SrzkkfgqjO3d mYu9PwnUy5gKQoNBFh5tzwDXKp4tHh1xpggbl8wOYh7TUzrf0tulqffBNnAnNRB91cYD 3n+ESjTnmSPR9zy3aNXjHXYa9E7XmRkS5GMhSxVPZN4xBHFM2w+CcDVn98sZWPPitOKO RwhEpE0ciBggK6As/6AacoZur+LgiHrhd32BJhhPWzP97bQUdfcw3sIvJkl/HSkPONuK UNsA== 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=8HkTOs3pYFl0BsJyyhuT0DzzYj+GPLGe9spb9QS1o7w=; b=Fo+jxCX72htRFKW97lRUvozLbAbWayfkKuC+Q4sUWiOrMkb9mOHA0Q2yOP+uL+DiZj sPAexgVXjIes3UUy7YIqVKmiieDc/y0e2P+4SB0u5DJvtZ1bSkwYi7gDN2YhnxfmBboY A2TtKX46xMDuDNn9hIcd6SgRCz3Pm258LizcTP39Ch+TfMOAm9Io8pBvNTa2DcKkjcms oaEj//3J9akTYw5OmWJK2aXoJiAtMcEITthTcTP1ddk6KsqbgJQYfiuW5xqwo7Rs34l4 8AHmKaYHcaJlDiCSxVbkkA804eUWkTBySPO1tWaQovOfznuxq+svIa3weD1jeip7QZYv Db8g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=NOxbng+P; 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 w6si8683327ilu.79.2021.09.13.07.26.30; Mon, 13 Sep 2021 07:26:42 -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=NOxbng+P; 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 S1344810AbhIMO0U (ORCPT + 99 others); Mon, 13 Sep 2021 10:26:20 -0400 Received: from mail.kernel.org ([198.145.29.99]:39392 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346167AbhIMOUq (ORCPT ); Mon, 13 Sep 2021 10:20:46 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3BA5F6112D; Mon, 13 Sep 2021 13:46:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1631540814; bh=Vt4X1GfOJIguGKeb67HBLpOirbcmS1Cll+V9CQkzbRo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NOxbng+PSoQOp+hc01udoHEfpsd1L1ykbqIytd655d02eXsG0cyCeXtxEgTz2o/TH +zkhOIXFbqD5W7d09LoFzI/25JjYPLXFXH2kb91PjHCQ42wrkKSp9Dfuo+oqr7NTSA k4sb02Ku2Adod4GpEUE233ouAARfVKBIyARy/sts= 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.14 045/334] s390/debug: fix debug area life cycle Date: Mon, 13 Sep 2021 15:11:39 +0200 Message-Id: <20210913131114.959292273@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210913131113.390368911@linuxfoundation.org> References: <20210913131113.390368911@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 0dbe48f550ff..05b765b8038e 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