From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeremy Fitzhardinge Subject: Re: [PATCH RFC V4 4/5] kvm : pv-ticketlocks support for linux guests running on KVM hypervisor Date: Wed, 18 Jan 2012 12:34:42 +1100 Message-ID: <4F1621B2.3020203@goop.org> References: <20120114182501.8604.68416.sendpatchset@oc5400248562.ibm.com> <20120114182645.8604.68884.sendpatchset@oc5400248562.ibm.com> <20120117110210.GA17420@amt.cnet> <20120117113312.GB30398@linux.vnet.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20120117113312.GB30398@linux.vnet.ibm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: virtualization-bounces@lists.linux-foundation.org Errors-To: virtualization-bounces@lists.linux-foundation.org To: Srivatsa Vaddagiri Cc: X86 , linux-doc@vger.kernel.org, Peter Zijlstra , Jan Kiszka , Virtualization , Paul Mackerras , "H. Peter Anvin" , Stefano Stabellini , Xen , Dave Jiang , KVM , Glauber Costa , Raghavendra K T , Ingo Molnar , Avi Kivity , Rik van Riel , Konrad Rzeszutek Wilk , Greg Kroah-Hartman , Sasha Levin , Sedat Dilek , Thomas Gleixner , LKML , Dave Hansen List-Id: virtualization@lists.linuxfoundation.org On 01/17/2012 10:33 PM, Srivatsa Vaddagiri wrote: > * Marcelo Tosatti [2012-01-17 09:02:11]: > >>> +/* Kick vcpu waiting on @lock->head to reach value @ticket */ >>> +static void kvm_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket) >>> +{ >>> + int cpu; >>> + int apicid; >>> + >>> + add_stats(RELEASED_SLOW, 1); >>> + >>> + for_each_cpu(cpu, &waiting_cpus) { >>> + const struct kvm_lock_waiting *w = &per_cpu(lock_waiting, cpu); >>> + if (ACCESS_ONCE(w->lock) == lock && >>> + ACCESS_ONCE(w->want) == ticket) { >>> + add_stats(RELEASED_SLOW_KICKED, 1); >>> + apicid = per_cpu(x86_cpu_to_apicid, cpu); >>> + kvm_kick_cpu(apicid); >>> + break; >>> + } >>> + } >> What prevents a kick from being lost here, if say, the waiter is at >> local_irq_save in kvm_lock_spinning, before the lock/want assignments? > The waiter does check for lock becoming available before actually > sleeping: > > + /* > + * check again make sure it didn't become free while > + * we weren't looking. > + */ > + if (ACCESS_ONCE(lock->tickets.head) == want) { > + add_stats(TAKEN_SLOW_PICKUP, 1); > + goto out; > + } That logic relies on the "kick" being level triggered, so that "kick" before "block" will cause the block to fall out immediately. If you're using "hlt" as the block and it has the usual edge-triggered behaviour, what stops a "kick-before-hlt" from losing the kick? J From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeremy Fitzhardinge Subject: Re: [PATCH RFC V4 4/5] kvm : pv-ticketlocks support for linux guests running on KVM hypervisor Date: Wed, 18 Jan 2012 12:34:42 +1100 Message-ID: <4F1621B2.3020203@goop.org> References: <20120114182501.8604.68416.sendpatchset@oc5400248562.ibm.com> <20120114182645.8604.68884.sendpatchset@oc5400248562.ibm.com> <20120117110210.GA17420@amt.cnet> <20120117113312.GB30398@linux.vnet.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: X86 , linux-doc@vger.kernel.org, Peter Zijlstra , Jan Kiszka , Virtualization , Paul Mackerras , "H. Peter Anvin" , Stefano Stabellini , Xen , Dave Jiang , KVM , Glauber Costa , Raghavendra K T , Ingo Molnar , Avi Kivity , Rik van Riel , Konrad Rzeszutek Wilk , Greg Kroah-Hartman , Sasha Levin , Sedat Dilek , Thomas Gleixner , LKML , Dave Hansen , Suzuki Poulose < To: Srivatsa Vaddagiri Return-path: In-Reply-To: <20120117113312.GB30398@linux.vnet.ibm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: virtualization-bounces@lists.linux-foundation.org Errors-To: virtualization-bounces@lists.linux-foundation.org List-Id: kvm.vger.kernel.org On 01/17/2012 10:33 PM, Srivatsa Vaddagiri wrote: > * Marcelo Tosatti [2012-01-17 09:02:11]: > >>> +/* Kick vcpu waiting on @lock->head to reach value @ticket */ >>> +static void kvm_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket) >>> +{ >>> + int cpu; >>> + int apicid; >>> + >>> + add_stats(RELEASED_SLOW, 1); >>> + >>> + for_each_cpu(cpu, &waiting_cpus) { >>> + const struct kvm_lock_waiting *w = &per_cpu(lock_waiting, cpu); >>> + if (ACCESS_ONCE(w->lock) == lock && >>> + ACCESS_ONCE(w->want) == ticket) { >>> + add_stats(RELEASED_SLOW_KICKED, 1); >>> + apicid = per_cpu(x86_cpu_to_apicid, cpu); >>> + kvm_kick_cpu(apicid); >>> + break; >>> + } >>> + } >> What prevents a kick from being lost here, if say, the waiter is at >> local_irq_save in kvm_lock_spinning, before the lock/want assignments? > The waiter does check for lock becoming available before actually > sleeping: > > + /* > + * check again make sure it didn't become free while > + * we weren't looking. > + */ > + if (ACCESS_ONCE(lock->tickets.head) == want) { > + add_stats(TAKEN_SLOW_PICKUP, 1); > + goto out; > + } That logic relies on the "kick" being level triggered, so that "kick" before "block" will cause the block to fall out immediately. If you're using "hlt" as the block and it has the usual edge-triggered behaviour, what stops a "kick-before-hlt" from losing the kick? J