I have seen something similar before.&nbsp; Our fix was to use pthread_attr_setinheritsched(&amp;attr, PTHREAD_EXPLICIT_SCHED) so child threads wouldn&#39;t inherit attribute from parent.&nbsp; Hope it helps.<br><br><br><div><span class="gmail_quote">
On 9/11/07, <b class="gmail_sendername">Ilya Lipovsky</b> &lt;<a href="mailto:lipovsky@cs.bu.edu">lipovsky@cs.bu.edu</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hmm. Just for kicks - inside the important thread could you add:<br><br>int curpolicy;<br>struct sched_param sp;<br>pthread_getschedparam (pthread_self (), &amp;curpolicy, &amp;sp)<br>printf(&quot;important&#39;s policy is %d and priority is %d\n&quot;, curpolicy,
<br>sp.__sched_priority);<br><br>before the very first futex syscall and after your &quot;printf(&quot;important got<br>futex!\n&quot;);&quot; line.<br><br>Do similar for the unimportant thread, and see if you get anything weird -
<br>e.g. priorities come out to be the same for threads.<br><br><br>-----Original Message-----<br>From: linuxppc-embedded-bounces+lipovsky=<a href="mailto:cs.bu.edu@ozlabs.org">cs.bu.edu@ozlabs.org</a><br>[mailto:<a href="mailto:linuxppc-embedded-bounces+lipovsky=cs.bu.edu@ozlabs.org">
linuxppc-embedded-bounces+lipovsky=cs.bu.edu@ozlabs.org</a>] On Behalf<br>Of Benedict, Michael<br>Sent: Monday, September 10, 2007 5:41 PM<br>To: <a href="mailto:linuxppc-embedded@ozlabs.org">linuxppc-embedded@ozlabs.org</a>
<br>Subject: RE: futex priority based wakeup<br><br>Ilya Lipovsky wrote:<br>&gt; Your code looks correct to me, so if the kernel developers<br>&gt; did their job<br>&gt; correctly, the only potentially weak link is glibc.
<br>&gt;<br><br>Well, either the kernel developers didn&#39;t do their job, or I am missing<br>something.&nbsp;&nbsp;The following also fails, and it should be bypassing glibc:<br><br>#define _XOPEN_SOURCE 600<br><br>#include &lt;linux/futex.h&gt;
<br>#include &lt;sys/time.h&gt;<br>#include &lt;asm/atomic.h&gt;<br><br>#include &lt;sys/syscall.h&gt;<br>#include &lt;unistd.h&gt;<br><br>#include &lt;sched.h&gt;<br>#include &lt;stdint.h&gt;<br>#include &lt;stdio.h&gt;<br>
#include &lt;stdlib.h&gt;<br><br>int myfutex = 0;<br><br>void *important(void *ign)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;important waiting for futex\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(syscall(SYS_futex, &amp;myfutex, FUTEX_WAIT, 0, NULL)) {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;futex&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;important got futex!\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;syscall(SYS_futex, &amp;myfutex, FUTEX_WAKE, 1, NULL);
<br>}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL;<br>}<br><br><br>void *unimportant(void *ign)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;unimportant waiting for futex\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(syscall(SYS_futex, &amp;myfutex, FUTEX_WAIT, 0, NULL)) {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;futex&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;unimportant got futex!\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;syscall(SYS_futex, &amp;myfutex, FUTEX_WAKE, 1, NULL);
<br>}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL;<br>}<br><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct sched_param p;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_attr_t attr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_t i, u;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.__sched_priority = sched_get_priority_min(SCHED_FIFO);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(-1 == p.__sched_priority) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;sched_get_priority_min&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_attr_init(&amp;attr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_attr_setschedpolicy(&amp;attr, SCHED_FIFO);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_attr_setschedparam(&amp;attr, &amp;p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(&amp;u, &amp;attr, unimportant, NULL);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.__sched_priority = sched_get_priority_max(SCHED_FIFO);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_attr_setschedparam(&amp;attr, &amp;p);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(&amp;i, &amp;attr, important, NULL);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(5);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;futex FUTEX_WAKE\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;syscall(SYS_futex, &amp;myfutex, FUTEX_WAKE, 1, NULL);
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(u, NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(i, NULL);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}<br><br>Which produces:<br>unimportant waiting for futex<br>important waiting for futex<br>futex FUTEX_WAKE<br>unimportant got futex!
<br>important got futex!<br><br><br>Could someone with 2.6.22 please verify?<br><br>_______________________________________________<br>Linuxppc-embedded mailing list<br><a href="mailto:Linuxppc-embedded@ozlabs.org">Linuxppc-embedded@ozlabs.org
</a><br><a href="https://ozlabs.org/mailman/listinfo/linuxppc-embedded">https://ozlabs.org/mailman/listinfo/linuxppc-embedded</a><br><br>_______________________________________________<br>Linuxppc-embedded mailing list<br>
<a href="mailto:Linuxppc-embedded@ozlabs.org">Linuxppc-embedded@ozlabs.org</a><br><a href="https://ozlabs.org/mailman/listinfo/linuxppc-embedded">https://ozlabs.org/mailman/listinfo/linuxppc-embedded</a><br><br></blockquote>
</div><br>