On 8/15/2007 10:18 AM, Heiko Carstens wrote:
> On Wed, Aug 15, 2007 at 02:49:03PM +0800, Herbert Xu wrote:
>> Chris Snook <[EMAIL PROTECTED]> wrote:
>> > 
>> > Because atomic operations are generally used for synchronization, which 
>> > requires 
>> > volatile behavior.  Most such codepaths currently use an inefficient 
>> > barrier(). 
>> >  Some forget to and we get bugs, because people assume that atomic_read() 
>> > actually reads something, and atomic_write() actually writes something.  
>> > Worse, 
>> > these are architecture-specific, even compiler version-specific bugs that 
>> > are 
>> > often difficult to track down.
>> 
>> I'm yet to see a single example from the current tree where
>> this patch series is the correct solution.  So far the only
>> example has been a buggy piece of code which has since been
>> fixed with a cpu_relax.
> 
> Btw.: we still have
> 
> include/asm-i386/mach-es7000/mach_wakecpu.h:  while (!atomic_read(deassert));
> include/asm-i386/mach-default/mach_wakecpu.h: while (!atomic_read(deassert));
> 
> Looks like they need to be fixed as well.


I don't know if this here is affected:

/* drivers/ieee1394/ieee1394_core.h */
static inline unsigned int get_hpsb_generation(struct hpsb_host *host)
{
        return atomic_read(&host->generation);
}

/* drivers/ieee1394/nodemgr.c */
static int nodemgr_host_thread(void *__hi)
{
        [...]

        for (;;) {
                [... sleep until bus reset event ...]

                /* Pause for 1/4 second in 1/16 second intervals,
                 * to make sure things settle down. */
                g = get_hpsb_generation(host);
                for (i = 0; i < 4 ; i++) {
                        if (msleep_interruptible(63) ||
                            kthread_should_stop())
                                goto exit;

        /* Now get the generation in which the node ID's we collect
         * are valid.  During the bus scan we will use this generation
         * for the read transactions, so that if another reset occurs
         * during the scan the transactions will fail instead of
         * returning bogus data. */

                        generation = get_hpsb_generation(host);

        /* If we get a reset before we are done waiting, then
         * start the waiting over again */

                        if (generation != g)
                                g = generation, i = 0;
                }

                [... scan bus, using generation ...]

        }
exit:
[...]
}



-- 
Stefan Richter
-=====-=-=== =--- -====
http://arcgraph.de/sr/
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to