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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/