Re: Missing put_cpu() in arch/ia64/sn/kernel/sn2/sn_hwperf.c?

From: Tony Luck
Date: Mon Aug 08 2011 - 17:38:11 EST


On Mon, Aug 8, 2011 at 11:05 AM, Thomas Meyer <thomas@xxxxxxxx> wrote:
> The function sn_hwperf_op_cpu() seems to miss a corresponding put_cpu().
>
> Or is this done in another function? I didn't find it.

It would be hard to do it elsewhere - this function may not have done
a get_cpu() [in the cpu == SN_HWPERF_ARG_ANY_CPU case].

The logic is a bit tortuous here ... perhaps simpler to split the tests
up. Does the attached patch look right?

-Tony
diff --git a/arch/ia64/sn/kernel/sn2/sn_hwperf.c b/arch/ia64/sn/kernel/sn2/sn_hwperf.c
index 30862c0..2de41d4 100644
--- a/arch/ia64/sn/kernel/sn2/sn_hwperf.c
+++ b/arch/ia64/sn/kernel/sn2/sn_hwperf.c
@@ -615,11 +615,15 @@ static int sn_hwperf_op_cpu(struct sn_hwperf_op_info *op_info)
}
}

- if (cpu == SN_HWPERF_ARG_ANY_CPU || cpu == get_cpu()) {
- /* don't care, or already on correct cpu */
+ if (cpu == SN_HWPERF_ARG_ANY_CPU) {
+ /* don't care which cpu */
sn_hwperf_call_sal(op_info);
- }
- else {
+ } else if (cpu == get_cpu()) {
+ /* already on correct cpu */
+ sn_hwperf_call_sal(op_info);
+ put_cpu();
+ } else {
+ put_cpu();
if (use_ipi) {
/* use an interprocessor interrupt to call SAL */
smp_call_function_single(cpu, sn_hwperf_call_sal,