Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp799444ybz; Fri, 24 Apr 2020 09:28:02 -0700 (PDT) X-Google-Smtp-Source: APiQypJ+iyFsCm1OPMt/D6ssV5xISvhRBJ5XVC0hRbeNrfyA6VSthBJ54b9dp4nLUTuPkYySFECK X-Received: by 2002:a05:6402:16d5:: with SMTP id r21mr8493330edx.150.1587745682054; Fri, 24 Apr 2020 09:28:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587745682; cv=none; d=google.com; s=arc-20160816; b=rUvqKnulkBzEyVOWxbRJQAPZgc9orXC6lST8kxMwwzvw6AUZf9Zemy5DWwMy9nFdR4 vDPgfnFmNk+n0zPDcmFzIIqqwKPz95Ct3ShVuuEFuWrkdnsVlpECHc7qxDnAJlMJ/OZL Bq64f9n3XaDJrcWsDiNm6e+Iu6tuG1tIIGqmncRMk4Yvo+F2MNLT4SoF5xNXJPjrVMNq 7w1dcI4VcweqRGmXstuiBl8b6vywqloiZvPTnOboQ8yB2TL/TItW0YFu37Q4DlH2CbKR OgNex+K4urygj4oNRWP7RVS96khI9nhyoLmmAeOwgP4hiqhFRtwK9OVemFZDbuWbbuLS aeXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=1/3wK0YNoGRPgjYsn9oUGnsqgYhnz2Yh2ZUOTxwEzQ4=; b=lw4hJJOqTakVAkIP1ssC1uxAwdHyiQ2fyI5MJo02N20JQbTfbqS+N03cULFDxberuG O4VifJriP4SqbOJzukkI7UmF8UdWj27ba6f4WjtGNaN5cy/VEKDIhVOtHk4tjCRQB1he xTegWWmSHoJVFnon/x8Fj/R67oEV/h9Sjomti7KbJcaZyppm1reO0K4UXqby9XEp8RCw hJhrQxTzcl5lT5tIqyjPN6HBxX9az+4RsDBPA/VML19GmaP4KstG0vTGEwCjuEeWR3I+ fwVGFaona4Cf9PEAkVdqSyAx9bBmDv8qM2z3FdQtI8KnE7I8YJTQ5Uvc9j4VRbNcRqJv uUlA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@alien8.de header.s=dkim header.b=eohtvaGF; 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=alien8.de Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y23si3149935edt.99.2020.04.24.09.27.37; Fri, 24 Apr 2020 09:28:02 -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=@alien8.de header.s=dkim header.b=eohtvaGF; 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=alien8.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728777AbgDXQWe (ORCPT + 99 others); Fri, 24 Apr 2020 12:22:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60384 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728555AbgDXQWF (ORCPT ); Fri, 24 Apr 2020 12:22:05 -0400 Received: from mail.skyhub.de (mail.skyhub.de [IPv6:2a01:4f8:190:11c2::b:1457]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CE482C09B046; Fri, 24 Apr 2020 09:22:04 -0700 (PDT) Received: from zn.tnic (p200300EC2F1D0400A18A6B210CB54187.dip0.t-ipconnect.de [IPv6:2003:ec:2f1d:400:a18a:6b21:cb5:4187]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.skyhub.de (SuperMail on ZX Spectrum 128k) with ESMTPSA id C98B51EC0DA8; Fri, 24 Apr 2020 18:22:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alien8.de; s=dkim; t=1587745323; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:in-reply-to:in-reply-to: references:references; bh=1/3wK0YNoGRPgjYsn9oUGnsqgYhnz2Yh2ZUOTxwEzQ4=; b=eohtvaGF3ILzwSoVe1lk9xga7qFL5WdSdne1qA/a3ULGzwdkQMm5a0/Bup1IZMzqWii64A glshfR87GSezL1s683/XIbPr7Xkyl2NwkwffwIPRqkBDXw4zYeMM+Qbpp8068s/RG6Gsxo BQSfhloSuc5+9wpmXaYJzZLIo/Ii/YI= Date: Fri, 24 Apr 2020 18:21:57 +0200 From: Borislav Petkov To: Robert Richter Cc: Mauro Carvalho Chehab , Tony Luck , James Morse , Aristeu Rozanski , Matthias Brugger , linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 04/10] EDAC/ghes: Make SMBIOS handle private data to ghes Message-ID: <20200424162157.GB6916@zn.tnic> References: <20200422115814.22205-1-rrichter@marvell.com> <20200422115814.22205-5-rrichter@marvell.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20200422115814.22205-5-rrichter@marvell.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Apr 22, 2020 at 01:58:08PM +0200, Robert Richter wrote: > diff --git a/drivers/edac/ghes_edac.c b/drivers/edac/ghes_edac.c > index 39efce0df881..23adb7674f9b 100644 > --- a/drivers/edac/ghes_edac.c > +++ b/drivers/edac/ghes_edac.c > @@ -15,6 +15,12 @@ > #include "edac_module.h" > #include > > +struct ghes_dimm { Simply struct dimm > + struct list_head entry; > + struct dimm_info *dimm; > + u16 handle; > +}; > + > struct ghes_mci { > struct mem_ctl_info *mci; > > @@ -42,6 +48,16 @@ static DEFINE_MUTEX(ghes_reg_mutex); > */ > static DEFINE_SPINLOCK(ghes_lock); > > +/* > + * Locking: > + * > + * dimms, ghes_dimm_pool: ghes_reg_mutex > + * ghes_dimm_list: ghes_lock > + */ > +static struct ghes_dimm *dimms; > +static LIST_HEAD(ghes_dimm_list); > +static LIST_HEAD(ghes_dimm_pool); Those are static lists, no need to prefix them with "ghes_". There's too much "ghes" in that code. :) > + > /* "ghes_edac.force_load=1" skips the platform check */ > static bool __read_mostly force_load; > module_param(force_load, bool, 0); > @@ -72,11 +88,63 @@ struct memdev_dmi_entry { > u16 conf_mem_clk_speed; > } __attribute__((__packed__)); > > -struct ghes_edac_dimm_fill { > +struct dimm_fill { > + struct list_head dimms; > struct mem_ctl_info *mci; > unsigned int count; > }; > > +static int ghes_dimm_pool_create(int num_dimm) Yeah, drop "ghes_" here too. I'm not going to comment on this in the rest of the patchset but for the next version, please drop the "ghes_" prefix from static functions and members - it unnecessarily gets in the way when reading the code. > +{ > + struct ghes_dimm *ghes_dimm; > + > + if (!num_dimm) > + return 0; > + > + lockdep_assert_held(ghes_reg_mutex); > + > + dimms = kcalloc(num_dimm, sizeof(*dimms), GFP_KERNEL); > + if (!dimms) > + return -ENOMEM; > + > + for (ghes_dimm = dimms; ghes_dimm < dimms + num_dimm; ghes_dimm++) And with the above shortening of names, this loop becomes: for (d = dimms; d < dimms + num_dimms; d++) list_add(&d->entry, &dimm_pool); Simple. > + > + return 0; > +} > + > +static void ghes_dimm_pool_destroy(void) > +{ > + lockdep_assert_held(ghes_reg_mutex); > + INIT_LIST_HEAD(&ghes_dimm_pool); > + kfree(dimms); > +} > + > +static struct ghes_dimm *ghes_dimm_alloc(struct dimm_info *dimm, u16 handle) > +{ > + struct ghes_dimm *ghes_dimm; > + > + lockdep_assert_held(ghes_reg_mutex); The 0day bot caught it already - this needs to be a ptr. Please test with PROVE_LOCKING enabled before sending next time. > + > + ghes_dimm = list_first_entry_or_null(&ghes_dimm_pool, > + struct ghes_dimm, entry); Let that line stick out. > + > + /* should be always non-zero */ > + if (!WARN_ON_ONCE(!ghes_dimm)) { > + ghes_dimm->dimm = dimm; > + ghes_dimm->handle = handle; > + list_del(&ghes_dimm->entry); > + } > + > + return ghes_dimm; > +} > + > +static void ghes_dimm_release(struct list_head *dimms) > +{ > + lockdep_assert_held(ghes_reg_mutex); > + list_splice(dimms, &ghes_dimm_pool); > +} > + > static void ghes_edac_count_dimms(const struct dmi_header *dh, void *arg) > { > int *num_dimm = arg; ... > @@ -547,12 +626,18 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev) > > spin_lock_irqsave(&ghes_lock, flags); > ghes_pvt = pvt; > + list_splice_tail(&dimm_fill.dimms, &ghes_dimm_list); > spin_unlock_irqrestore(&ghes_lock, flags); > > /* only set on success */ > refcount_set(&ghes_refcount, 1); > > unlock: > + if (rc < 0) { > + ghes_dimm_pool_destroy(); > + pr_err("Can't register at EDAC core: %d\n", rc); with the EDAC core: > + } > + > mutex_unlock(&ghes_reg_mutex); > > return rc; > @@ -562,6 +647,7 @@ void ghes_edac_unregister(struct ghes *ghes) > { > struct mem_ctl_info *mci; > unsigned long flags; > + LIST_HEAD(dimm_list); > > mutex_lock(&ghes_reg_mutex); > > @@ -574,14 +660,19 @@ void ghes_edac_unregister(struct ghes *ghes) > spin_lock_irqsave(&ghes_lock, flags); > mci = ghes_pvt ? ghes_pvt->mci : NULL; > ghes_pvt = NULL; > + list_splice_init(&ghes_dimm_list, &dimm_list); Why do you need to do this? Can't you simply do: ghes_dimm_release(&ghes_dimm_list); here? Btw, please add an explanation above ghes_dimm_list and ghes_dimm_pool what those are and what the rules are: stuff gets added on register to what list and freed on unreg from what list, etc. So that it is clear upon a quick glance. Thx. -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette