From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751814AbcGPUDe (ORCPT ); Sat, 16 Jul 2016 16:03:34 -0400 Received: from mx2.suse.de ([195.135.220.15]:41928 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751666AbcGPUDd (ORCPT ); Sat, 16 Jul 2016 16:03:33 -0400 Date: Sat, 16 Jul 2016 13:03:22 -0700 From: Davidlohr Bueso To: Wanpeng Li Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Wanpeng Li , "Peter Zijlstra (Intel)" , Ingo Molnar , Waiman Long Subject: Re: [PATCH v4] locking/pvqspinlock: Fix double hash race Message-ID: <20160716200321.GA3241@linux-80c1.suse> References: <1468633869-4066-1-git-send-email-wanpeng.li@hotmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: <1468633869-4066-1-git-send-email-wanpeng.li@hotmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, 16 Jul 2016, Wanpeng Li wrote: >From: Wanpeng Li > >When the lock holder vCPU is racing with the queue head vCPU: > >lock holder vCPU queue head vCPU >===================== ================== > >node->locked = 1; > READ_ONCE(node->locked) > ... pv_wait_head_or_lock(): > SPIN_THRESHOLD loop; > pv_hash(); > lock->locked = _Q_SLOW_VAL; > node->state = vcpu_hashed; >pv_kick_node(): > cmpxchg(node->state, > vcpu_halted, vcpu_hashed); > lock->locked = _Q_SLOW_VAL; > pv_hash(); > >With preemption at the right moment, it is possible that both the >lock holder and queue head vCPUs can be racing to set node->state >which can result in hash entry race. Making sure the state is never >set to vcpu_halted will prevent this racing from happening. > >This patch fix it by setting vcpu_hashed after we did all hash thing. > >Reviewed-by: Pan Xinhui >Cc: Peter Zijlstra (Intel) >Cc: Ingo Molnar >Cc: Waiman Long >Cc: Davidlohr Bueso >Signed-off-by: Wanpeng Li Reviewed-by: Davidlohr Bueso