Fiasco.OC: sigma0 stucks in ipc-path

Stefan kalkowski stefan.kalkowski at genode-labs.com
Thu May 31 18:30:07 CEST 2012


Dear kernel-hackers,

I think I came along a problem in the IPC-path of Fiasco.OC sometimes in
the past, but it was somehow hard to reproduce. But now I've an example
that quite reliable triggers the issue.

The symptom in the past, and in the concrete example was that our
roottask in Genode (called core) was requesting memory from sigma0,
either implicitly just by touching some memory-area, like a ROM-module
loaded by the bootloader, or explicitly by using the sigma0-protocol,
e.g. to request I/O memory for the framebuffer. After that the request
was received by sigma0, and also processed, but the answer never reached
the faulter/client in this case the core-pager thread. The typical
picture in the kernel-debugger then looks like the following:

  http://pastebin.com/cFvn1NV2

sigma0 is marked as ready, but it still stucks in the ipc-syscall. By
instrumenting the kernel I could break down the point where sigma0 never
returns. It is when trying to establishing the actual mapping in
'Thread::transfer_msg_items' in file src/kern/thread-ipc.cc. The spot is
the following:

```
  cpu_lock.clear();
  L4_error err = fpage_map(snd->space(), sfp,
  rcv->space(), L4_fpage(buf->d), item->b, &rl);
  cpu_lock.lock();
```

After the cpu lock is given away, sigma0 never aquires it back
successfully. It looks to me like a race-condition, nevertheless simply
letting the lock being locked doesn't solved the problem ;-). Maybe
given your insight knowledge, you're much faster in tracking the problem
down to its root?

I've to add, that the problem occurred on x86 as well as ARM, on
different QEMU versions, as well as real hardware. I also could
reproduce it with slightly older versions of Fiasco.OC, and in different
development stages of Genode. Nevertheless, it was never that reliable
to reproduce. The current example which reproduces it reliable at least
with my QEMU (qemu-kvm-0.14.0) version. You can find in form of an
ISO-image here:

  http://dl.dropbox.com/u/82567292/avplay.iso

You can try the iso-image like the following:

  qemu -no-kvm -m 256 -soundhw all -serial mon:stdio -cdrom avplay.iso

Or, if you've to build it on your own, here is my topic branch,
including the avplay run-script that triggers the problem:

  https://github.com/skalk/genode/tree/fiasco.oc-ipc-issue

To compile and run it yourself you've to do the following steps (after
installing the genode toolchain from http://genode.org/download/tool-chain):

  git clone git at github.com:skalk/genode.git
  cd genode
  git checkout -b issue origin/fiasco.oc-ipc-issue
  git clone git at github.com:genodelabs/linux_drivers.git
  make -C base-foc prepare
  make -C libports prepare PKG="libav libc sdl zlib"
  tool/create_builddir foc_x86_32 BUILD_DIR=build
  sed -i "/#REPOSITORIES.*libports/s/#//" build/etc/build.conf
  sed -i "/#REPOSITORIES.*linux_drivers/s/#//" build/etc/build.conf
  make -C build run/avplay

Thank you in advance & best regards!
Stefan




More information about the l4-hackers mailing list