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