From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965234AbcIHI7S (ORCPT ); Thu, 8 Sep 2016 04:59:18 -0400 Received: from Galois.linutronix.de ([146.0.238.70]:42905 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965119AbcIHI7P (ORCPT ); Thu, 8 Sep 2016 04:59:15 -0400 Date: Thu, 8 Sep 2016 10:56:36 +0200 (CEST) From: Thomas Gleixner To: Fenghua Yu cc: "H. Peter Anvin" , Ingo Molnar , Tony Luck , Peter Zijlstra , Tejun Heo , Borislav Petkov , Stephane Eranian , Marcelo Tosatti , David Carrillo-Cisneros , Shaohua Li , Ravi V Shankar , Vikas Shivappa , Sai Prakhya , linux-kernel , x86 Subject: Re: [PATCH v2 08/33] x86/intel_rdt: Add Class of service management In-Reply-To: <1473328647-33116-9-git-send-email-fenghua.yu@intel.com> Message-ID: References: <1473328647-33116-1-git-send-email-fenghua.yu@intel.com> <1473328647-33116-9-git-send-email-fenghua.yu@intel.com> User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 8 Sep 2016, Fenghua Yu wrote: > @@ -0,0 +1,12 @@ > +#ifndef _RDT_H_ > +#define _RDT_H_ The standard guard is _ASM_X86_RDT_H > + > +#ifdef CONFIG_INTEL_RDT What's the purpose of sticking a struct definition inside an ifdef? > + > +struct clos_cbm_table { > + unsigned long cbm; > + unsigned int clos_refcnt; Please proper align the struct members for readability sake unsigned long cbm; unsigned int clos_refcnt; Adding a kerneldoc comment above the struct explaining it would not hurting either. > +/* > + * cctable maintains 1:1 mapping between CLOSid and cache bitmask. > + */ > +static struct clos_cbm_table *cctable; > +/* > + * closid availability bit map. > + */ > +unsigned long *closmap; > +static DEFINE_MUTEX(rdtgroup_mutex); > + > +static inline void closid_get(u32 closid) > +{ > + struct clos_cbm_table *cct = &cctable[closid]; > + > + lockdep_assert_held(&rdtgroup_mutex); > + > + cct->clos_refcnt++; So the whole thing can be written with a single line at the single call site. cc_table[closid].clos_refcnt++; And that already has the lockdep_assert_held() check. While companies might pay based on line counts, kernel development asks for readable and sensible code. > +} > + > +static int closid_alloc(u32 *closid) > +{ > + u32 maxid; > + u32 id; Please put variables with the same type into one line. There is no value in wasting screen estate. > + > + lockdep_assert_held(&rdtgroup_mutex); > + > + maxid = boot_cpu_data.x86_cache_max_closid; > + id = find_first_zero_bit(closmap, maxid); > + if (id == maxid) > + return -ENOSPC; > + > + set_bit(id, closmap); > + closid_get(id); > + *closid = id; > + > + return 0; > +} > + > +static inline void closid_free(u32 closid) > +{ > + clear_bit(closid, closmap); > + cctable[closid].cbm = 0; > +} > + > +static void closid_put(u32 closid) > +{ > + struct clos_cbm_table *cct = &cctable[closid]; > + > + lockdep_assert_held(&rdtgroup_mutex); > + if (WARN_ON(!cct->clos_refcnt)) > + return; > + > + if (!--cct->clos_refcnt) > + closid_free(closid); > +} > > static int __init intel_rdt_late_init(void) > { > struct cpuinfo_x86 *c = &boot_cpu_data; > + u32 maxid; > + int err = 0, size; > > if (!cpu_has(c, X86_FEATURE_CAT_L3)) > return -ENODEV; > > - pr_info("Intel cache allocation detected\n"); > + maxid = c->x86_cache_max_closid; > > - return 0; > + size = maxid * sizeof(struct clos_cbm_table); > + cctable = kzalloc(size, GFP_KERNEL); > + if (!cctable) { > + err = -ENOMEM; > + goto out_err; I told you that before: Using a goto just to return err is pointless and silly. What the hell is wrong with return -ENOMEM; ??? > + } > + > + size = BITS_TO_LONGS(maxid) * sizeof(long); > + closmap = kzalloc(size, GFP_KERNEL); > + if (!closmap) { > + kfree(cctable); > + err = -ENOMEM; > + goto out_err; Groan. > + } > + > + pr_info("Intel cache allocation enabled\n"); > +out_err: