| Deutsch English Français Italiano |
|
<vs50cb$1jq5h$2@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com>
Newsgroups: comp.arch
Subject: Re: MSI interrupts
Date: Thu, 27 Mar 2025 19:09:14 -0700
Organization: A noiseless patient Spider
Lines: 602
Message-ID: <vs50cb$1jq5h$2@dont-email.me>
References: <vqto79$335c6$1@dont-email.me>
<7a093bbb356e3bda3782c15ca27e98a7@www.novabbs.org>
<vs41ap$n43$1@reader1.panix.com>
<601781e2c91d42a73526562b419fdf02@www.novabbs.org>
<vs4se6$hvb$1@reader1.panix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Fri, 28 Mar 2025 03:09:17 +0100 (CET)
Injection-Info: dont-email.me; posting-host="7ce1f9b3539f865da57caab62bfa1cad";
logging-data="1697969"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/0cqr1e9PAkFbmRdsxo6dUPjHqP8fCVL8="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:quGxYCTjr9ooDBg8MIpxftCxz7I=
Content-Language: en-US
In-Reply-To: <vs4se6$hvb$1@reader1.panix.com>
On 3/27/2025 6:01 PM, Dan Cross wrote:
> In article <601781e2c91d42a73526562b419fdf02@www.novabbs.org>,
> MitchAlsup1 <mitchalsup@aol.com> wrote:
>> On Thu, 27 Mar 2025 17:19:21 +0000, Dan Cross wrote:
>>> In article <7a093bbb356e3bda3782c15ca27e98a7@www.novabbs.org>,
>>> MitchAlsup1 <mitchalsup@aol.com> wrote:
>>>> On Wed, 26 Mar 2025 4:08:57 +0000, Dan Cross wrote:
>>>>> [snip]
>>>>> 1. `from` may point to a cache line
>>>>> 2. `to` may point to a different cache line.
>>>>> 3. Does your architecture use a stack?
>>>>
>>>> No
>>>
>>> You make multiple references to a stack just below. I
>>> understand stack references are excluded from the atomic event,
>>> but I asked whether the architecture uses a stack. Does it, or
>>> doesn't it?
>>>
>>>>> What sort of alignment criteria do you impose?
>>>>
>>>> On the participating data none. On the cache line--cache line.
>>>
>>> I meant for data on the stack. The point is moot, though, since
>>> as you said stack data does not participate in the atomic event.
>>
>> Stack does not NECESSARILY participate. However, if you perform
>> a esmLOCKload( SP[23] ) then that line on the stack is participating.
>
> Very good.
>
>>>>> At first blush, it seems to me that
>>>>> the pointers `from_next`, `from_prev`, and `to_next` could be
>>>>> on the stack and if so, will be on at least one cache line,
>>>>> and possibly 2, if the call frame for `MoveElement` spans
>>>>> more than one.
>>>>
>>>> The illustrated code is using 6 participating cache lines.
>>>> Where local variables are kept (stack, registers) does not
>>>> count against the tally of participating cache lines.
>>>
>>> Huh.
>>
>> There are 6 esmLOCKxxxxx() so there are 6 participating lines--
>> and these are absolutely independent from where the variables
>> are located. The variables carry information but do not part-
>> ticipate they carry data between operations on the particupating
>> lines.
>
> That was clearly in the code. That was not what the "Huh" was
> in resposne to.
>
>>> How would this handle something like an MCS lock, where
>>> the lock node may be on a stack, though accessible globally in
>>> some virtual address space?
>>
>> As illustrated above esmLOCKload( SP[23]) will cause a line on
>> the stack to participate in the event.
>
> Ok, good to know.
>
>> ----------------
>>>>> But later you wrote,
>>>>>
>>>>>> So, if you want the property whereby the lock disappears on any
>>>>>> control transfer out of the event {exception, interrupt, SVC, SVR, ...};
>>>>>> then you want to use my ATOMIC stuff; otherwise, you can use the
>>>>>> normal ATOMIC primitives everyone and his brother provide.
>>>>>
>>>>> Well, what precisely do you mean here when you say, "if you want
>>>>> the property whereby the lock disappears on any control transfer
>>>>> out of the event"?
>>>>
>>>> If you want that property--you use the tools at hand.
>>>> If you don't just use them as primitive generators.
>>>
>>> I wasn't clear enough here. I'm asking what, exactly, you mean
>>> by this _property_,
>>
>> The property that if an interrupt (or exception or SVC or SVR)
>> prevents executing the event to its conclusion, HW makes the
>> event look like it never started. So that when/if control returns
>> we have another chance to execute the event as-if ATOMICally.
>
> Ok. So let's be crystal clear here: after the event concludes
> successfully, a subsequent exception, interrupt, or whatever,
> will not magically roll back any of the values set and made
> visible system-wide as a result of the successful conclusion of
> the atomic event. Correct? That's what I've been asking.
>
>>> not what you mean when you write that one
>>> can use these atomic events if one wants the property. That is,
>>> I'm asking you to precisely define what it means for a lock to
>>> "disappear".
>>>
>>> It seems clear enough _now_ that once the event concludes
>>> successfully the lock value is set to whatever it was set to in
>>> during the event, but that wasn't clear to me earlier and I
>>> wanted confirmation.
>>
>> Not "the lock value" but "all participating values" are set
>> and become visible system-wide in a single instant.
>
> Sure. But there was only one participating value in the
> spinlock example. ;-}
>
>> No 3rd
>> party sees some set and others remain unset. Everybody sees
>> all of then change value between this-clock and its successor.
>
> Sure. You've said this all along, and I've never disputed it.
>
>>> In particular, it seems odd to me that one would bother with a
>>> lock of some kind during an event if it didn't remain set after
>>> the event.
>>
>> Consider CompareTripleSwapFour() as an atomic primitive. How
>> would you program this such that nobody nowhere could ever
>> tell that the four updated locations changes in any order
>> then simultaneously ??? Without using a LOCK to guard the
>> event ??? And without demanding that all four updates are
>> to the same cache line ???
>>
>> {{Nobody nowhere included ATOMIC-blind DMA requests}}
>
> The fundamental issue here is that, when I refer to a "lock" I
> have been talking about a software mutual exclusion primitive,
> and you are referring to something else entirely.
>
> I would have thought my meaning was clear from context;
> evidently not.
>
>>> If you do all of your critical section stuff inside
>>> of the event, and setting the lock in the event is not visible
>>> until the event concludes, why bother? If on the other hand you
>>> use the event to set the lock, why bother doing additional work
>>> inside the event itself, but in this case I definitely don't
>>> want something else to come along and just unset the lock on its
>>> own, higher priority or not.
>>
>> It is clear you do not understand the trouble HW takes to implement
>> even DCADS where between any 2 clocks, one (or more) SNOOPs can
>> take the lines you are DCADSing. It is this property of cache
>> coherence that gets in the way of multi-operation ATOMIC events.
>
> As above, when I refer to "setting the lock" I am referring to
> acquiring a mutex; a software primitive. I am not referring to
> what the hardware does internally. Consider what I wrote above,
> the section that you quoted, in that context.
>
>> In 2004 Fred Weber came to me and ask: "Why can't we (AMD) give
>> Microsoft the DCADS they want. I dug into it, and ASF was my
>> solution in x86 ISA, ESM is my solution in RISC-based ISA. It
>> removes the need to add ATOMIC primitives to ISA over generations.
>>
>> It also provides the ability to do other things--which apparently
>> you will not use--sort of like complaining that your new car has
>> auto-park a feature you will never use.
>
> "It is clear you do not understand the trouble SW takes to
> implement even simple things that are beyond the capability of
> hardware."
>
> (Back at you. I think I've been pretty polite here; I'm getting
> tired of the barbs.)
>
>>>>> What I _hope_ you mean is that if you transfer "out of the
>>>>> event" before the `esmLOCKstore` then anything that's been done
>>>>> since the "event" started is rolled back, but NOT if control
>>>>> transfer happens _after_ the `esmLOCKstore`. If THAT were the
>>>>> case, then this entire mechanism is useless.
>>>>
>>>> One can use a esmLOCKstore( *SP, 0 ) to abandon an event. HW
>>>> detects that *SP is not participating in the event, and uses
>>>> the lock bit in the instruction to know it is time to leave
>>>> the event in the failed manner. No ST is performed to the
========== REMAINDER OF ARTICLE TRUNCATED ==========