On 12.02.15 16:08, Mark Burton wrote:
> 
>> On 12 Feb 2015, at 16:01, Peter Maydell <peter.mayd...@linaro.org> wrote:
>>
>> On 12 February 2015 at 14:45, Alexander Graf <ag...@suse.de> wrote:
>>>
>>>> On 12.02.2015, at 15:35, Mark Burton <mark.bur...@greensocs.com> wrote:
>>>> We are proposing to implement this by signalling all other CPU’s
>>>> to exit (and requesting they flush before re-starting). In other
>>>> words, this would happen asynchronously.
>>>
>>> For global flushes, give them a pointer payload along with the flush
>>> request and tell all cpus to increment it atomically. In your main
>>> thread, wait until *ptr == nKickedCpus.
>>
>> I bet this will not be the only situation where you want to
>> do an "get all other CPUs to do $something and wait til they
>> have done so" kind of operation, so some lightweight but generic
>> infrastructure for doing that would not be a bad plan. (Similarly
>> "get all other CPUs to stop, then I can do $something and let
>> the others continue”.)
> 
> We tried this - we ended up in knots.
> We had 2 CPU’s trying to flush at about the same time, both waiting for the 
> other.
> We had CPU’s trying to get the global mutex to finish what they were doing, 
> while being told to flush, 
> We had CPU’s in the global mutex trying to do something that would cause a 
> flush… etc....
> We had spaghetti with extra Bolognese sauce…
> 
> We eventually concluded, yes - in an infinite universe everything is 
> possible, but if we could simply do this ‘asynchronously’ then our lives 
> would be a LOT easier.
> e.g.  - ask all CPU’s to “exit and do something” is easy -  wait for them to 
> do that is a whole other problem…
> 
> Our question is - do we need this ‘sync’ (before the flush), or can we 
> actually allow CPU’s to flush themselves asynchronously….

The respective target architecture specs will tell you. And I very much
doubt that it is ok in most cases.


Alex

Reply via email to