Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Real-life use cases of barriers (DSB, DMB, ISB) in ARM

Tags:

arm

barrier

I understand that DSB, DMB, and ISB are barriers for prevent reordering of instructions. I also can find lots of very good explanations for each of them, but it is pretty hard to imagine the case that I have to use them.

Also, from the open source codes, I see those barriers from time to time, but it is quite hard to understand why they are used. Just for an example, in Linux kernel 3.7 tcp_rcv_synsent_state_process function, there is a line as follows:

    if (unlikely(po->origdev))             sll->sll_ifindex = orig_dev->ifindex;     else             sll->sll_ifindex = dev->ifindex;      smp_mb();      if (po->tp_version <= TPACKET_V2)             __packet_set_status(po, h.raw, status); 

where smp_mb() is basically DMB. Could you give me some of your real-life examples? It would help understand more about barriers.

like image 329
jaeyong Avatar asked Mar 19 '13 04:03

jaeyong


People also ask

What is DSB and ISB?

Data synchronization barrier (DSB) Ensures all memory accesses are finished before the next instruction is executed. Instruction synchronization barrier (ISB) Ensures that all previous instructions are completed before the next instruction is executed. This also flushes the CPU pipeline.

What is ISB instruction in arm?

In addition, the ISB instruction ensures that any branches that appear in program order after it are always written into the branch prediction logic with the context that is visible after the ISB instruction. This is required to ensure correct execution of the instruction stream.

What is data synchronization barrier?

Data Synchronization Barrier (DSB) The DSB instruction is a special memory barrier, that synchronizes the execution stream with memory accesses. The DSB instruction takes the required shareability domain and required access types as arguments, see Shareability and access limitations on the data barrier operations.

What do memory barriers do?

A memory barrier is an instruction that requires the processor to apply an ordering constraint between memory operations that occur before and after the memory barrier instruction in the program. Such instructions are also known as memory fences in other architectures.


1 Answers

Sorry, not going to give you a straight-out example like you're asking, because as you are already looking through the Linux source code, you have plenty of those to go around, and they don't appear to help. No shame in that - every sane person is at least initially confused by memory access ordering issues :)

If you are mainly an application developer, then there is every chance you won't need to worry too much about it - whatever concurrency frameworks you use will resolve it for you.

If you are mainly a device driver developer, then examples are fairly straightforward to find - whenever there is a dependency in your code on a previous access having had an effect (cleared an interrupt source, written a DMA descriptor) before some other access is performed (re-enabling interrupts, initiating the DMA transaction).

If you are in the process of developing a concurrency framework (, or debugging one), you probably need to read up on the topic a bit more - but your question suggests a superficial curiosity rather than an immediate need? If you are developing your own method for passing data between threads, not based on primitives provided by a concurrency framework, that is for all intents and purposes a concurrency framework.

Paul McKenney wrote an excellent paper on the need for memory barriers, and what effects they actually have in the processor: Memory Barriers: a Hardware View for Software Hackers

If that's a bit too hardcore, I wrote a 3-part blog series that's a bit more lightweight, and finishes off with an ARM-specific view. First part is Memory access ordering - an introduction.

But if it is specifically lists of examples you are after, especially for the ARM architecture, you could do a lot worse than Barrier Litmus Tests and Cookbook.

The extra-extra light programmer's view and not entirely architecturally correct version is:

  • DMB - whenever a memory access requires ordering with regards to another memory access.
  • DSB - whenever a memory access needs to have completed before program execution progresses.
  • ISB - whenever instruction fetches need to explicitly take place after a certain point in the program, for example after memory map updates or after writing code to be executed. (In practice, this means "throw away any prefetched instructions at this point".)
like image 105
unixsmurf Avatar answered Oct 01 '22 10:10

unixsmurf