Message ID | 20220520203755.266337-1-mike.travis@hpe.com (mailing list archive) |
---|---|
State | Deferred, archived |
Headers | show |
Series | x86/platform/uv: Dont use smp_processor_id while preemptable | expand |
Hi Mike, On 5/20/22 22:37, Mike Travis wrote: > To avoid a "BUG: using smp_processor_id() in preemptible" debug > warning message, disable preemption around use of the processor id. > > Signed-off-by: Mike Travis <mike.travis@hpe.com> > Reviewed-by: Steve Wahl <steve.wahl@hpe.com> > Reviewed-by: Dimitri Sivanich <dimitri.sivanich@hpe.com> A git blame shows that this code has been around for quite a while; so presumably this should be backported to some of the stable kernel series ? Maybe add an appropriate Cc: stable tag with the range of kernels this should be added to and/or add a Fixes: tag? Regards, Hans > --- > arch/x86/platform/uv/uv_time.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/platform/uv/uv_time.c b/arch/x86/platform/uv/uv_time.c > index 54663f3e00cb..094190814a28 100644 > --- a/arch/x86/platform/uv/uv_time.c > +++ b/arch/x86/platform/uv/uv_time.c > @@ -275,14 +275,17 @@ static int uv_rtc_unset_timer(int cpu, int force) > */ > static u64 uv_read_rtc(struct clocksource *cs) > { > - unsigned long offset; > + unsigned long offset, time; > + unsigned int cpu = get_cpu(); > > if (uv_get_min_hub_revision_id() == 1) > offset = 0; > else > - offset = (uv_blade_processor_id() * L1_CACHE_BYTES) % PAGE_SIZE; > + offset = (uv_cpu_blade_processor_id(cpu) * L1_CACHE_BYTES) % PAGE_SIZE; > > - return (u64)uv_read_local_mmr(UVH_RTC | offset); > + time = (u64)uv_read_local_mmr(UVH_RTC | offset); > + put_cpu(); > + return time; > } > > /*
Thanks, I'll do that.
On 5/20/22 13:37, Mike Travis wrote: > To avoid a "BUG: using smp_processor_id() in preemptible" debug > warning message, disable preemption around use of the processor id. I'm sure this gets rid of the warning. But, could you please take a quick look at the callers and ensure that they can handle if this read comes from another CPU? In other words, what would actually go wrong if uv_read_rtc() got preempted in this region? What would this actually fix?
Dave Hansen <dave.hansen@intel.com> wrote: On 5/20/22 13:37, Mike Travis wrote: > To avoid a "BUG: using smp_processor_id() in preemptible" debug > warning message, disable preemption around use of the processor id. >I'm sure this gets rid of the warning. But, could you please take a >quick look at the callers and ensure that they can handle if this read >comes from another CPU? > >In other words, what would actually go wrong if uv_read_rtc() got >preempted in this region? What would this actually fix? I talked with the author of this driver and among the preemption scenarios it always returns the same system time. And due to the round robin aspect of the request scheduling, getting an earlier time when a second CPU reads it's time is not possible. So getting rid of the debug warning message seems to be the only benefit from this patch.
diff --git a/arch/x86/platform/uv/uv_time.c b/arch/x86/platform/uv/uv_time.c index 54663f3e00cb..094190814a28 100644 --- a/arch/x86/platform/uv/uv_time.c +++ b/arch/x86/platform/uv/uv_time.c @@ -275,14 +275,17 @@ static int uv_rtc_unset_timer(int cpu, int force) */ static u64 uv_read_rtc(struct clocksource *cs) { - unsigned long offset; + unsigned long offset, time; + unsigned int cpu = get_cpu(); if (uv_get_min_hub_revision_id() == 1) offset = 0; else - offset = (uv_blade_processor_id() * L1_CACHE_BYTES) % PAGE_SIZE; + offset = (uv_cpu_blade_processor_id(cpu) * L1_CACHE_BYTES) % PAGE_SIZE; - return (u64)uv_read_local_mmr(UVH_RTC | offset); + time = (u64)uv_read_local_mmr(UVH_RTC | offset); + put_cpu(); + return time; } /*