| Deutsch English Français Italiano |
|
<34434320650f5844b18b1c0b684acf43@www.novabbs.org> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!weretis.net!feeder9.news.weretis.net!news.nk.ca!rocksolid2!i2pn2.org!.POSTED!not-for-mail
From: mitchalsup@aol.com (MitchAlsup1)
Newsgroups: comp.arch
Subject: Re: MSI interrupts
Date: Thu, 27 Mar 2025 21:47:03 +0000
Organization: Rocksolid Light
Message-ID: <34434320650f5844b18b1c0b684acf43@www.novabbs.org>
References: <vqto79$335c6$1@dont-email.me> <b1c74762d01f71cc1b8ac838dcf6d4fa@www.novabbs.org> <vrvukp$n29$1@reader1.panix.com> <7a093bbb356e3bda3782c15ca27e98a7@www.novabbs.org> <vs41ap$n43$1@reader1.panix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Info: i2pn2.org;
logging-data="2030063"; mail-complaints-to="usenet@i2pn2.org";
posting-account="o5SwNDfMfYu6Mv4wwLiW6e/jbA93UAdzFodw5PEa6eU";
User-Agent: Rocksolid Light
X-Rslight-Posting-User: cb29269328a20fe5719ed6a1c397e21f651bda71
X-Spam-Checker-Version: SpamAssassin 4.0.0
X-Rslight-Site: $2y$10$.B20EjE9jVgX8hRR9vLozO5.U/GccFK2vLmhp8paoOP.u3IHnMAUa
Bytes: 4599
Lines: 128
On Thu, 27 Mar 2025 17:19:21 +0000, Dan Cross wrote:
> In article <7a093bbb356e3bda3782c15ca27e98a7@www.novabbs.org>,
> MitchAlsup1 <mitchalsup@aol.com> wrote:
-------------------
> Or maybe even just swapping places between two elements in a
> linked list. For example:
>
> void
> swap_places(Node **head, Node *a, Node *b)
> {
> Node *hp, *an, *ap, *bn, *bp;
>
> assert(head != NULL);
> assert(a != NULL);
> assert(b != NULL);
>
> if (a == b)
> return;
>
> esmLOCKprefetch(*head);
This should be a load not prefetch--you want the value of *head
> if (*head == a) // see !
> *head = b;
> else if (*head == b)
> *head = a;
There is a ESM rule that states:: all participating cache lines
must be touched before any participating cache lines can be
modified.
Also note: Participating cache lines are checked for write permission
at touch time, and on cache miss, read with intent to modify.
>
> an = esmLOCKload(a->next);
> ap = esmLOCKload(a->prev);
> bn = esmLOCKload(b->next);
> bp = esmLOCKload(b->prev);
>
> b->next = an;
> if (an != NULL) {
> esmLOCKprefetch(an->prev);
> an->prev = b;
> }
> b->prev = ap;
> if (ap != NULL) {
> esmLOCKprefetch(ap->next);
> ap->next = b;
> }
>
> a->next = bn;
> if (bn != NULL) {
> esmLOCKprefetch(bn->prev);
> bn->prev = a;
> }
> if (bp != NULL) {
> esmLOCKprefetch(bp->next);
> bp->next = a;
> }
> esmLOCKstore(a->prev, bp);
> }
>
>
> - Dan C.
What I think you want:: (ignoring the 9 participants limit)
> void
> swap_places(Node **head, Node *a, Node *b)
> {
> Node *hp, *an, *ap, *bn, *bp;
>
> assert(head != NULL);
> assert(a != NULL);
> assert(b != NULL);
>
> if (a == b)
> return;
top_of_ATOMIC_event:
// this is the recovery point is you don't use esmINTERFERENCE()
// the very next instruction begins the event.
> esmLOCKprefetch( an = esmLOCKload(a->next) );
> esmLOCKprefetch( ap = esmLOCKload(a->prev) );
> esmLOCKprefetch( bn = esmLOCKload(b->next) );
> esmLOCKprefetch( bp = esmLOCKload(b->prev) );
Node *Ehead = esmLOCKload(*head);
// by placing all the the touching before any manifestation, you put
// all the touch latency* in the code before it has tried to damage any
// participating memory location. (*) and TLB latency and 2nd party
// observation of your event.
// this would be the point where you would insert if( esmINTERFERENCE(
))
// if you wanted control at a known failure point rather than at the
// top of the event on failure.
> if (Ehead == a)
> *head = b;
> else if (Ehead == b)
> *head = a;
>
> b->next = an;
> if (an != NULL) {
> an->prev = b;
> }
> b->prev = ap;
> if (ap != NULL) {
> ap->next = b;
> }
>
> a->next = bn;
> if (bn != NULL) {
> bn->prev = a;
> }
> if (bp != NULL) {
> bp->next = a;
> }
> esmLOCKstore(a->prev, bp);
> }
// now manifestation has lowest possible latency (as seen by this core
alone)