Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 May 2011 07:56:06 -0400
From:      John Baldwin <jhb@FreeBSD.org>
To:        Andriy Gapon <avg@FreeBSD.org>
Cc:        Max Laier <max@love2party.net>, FreeBSD current <freebsd-current@FreeBSD.org>, neel@FreeBSD.org, Peter Grehan <grehan@FreeBSD.org>
Subject:   Re: proposed smp_rendezvous change
Message-ID:  <4DD26256.2070008@FreeBSD.org>
In-Reply-To: <4DD22BD9.6070504@FreeBSD.org>
References:  <4DCD357D.6000109@FreeBSD.org> <201105161421.27665.jhb@freebsd.org> <4DD17AB3.1070606@FreeBSD.org> <201105161609.21898.jhb@freebsd.org> <4DD22BD9.6070504@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 5/17/11 4:03 AM, Andriy Gapon wrote:
> on 16/05/2011 23:09 John Baldwin said the following:
>> is probably just cut and pasted to match the other uses of values in
>> the smp_rv_waiters[] array.
>>
>> (atomic_add_acq_int() could spin on architectures where it is implemented
>> using compare-and-swap (e.g. sparc64) or locked-load conditional-store (e.g.
>> Alpha).)
>
>
> When you say "not strictly necessary", do you mean "not necessary"?
> If you do not mean that, then when could it be (non-strictly) necessary? :)
>
> Couldn't [Shouldn't] the whole:
>
>>>>   	/* Ensure we have up-to-date values. */
>>>>   	atomic_add_acq_int(&smp_rv_waiters[0], 1);
>>>>   	while (smp_rv_waiters[0]<  smp_rv_ncpus)
>>>>   		cpu_spinwait();
>
> be just replaced with:
>
> rmb();
>
> Or a proper MI function that does just a read memory barrier, if rmb() is not that.

No, you could replace it with:

	atomic_add_acq_int(&smp_rv_waiters[0], 1);

The key being that atomic_add_acq_int() will block (either in hardware 
or software) until it can safely perform the atomic operation.  That 
means waiting until the write to set smp_rv_waiters[0] to 0 by the 
rendezvous initiator is visible to the current CPU.

On some platforms a write by one CPU may not post instantly to other 
CPUs (e.g. it may sit in a store buffer).  That is fine so long as an 
attempt to update that value atomically (using cas or a 
conditional-store, etc.) fails.  For those platforms, the atomic(9) API 
is required to spin until it succeeds.

This is why the mtx code spins if it can't set MTX_CONTESTED for example.

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4DD26256.2070008>