Hi, I've modified the code accordingly. And now it works fine :-)<div><br></div><div>FYI, here is my patch.</div><div><br></div><div><div>diff -r 16a569af968d lib/barrelfish/arch/x86/ipi_notify.c</div><div>--- a/lib/barrelfish/arch/x86/ipi_notify.c<span class="Apple-tab-span" style="white-space:pre">        </span>Fri May 04 17:02:29 2012 +0800</div>
<div>+++ b/lib/barrelfish/arch/x86/ipi_notify.c<span class="Apple-tab-span" style="white-space:pre">        </span>Tue May 08 22:10:16 2012 +0800</div><div>@@ -48,6 +48,22 @@</div><div> return SYS_ERR_OK;</div><div> }</div>
<div>
</div><div>+static void ipi_alloc_notify_try_request(void* arg) {</div><div>+ struct ipi_notify* uc = arg;</div><div>+ struct monitor_binding* b = get_monitor_binding();</div><div>+</div><div>+ errval_t err = b->tx_vtbl.ipi_alloc_notify_request(b, NOP_CONT, uc->ep, (uintptr_t)uc);</div>
<div>+</div><div>+ if (err_is_fail(err)) {</div><div>+ if (err_no(err) == FLOUNDER_ERR_TX_BUSY) {</div><div>+ b->register_send(b, b->waitset, MKCONT(ipi_alloc_notify_try_request, uc));</div><div>
+ }</div><div>+ else {</div><div>+ USER_PANIC("ipi_notify_alloc_db fail, err = %d\n", err);</div><div>+ }</div><div>+ }</div><div>+}</div><div>+</div><div> /**</div><div> * \brief Initialise a new IPI notify channel</div>
<div> *</div><div>@@ -64,10 +80,7 @@</div><div> // Initialize the rest</div><div> uc->cont = cont;</div><div> </div><div>- struct monitor_binding *b = get_monitor_binding();</div><div>-</div><div>- err = b->tx_vtbl.ipi_alloc_notify_request(b, NOP_CONT, uc->ep, (uintptr_t)uc);</div>
<div>- assert(err_is_ok(err));</div><div>+ ipi_alloc_notify_try_request(uc);</div><div> </div><div> return SYS_ERR_OK;</div><div> }</div><div><br></div><br><div class="gmail_quote">On Mon, May 7, 2012 at 10:01 PM, Simon Peter <span dir="ltr"><<a href="mailto:speter@inf.ethz.ch" target="_blank">speter@inf.ethz.ch</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Do you have any ideas about why the b->tx_vtbl_ipi_alloc_notify_<u></u>request<br>
(line 69, file /lib/barrelfish/arch/x86/ipi_<u></u>notify.c) would fail with<br>
TX_BUSY error? I saw a immediate assert on this result, does it mean the<br>
request operation is not supposed to fail at all? If not, can I just<br>
detect the TX_BUSY error and do a register_send to make it more robust?<br>
</blockquote>
<br></div>
You should be able to do that. It's probably just an overlooked case where we don't yet handle busy channels. Your suggested register_send() should do the trick.<span class="HOEnZb"><font color="#888888"><br>
<br>
Simon<br>
<br>
</font></span></blockquote></div><br></div>