From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933069AbbLTN3p (ORCPT ); Sun, 20 Dec 2015 08:29:45 -0500 Received: from www.linutronix.de ([62.245.132.108]:45297 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753811AbbLTN3o (ORCPT ); Sun, 20 Dec 2015 08:29:44 -0500 Date: Sun, 20 Dec 2015 14:28:48 +0100 (CET) From: Thomas Gleixner To: Jacob Pan cc: LKML , Linux PM , Rafael Wysocki , Peter Zijlstra , X86 Kernel , Srinivas Pandruvada , "H. Peter Anvin" , Ingo Molnar Subject: Re: [PATCH 1/2] x86/msr: add on cpu read/modify/write function In-Reply-To: <1449873637-24300-2-git-send-email-jacob.jun.pan@linux.intel.com> Message-ID: References: <1449873637-24300-1-git-send-email-jacob.jun.pan@linux.intel.com> <1449873637-24300-2-git-send-email-jacob.jun.pan@linux.intel.com> User-Agent: Alpine 2.11 (DEB 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Jacob, On Fri, 11 Dec 2015, Jacob Pan wrote: > +static inline int rmwmsrl_safe_on_cpu(unsigned int cpu, u32 msr_no, u64 mask, u64 bits) > +{ > + int err; > + u64 val; > + > + err = rdmsrl_safe(msr_no, &val); > + if (err) > + goto out; > + > + val &= ~mask; > + val |= bits; > + > + err = wrmsrl_safe(msr_no, val); > +out: > + return err; > +} .... > +static void __rmwmsrl_safe(void *info) > +{ > + int err; > + struct msr_action *ma = info; > + u64 val; > + > + err = rdmsrl_safe(ma->msr_no, &val); > + if (err) > + goto out; > + > + val &= ~ma->mask; > + val |= ma->bits; > + > + err = wrmsrl_safe(ma->msr_no, val); > + > +out: > + ma->err = err; So this is a copy of the above !SMP inline. What's wrong with providing: int rmwmsrl_safe(msr_no, clear_mask, set_mask) in x86/lib/msr.c and make the !SMP variant of rdmsrl_safe_on_cpu() and that variant for the SMP case a simple wrapper around it? static void remote_rmwmsrl_safe(void *info) { struct msr_action *ma = info; return rmwmsrl_safe(ma->msr, ma->clear_mask, ma->set_mask); } No gotos, no pointless code duplication. Just simple. Thanks, tglx