RE: [Linux-ia64] spin_unlock() problem

From: Chen, Kenneth W <kenneth.w.chen_at_intel.com>
Date: 2003-04-08 09:38:03
I'm confused with the original example:

cpu1()
{
   spin_lock(&bleh);
   *a = foo;
   *b = bar;
   spin_unlock(&bleh);
}

cpu2()
{
   if (*b == bar)
      boink(*a);
}

*b is protected by spin_lock bleh, then in cpu2() one need a spin_lock
to access *b.  To me, the code above has bug in it.


Then the discussion flows into following example:

cpu1()
{
   spin_lock(&bleh);
   *a = foo;
   spin_unlock(&bleh);
   *b = bar;
}

cpu2()
{
   if (*b == bar)
      boink(*a);
}

Which also doesn't gareentee the order of *b because it is outside a
spin_lock and there is no explicit memory ordering in the code.

To make it to work correctly, I think one needs something like the
following:
--- a   Mon Apr  7 16:34:51 2003
+++ b   Mon Apr  7 16:35:11 2003
@@ -3,11 +3,11 @@
    spin_lock(&bleh);
    *a = foo;
    spin_unlock(&bleh);
-   *b = bar;
+   REL_SEMANTICS(*b) = bar;
 }
 
 cpu2()
 {
-   if (*b == bar)
+   if (ACQ_SEMANTICS(*b) == bar)
       boink(*a);
 }

Again, this is a program bug to me.

- Ken

-----Original Message-----
From: Jes Sorensen [mailto:jes@wildopensource.com] 
Sent: Monday, April 07, 2003 4:14 PM
To: davidm@hpl.hp.com
Cc: 'linux-ia64@linuxia64.org '; 'wildos@sgi.com '
Subject: Re: [Linux-ia64] spin_unlock() problem

>>>>> "David" == David Mosberger <davidm@napali.hpl.hp.com> writes:

>>>>> On 07 Apr 2003 18:09:44 -0400, Jes Sorensen
<jes@wildopensource.com> said:
David> Oops, sorry, I got it exactly backwards. ;-( So much for giving
David> a "quick" reply...

Heh, for a quick answer you sure were very convincing. I have
convinced myself for and against this one several times so far ;-)

Jes> In other words we are only guarantied that [r2] is valid when
Jes> [r3] appears but have no guarantie that [r4] doesn't show up on
Jes> the bus prior to [r3]?

David> I wouldn't use the word "valid" here, but yes, (2) and (3) are
David> NOT ordered.

This is the situation I was trying to fix, adding a wmb() to
spin_unlock() seems the only way to get around it as far as I can see.
I take it you agree then?

Cheers,
Jes

_______________________________________________
Linux-IA64 mailing list
Linux-IA64@linuxia64.org
http://lists.linuxia64.org/lists/listinfo/linux-ia64
Received on Mon Apr 07 16:38:14 2003

This archive was generated by hypermail 2.1.8 : 2005-08-02 09:20:13 EST