Messages in this thread |  | | Date | Sun, 20 Dec 2015 14:28:48 +0100 (CET) | From | Thomas Gleixner <> | Subject | Re: [PATCH 1/2] x86/msr: add on cpu read/modify/write function |
| |
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
|  |