Received: by 2002:a05:6a10:6d25:0:0:0:0 with SMTP id gq37csp1824524pxb; Mon, 13 Sep 2021 06:23:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzXNjLK4jv6HuaEsYVQZi5JghRdSNKxF+a9TsOl/baFvfWNEqi8vLwKat05TWyETRepKS5F X-Received: by 2002:a5e:dd42:: with SMTP id u2mr9071828iop.157.1631539414719; Mon, 13 Sep 2021 06:23:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631539414; cv=none; d=google.com; s=arc-20160816; b=ztX7pvLDbX+Wes1PaRoeF3hdHhi8DAVkeF1DK2Oap/Xw3FfDTGXdAo1RsjpS7Bniu7 UyaWy/md9BndEG+ML8cbCjSYZ+fMqQ+p2eE+5p7b5CoJ023nUpMpUUO6OeF6FS75THtg 3wPnAbXKYlIwtx9KSLKBQ4gDwfD1ccWob+Nx0g75J22pD/Cedg6smfFvjav1pncrEwLm 4BIWWVlqMZuM2wrQJFR5HVazFWWmmiyOic42DKySz8v10BNT9ulQGbAO0ZzIjeZtBcZS vX1iC9UOHXZIoL/EWGKcswlU3qcm+89E57+WbrsypDbD830tn/+UCxaKILmHZBDBHA+y PMFg== 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=W+4908rdOvIkNUXXpsKpe+HK90/XeTnkubCTiowAqx0=; b=RiTlJFyuz2YWKleZO2QW+jwzvfMVafoxXMKQEUaAcb+IDu1rbQNsFsJxpcBFj7QSdO mc5we+J111oU9wQ7pd8BidYsH/m/Q4DcgXee4zBjZYhfFGEMg2NqiXFdcunU3jvpWdfo UG71AZfa692zSE+WsDl/qOoH+XOfKQfth+VRm4xSdP687wfFwxLkC0A/Ds+tEwFYHdFd 63OnLkXz7W8LK4T4UgYJwZp39G/EvaE0ZUGWqroyBWyLjheE7pJsjVk18lDozeXx2jP0 i8ermyroHXDLp/QwD4Li4YLCM3Y+ARUetdY4psqmj3vffvMr7dFEImHaUQdJEhK41UM/ xC6A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=jPXj34Il; 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 i12si7415871ilu.9.2021.09.13.06.23.22; Mon, 13 Sep 2021 06:23:34 -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=jPXj34Il; 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 S235651AbhIMNWA (ORCPT + 99 others); Mon, 13 Sep 2021 09:22:00 -0400 Received: from mail.kernel.org ([198.145.29.99]:34844 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240200AbhIMNU4 (ORCPT ); Mon, 13 Sep 2021 09:20:56 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id BFE0C61056; Mon, 13 Sep 2021 13:19:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1631539157; bh=I5llsKYYxFWQTyhl7lYYfvhIRgWslQdGtn9D9lLw5jw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jPXj34Ilaty8Z0S+1/ywNyPmCT2P9eZ13zXR28dxUT9iB1IH36a6EtFFIVPMECmTw /Oy9NBpRI7sfQZ0RGhHi6SlZw4qaAFBDqsWO6q/FNjaQ4N+byezJcDty3fnQ4egAzw wiGuhOrGJp7Gu/6aG+Dva8uqwdSgRq+SzZFUwrk8= 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.4 030/144] s390/debug: fix debug area life cycle Date: Mon, 13 Sep 2021 15:13:31 +0200 Message-Id: <20210913131048.963887427@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210913131047.974309396@linuxfoundation.org> References: <20210913131047.974309396@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 7184d55d87aa..b1aadc3ad065 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c @@ -327,24 +327,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; @@ -404,27 +386,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); - } } /* @@ -648,6 +613,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. * @@ -677,19 +667,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); @@ -718,6 +705,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. * @@ -731,8 +739,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