lkml.org 
[lkml]   [2004]   [Oct]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] I/O space write barrier
On Thu, Oct 21, 2004 at 04:13:19PM -0700, Jesse Barnes wrote:
> This patch adds a mmiowb() call to deal with this sort of situation, and
> adds some documentation describing I/O ordering issues to deviceiobook.tmpl.

Jesse,
This looks overall pretty good. Just a few nits.

> The idea is to mirror the regular, cacheable memory barrier operation, wmb.
> Example of the problem this new macro solves:
>
> CPU A: spin_lock_irqsave(&dev_lock, flags)
> CPU A: ...
> CPU A: writel(newval, ring_ptr);
> CPU A: spin_unlock_irqrestore(&dev_lock, flags)
> ...
> CPU B: spin_lock_irqsave(&dev_lock, flags)
> CPU B: writel(newval2, ring_ptr);
> CPU B: ...
> CPU B: spin_unlock_irqrestore(&dev_lock, flags)
>
> In this case, newval2 could be written to ring_ptr before newval. Fixing it
> is easy though:
>
> CPU A: spin_lock_irqsave(&dev_lock, flags)
> CPU A: ...
> CPU A: writel(newval, ring_ptr);
> CPU A: mmiowb(); /* ensure no other writes beat us to the device */
> CPU A: spin_unlock_irqrestore(&dev_lock, flags)
> ...
> CPU B: spin_lock_irqsave(&dev_lock, flags)
> CPU B: writel(newval2, ring_ptr);
> CPU B: ...
> CPU B: mmiowb();
> CPU B: spin_unlock_irqrestore(&dev_lock, flags)

This is a great example and should be used instead of the qla1280 code
snippet that you used. Please just point at the source file that contains
the code and name the register usage this example represents.
Ie make it easy to find the example in real code without using
line numbers.

> I've tried to describe how mmiowb() differs from PCI posted
> write flushing in the patch to deviceiobook.tmpl.

Yes - I think this is alot clearer than the previous documents - thanks!

...
> +<programlisting>
> + sp->flags |= SRB_SENT;
> + ha->actthreads++;
> + WRT_REG_WORD(&amp;reg->mailbox4, ha->req_ring_index);
> +
> + /*
> + * A Memory Mapped I/O Write Barrier is needed to ensure that this write
> + * of the request queue in register is ordered ahead of writes issued
> + * after this one by other CPUs. Access to the register is protected
> + * by the host_lock. Without the mmiowb, however, it is possible for
> + * this CPU to release the host lock, another CPU acquire the host lock,
> + * and write to the request queue in, and have the second write make it
> + * to the chip first.
> + */
> + mmiowb(); /* posted write ordering */
> +</programlisting>

This is the example code I'd like to see replaced with your
synthetic example above.


thanks,
grant
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 14:07    [from the cache]
©2003-2011 Jasper Spaans