<html><body>
<p><tt>linuxppc-dev-bounces+lukebrowning=us.ibm.com@ozlabs.org wrote on 01/12/2006 06:01:15 PM:<br>
<br>
&gt; <br>
&gt; Subject: Enable SPU switch notification to detect currently active SPU tasks.<br>
&gt; <br>
&gt; From: Maynard Johnson &lt;maynardj@us.ibm.com&gt;<br>
&gt; <br>
&gt; This patch adds to the capability of spu_switch_event_register to notify the<br>
&gt; caller of currently active SPU tasks. &nbsp;It also exports <br>
&gt; spu_switch_event_register<br>
&gt; and spu_switch_event_unregister.<br>
&gt; <br>
&gt; Signed-off-by: Maynard Johnson &lt;mpjohn@us.ibm.com&gt;<br>
&gt; <br>
&gt; <br>
&gt; Index: linux-2.6.19-rc6-<br>
&gt; arnd1+patches/arch/powerpc/platforms/cell/spufs/sched.c<br>
&gt; ===================================================================<br>
&gt; --- linux-2.6.19-rc6-arnd1+patches.<br>
&gt; orig/arch/powerpc/platforms/cell/spufs/sched.c &nbsp; 2006-11-24 11:34:<br>
&gt; 44.884455680 -0600<br>
&gt; +++ linux-2.6.19-rc6-<br>
&gt; arnd1+patches/arch/powerpc/platforms/cell/spufs/sched.c &nbsp; 2006-12-01<br>
&gt; 13:57:21.864583264 -0600<br>
&gt; @@ -84,15 +84,37 @@<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctx ? ctx-&gt;object_id : 0, spu);<br>
&gt; &nbsp;}<br>
&gt; &nbsp;<br>
&gt; +static void notify_spus_active(void)<br>
&gt; +{<br>
&gt; + &nbsp; int node;<br>
&gt; + &nbsp; for (node = 0; node &lt; MAX_NUMNODES; node++) {<br>
&gt; + &nbsp; &nbsp; &nbsp;struct spu *spu;<br>
&gt; + &nbsp; &nbsp; &nbsp;mutex_lock(&amp;spu_prio-&gt;active_mutex[node]);<br>
&gt; + &nbsp; &nbsp; &nbsp;list_for_each_entry(spu, &amp;spu_prio-&gt;active_list[node], list) {<br>
&gt; + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;struct spu_context *ctx = spu-&gt;ctx;<br>
&gt; + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;blocking_notifier_call_chain(&amp;spu_switch_notifier,<br>
&gt; + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctx ? ctx-&gt;object_id : 0, spu);<br>
&gt; + &nbsp; &nbsp; &nbsp;}<br>
&gt; + &nbsp; &nbsp; &nbsp;mutex_unlock(&amp;spu_prio-&gt;active_mutex[node]);<br>
&gt; + &nbsp; &nbsp;}<br>
&gt; +<br>
&gt; +}<br>
&gt; +<br>
&gt; &nbsp;int spu_switch_event_register(struct notifier_block * n)<br>
&gt; &nbsp;{<br>
&gt; - &nbsp; return blocking_notifier_chain_register(&amp;spu_switch_notifier, n);<br>
&gt; + &nbsp; int ret;<br>
&gt; + &nbsp; ret = blocking_notifier_chain_register(&amp;spu_switch_notifier, n);<br>
&gt; + &nbsp; if (!ret)<br>
&gt; + &nbsp; &nbsp; &nbsp;notify_spus_active();<br>
&gt; + &nbsp; return ret;<br>
&gt; &nbsp;}<br>
&gt; +EXPORT_SYMBOL_GPL(spu_switch_event_register);<br>
&gt; &nbsp;<br>
&gt; &nbsp;int spu_switch_event_unregister(struct notifier_block * n)<br>
&gt; &nbsp;{<br>
&gt; &nbsp; &nbsp; return blocking_notifier_chain_unregister(&amp;spu_switch_notifier, n);<br>
&gt; &nbsp;}<br>
&gt; +EXPORT_SYMBOL_GPL(spu_switch_event_unregister);<br>
&gt; &nbsp;<br>
&gt; &nbsp;<br>
&gt; &nbsp;static inline void bind_context(struct spu *spu, struct spu_context *ctx)<br>
</tt><br>
<tt>Is this really the right strategy? &nbsp;First, it serializes all spu context </tt><br>
<tt>switching at the node level. &nbsp;Second, it performs 17 callouts for every context</tt><br>
<tt>switch. &nbsp;Can't oprofile internally derive the list of active spus from the &nbsp;</tt><br>
<tt>context switch callout. &nbsp;</tt><br>
<br>
<tt>Also, the notify_spus_active() callout is dependent on the return code of </tt><br>
<tt>spu_switch_notify(). &nbsp;Should notification be hierarchical? &nbsp;If I only register </tt><br>
<tt>for the second one, should my notification be dependent on the return code</tt><br>
<tt>of some non-related subsystem's handler. &nbsp;</tt><br>
<br>
<tt>Does blocking_callchain_notifier internally check for the presence of registered</tt><br>
<tt>handlers before it takes locks ...? &nbsp;We should ensure that there is minimal overhead</tt><br>
<tt>when there are no registered handlers.</tt><br>
<br>
<tt>Regards,</tt><br>
<tt>Luke</tt><br>
</body></html>