From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751022AbdANBko (ORCPT ); Fri, 13 Jan 2017 20:40:44 -0500 Received: from szxga03-in.huawei.com ([119.145.14.66]:33912 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750937AbdANBkn (ORCPT ); Fri, 13 Jan 2017 20:40:43 -0500 Subject: Re: [PATCH] fix race caused by hyperthreads when online an offline cpu To: Zhou Chengming , , , , , , , , , , , References: <1484213552-46680-1-git-send-email-zhouchengming1@huawei.com> CC: From: qiaonuohan Message-ID: Date: Sat, 14 Jan 2017 09:33:10 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 In-Reply-To: <1484213552-46680-1-git-send-email-zhouchengming1@huawei.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.253.205] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ping... On 2017/1/12 17:32, Zhou Chengming wrote: > After online an offline cpu, cpu_hw_events.excl_thread_id will always be > set to 1 in intel_pmu_cpu_starting() even when its sibling's excl_thread_id > is also 1. Then the two siblings will use the same state in their shared > hw_hw_events.excl_cntrs, it will cause race problem. > > The race senario is like this: > > Two cpu (7 and 19) are siblings, excl_thread_id of 7 and 19 are 0 and 1. > After offline and online cpu 7, intel_pmu_cpu_starting() will set excl_thread_id > of cpu 7 to 1. Then both cpu 7 and 19 will use the same state in their > shared hw_hw_events.excl_cntrs. > > cpu7 cpu19 > --- --- > intel_start_scheduling() > set state->sched_started = true > intel_put_excl_constraints() { > if (!state->sched_started) > spin_lock // not executed > intel_stop_scheduling() > set state->sched_started = false > if (!state->sched_started) > spin_unlock // excuted > > Signed-off-by: NuoHan Qiao > Signed-off-by: Zhou Chengming > --- > arch/x86/events/intel/core.c | 7 +++++-- > 1 files changed, 5 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c > index a74a2db..593d8c9 100644 > --- a/arch/x86/events/intel/core.c > +++ b/arch/x86/events/intel/core.c > @@ -3164,13 +3164,16 @@ static void intel_pmu_cpu_starting(int cpu) > > if (x86_pmu.flags & PMU_FL_EXCL_CNTRS) { > for_each_cpu(i, topology_sibling_cpumask(cpu)) { > + struct cpu_hw_events *sibling; > struct intel_excl_cntrs *c; > > - c = per_cpu(cpu_hw_events, i).excl_cntrs; > + sibling = &per_cpu(cpu_hw_events, i); > + c = sibling->excl_cntrs; > if (c && c->core_id == core_id) { > cpuc->kfree_on_online[1] = cpuc->excl_cntrs; > cpuc->excl_cntrs = c; > - cpuc->excl_thread_id = 1; > + if (!sibling->excl_thread_id) > + cpuc->excl_thread_id = 1; > break; > } > } >