<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:www.nabble.com,2006:forum-4288</id>
	<title>Nabble - Linux Test Project</title>
	<updated>2008-09-06T11:51:48Z</updated>
	<link rel="self" type="application/atom+xml" href="http://www.nabble.com/Linux-Test-Project-f4288.xml" />
	<link rel="alternate" type="text/html" href="http://www.nabble.com/Linux-Test-Project-f4288.html" />
	<subtitle type="html">The Linux Test Project is a group aimed at testing and improving Linux.  The goal of the LTP is to deliver a suite of automated testing tools for Linux as well as publishing the results of tests we run. Linux Test Project home is &lt;a href=&quot;http://sourceforge.net/projects/ltp/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;.</subtitle>
	
<entry>
	<id>tag:www.nabble.com,2006:post-19349882</id>
	<title>is there anyway to get lcov to generate a function summary report</title>
	<published>2008-09-06T11:51:48Z</published>
	<updated>2008-09-06T11:51:48Z</updated>
	<author>
		<name>Scott Weitzenkamp (sweitzen)</name>
	</author>
	<content type="html">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot;&gt;
&lt;HTML&gt;&lt;HEAD&gt;
&lt;META http-equiv=Content-Type content=&quot;text/html; charset=us-ascii&quot;&gt;
&lt;META content=&quot;MSHTML 6.00.2900.3268&quot; name=GENERATOR&gt;&lt;/HEAD&gt;
&lt;BODY&gt;
&lt;DIV&gt;&lt;SPAN class=765514317-05092008&gt;&lt;FONT face=Arial size=2&gt;I'd like to get a 
web page from lcov that showed the list of unexecuted 
functions.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;FONT face=Arial size=2&gt;&lt;FONT size=2&gt;
&lt;P align=left&gt;Scott Weitzenkamp&lt;BR&gt;SQA and Release Manager&lt;BR&gt;Server Access 
Virtualization Business Unit&lt;BR&gt;Cisco Systems&lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;
&lt;br /&gt;-------------------------------------------------------------------------
&lt;br&gt;This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Ltp-coverage mailing list
&lt;br&gt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19349882&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ltp-coverage@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/ltp-coverage&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/ltp-coverage&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://www.nabble.com/ltp-coverage-f4290.html&quot; embed=&quot;fixTarget[4290]&quot; target=&quot;_top&quot; &gt;ltp-coverage&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://www.nabble.com/is-there-anyway-to-get-lcov-to-generate-a-function-summary-report-tp19349882p19349882.html" />
</entry>

<entry>
	<id>tag:www.nabble.com,2006:post-19339959</id>
	<title>Re: [TESTING] SMP-nice for group scheduling</title>
	<published>2008-09-05T14:36:40Z</published>
	<updated>2008-09-05T14:36:40Z</updated>
	<author>
		<name>Chris Friesen</name>
	</author>
	<content type="html">Subrata Modak wrote:
&lt;br&gt;&lt;br&gt;&amp;gt; It would be great if you can do this. I need this to be compiled fine
&lt;br&gt;&amp;gt; with gcc alone.
&lt;br&gt;&lt;br&gt;The attached version will compile with:
&lt;br&gt;&lt;br&gt;gcc --std=c99 fairtest.c -o fairtest -lm
&lt;br&gt;&lt;br&gt;&amp;gt;&amp;gt;It would certainly be possible, but the whole config parsing routine 
&lt;br&gt;&amp;gt;&amp;gt;would need to be rewritten to allow for commandline-based config 
&lt;br&gt;&amp;gt;&amp;gt;information. &amp;nbsp;I'm curious...what's the issue with reading config files 
&lt;br&gt;&amp;gt;&amp;gt;to control testcases?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; this we can manage with the config file. I will find out some way for
&lt;br&gt;&amp;gt; this.
&lt;br&gt;&lt;br&gt;If this turns out to be very difficult, I could rewrite the parsing 
&lt;br&gt;code. &amp;nbsp;I'd rather not do it if I don't have to though.
&lt;br&gt;&lt;br&gt;Chris
&lt;br&gt;&lt;br /&gt;/*
&lt;br&gt;Author: Nortel Networks 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Chris Friesen		&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19339959&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;cfriesen@...&lt;/a&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Approval token &amp;quot;Nortel-02-July-2008-01&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;Copyright 2008 Nortel Networks
&lt;br&gt;&amp;nbsp; &amp;nbsp;
&lt;br&gt;This program is free software; you can redistribute it and/or modify it under
&lt;br&gt;the terms of the GNU General Public License as published by the Free Software
&lt;br&gt;Foundation; either version 2 of the License, or (at your option) any later
&lt;br&gt;version.
&lt;br&gt;&amp;nbsp; &amp;nbsp;
&lt;br&gt;THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
&lt;br&gt;REPRESENTATIONS, AND CONDITIONS INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&lt;br&gt;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&lt;br&gt;DISCLAIMED. See the GNU General Public License for more details.
&lt;br&gt;&lt;br&gt;&lt;br&gt;IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY DIRECT, INDIRECT,
&lt;br&gt;INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
&lt;br&gt;LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
&lt;br&gt;PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
&lt;br&gt;LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
&lt;br&gt;OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
&lt;br&gt;ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&lt;br&gt;&lt;br&gt;You should have received a copy of the GNU General Public License along with
&lt;br&gt;this program; if not, contact the Free Software Foundation, Inc., 675 Mass Ave,
&lt;br&gt;Cambridge, MA 02139, USA www.fsf.org/ for a copy.
&lt;br&gt;&lt;br&gt;*/
&lt;br&gt;&lt;br&gt;#define _GNU_SOURCE
&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;
&lt;br&gt;#include &amp;lt;string.h&amp;gt;
&lt;br&gt;#include &amp;lt;sys/types.h&amp;gt;
&lt;br&gt;#include &amp;lt;unistd.h&amp;gt;
&lt;br&gt;#include &amp;lt;sys/stat.h&amp;gt;
&lt;br&gt;#include &amp;lt;fcntl.h&amp;gt;
&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;
&lt;br&gt;#include &amp;lt;sched.h&amp;gt;
&lt;br&gt;#include &amp;lt;ctype.h&amp;gt;
&lt;br&gt;#include &amp;lt;sys/syscall.h&amp;gt;
&lt;br&gt;#include &amp;lt;sys/mman.h&amp;gt;
&lt;br&gt;#include &amp;lt;time.h&amp;gt;
&lt;br&gt;#include &amp;lt;math.h&amp;gt;
&lt;br&gt;#include &amp;lt;errno.h&amp;gt;
&lt;br&gt;#include &amp;lt;signal.h&amp;gt;
&lt;br&gt;#include &amp;lt;sys/time.h&amp;gt;
&lt;br&gt;#include &amp;lt;sys/resource.h&amp;gt;
&lt;br&gt;&lt;br&gt;&lt;br&gt;#define GROUP_NAMESIZE 16
&lt;br&gt;#define MAX_CPUS 4
&lt;br&gt;#define MAX_GROUPS 10
&lt;br&gt;&lt;br&gt;#define for_all_kids(i,info) for(int i=0;i&amp;lt;info-&amp;gt;numkidgroups;i++)
&lt;br&gt;#define kid(i,info) info-&amp;gt;kidgroups[i]
&lt;br&gt;#define for_all_hogs(i,info) for(int i=0;i&amp;lt;info-&amp;gt;numhogs;i++)
&lt;br&gt;#define hog(i,info) info-&amp;gt;hogs[i]
&lt;br&gt;&lt;br&gt;&lt;br&gt;struct acct_data_struct
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pid_t pid;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //the following are obtained from /proc/&amp;lt;pid&amp;gt;/sched
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float cputime;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float wait_count;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float wait_max;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float wait_sum;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float wait_avg;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float ctx;
&lt;br&gt;};
&lt;br&gt;&lt;br&gt;struct groupinfo
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct groupinfo *parent;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct groupinfo *kidgroups[MAX_GROUPS];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int numkidgroups;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int share;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float totalpercent;	//expected cpu usage of this group and all child groups
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float percent;		//expected cpu usage of this group
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float net;		//net cpu usage of this group
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float gross;		//gross cpu usage of this group
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float kidweight;	//sum of shares of child groups with cpu hogs
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char name;		//group name
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int numhogs;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int numkidhogs;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pid_t hogs[MAX_CPUS];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct acct_data_struct hogdata[MAX_CPUS];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double totalactual; //sum of actual cpu usage of all hogs for this group (and child groups)
&lt;br&gt;};
&lt;br&gt;&lt;br&gt;int delay=-1;
&lt;br&gt;int duration=-1;
&lt;br&gt;int do_yield=0;
&lt;br&gt;int do_sleep=0;
&lt;br&gt;int verbose=0;
&lt;br&gt;int extraverbose=0;
&lt;br&gt;int doaffine=0;
&lt;br&gt;int setfifo=0;
&lt;br&gt;&lt;br&gt;&lt;br&gt;int numcpus;
&lt;br&gt;struct groupinfo rootgroup;
&lt;br&gt;&lt;br&gt;void printresults(struct groupinfo *info);
&lt;br&gt;&lt;br&gt;char groupname[GROUP_NAMESIZE];
&lt;br&gt;char *buildname(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (info == &amp;rootgroup) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; strcpy(groupname, &amp;quot;root&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return groupname;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char *ptr = groupname+GROUP_NAMESIZE-1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *ptr = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ptr--;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *ptr = info-&amp;gt;name;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while((info=info-&amp;gt;parent) != &amp;rootgroup) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ptr--;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *ptr = '/';
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ptr--;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *ptr = info-&amp;gt;name;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return ptr;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;//can't have group percent be more than numhogs*100
&lt;br&gt;void validatepercents(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (info-&amp;gt;percent/100.0*numcpus &amp;gt; info-&amp;gt;numhogs) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;invalid testcase configuration\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;group \&amp;quot;%s\&amp;quot; cannot use up specified time with given number of hogs\n&amp;quot;, buildname(info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1); 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; validatepercents(kid(i,info));
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;//determine the number of &amp;quot;descendent&amp;quot; hogs
&lt;br&gt;void calckidhogs(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; calckidhogs(kid(i,info));
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;kidweight=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;numkidhogs += kid(i,info)-&amp;gt;numhogs + kid(i,info)-&amp;gt;numkidhogs;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((kid(i,info)-&amp;gt;numhogs &amp;gt; 0) || (kid(i,info)-&amp;gt;kidweight))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;kidweight += kid(i,info)-&amp;gt;share;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }	
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;//calculate the percent of the system that this group should get
&lt;br&gt;void calcpercents(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float percent;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct groupinfo *tmp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //don't do calculation for any group without hogs
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (info == &amp;rootgroup || info-&amp;gt;numhogs==0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto next;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //this group has cpu hogs. &amp;nbsp;Walk up the tree to the root group,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //calculating our expected cpu allocation. &amp;nbsp;Our share is divided by
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //the sum of the weights of our sibling groups with hogs in their
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //descendents, times the share of the parent group.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //This is then repeated at the next level up,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //all the way up to the root group. 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; percent = info-&amp;gt;share;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tmp = info;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(tmp-&amp;gt;parent) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; percent *= tmp-&amp;gt;parent-&amp;gt;share / tmp-&amp;gt;parent-&amp;gt;kidweight;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tmp = tmp-&amp;gt;parent;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;net = percent;
&lt;br&gt;next:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; calcpercents(kid(i,info));
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;void calc_expected(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (info-&amp;gt;numhogs)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;percent = info-&amp;gt;net;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; calc_expected(kid(i,info));
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;int dumpgroup(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!info-&amp;gt;name)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (info == &amp;rootgroup)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto next;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%-s, %5d, %3d, %f\n&amp;quot;, 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; buildname(info), info-&amp;gt;share, info-&amp;gt;numhogs, info-&amp;gt;percent);
&lt;br&gt;next:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dumpgroup(kid(i,info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;void dumpconfig()
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;using settling delay of %d sec, runtime of %d sec\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delay, duration);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;group hierarchy (name, weight, hogs, expected usage):\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dumpgroup(&amp;rootgroup);
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;struct groupinfo * findgroup(struct groupinfo *info, char *name)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (*name == '*')
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return &amp;rootgroup;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //scan kidgroups, try to find group with matching name
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(int i=0;i&amp;lt;MAX_GROUPS;i++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct groupinfo *tmp = kid(i,info);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!tmp) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //haven't found it yet, so doesnt' exist...make it
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct groupinfo *newinfo = (struct groupinfo *)malloc(sizeof(struct groupinfo));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; memset(newinfo,0, sizeof(*newinfo));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; kid(i,info) = newinfo;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; newinfo-&amp;gt;name = *name;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; newinfo-&amp;gt;parent = info;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;numkidgroups++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return newinfo;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //we found a kid, check the name
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (tmp-&amp;gt;name == *name) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //two possibilities, duplicate name or else a child group
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //for now, ignore dupe
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return findgroup(tmp, name+2);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;void validateleafhogs(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (info-&amp;gt;numhogs &amp;&amp; info-&amp;gt;numkidgroups) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;error in group %s, only leaf groups can have cpu hogs\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; buildname(info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; validateleafhogs(kid(i,info));
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;int parsegroup(char *line)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char *nextptr , *ptr = line;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct groupinfo *info;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int num;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nextptr = strchr(ptr, ',');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *nextptr = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info = findgroup(&amp;rootgroup, ptr);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!info) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;unable to parse group, exiting\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //root group is already set up, so ignore it
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (info == &amp;rootgroup)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //parse share
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ptr = nextptr+1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nextptr = strchr(ptr, ',');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *nextptr = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int rc = sscanf(ptr, &amp;quot;%d&amp;quot;, &amp;num);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (rc != 1){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;unable to parse numhogs, exiting\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;next ptr: %s\n&amp;quot;, ptr);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;share=num;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //parse numhogs
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //it's either 0,1,or 'n'
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ptr = nextptr+1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (*ptr == '0')
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;numhogs = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if (*ptr == '1')
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;numhogs = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if (*ptr == 'n')
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;numhogs = numcpus;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;unable to parse numhogs, exiting\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;next ptr: %s\n&amp;quot;, ptr);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;int parseconfig(char *path)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FILE * fp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char * line = NULL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; size_t len = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ssize_t read;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fp = fopen(path, &amp;quot;r&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!fp) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&amp;quot;fopen&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return -1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rootgroup.name='*';
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rootgroup.share=100;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rootgroup.numhogs=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rootgroup.parent=NULL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rootgroup.net = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rootgroup.gross = 100;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while ((read = getline(&amp;line, &amp;len, fp)) != -1) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!len)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; continue;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (line[0] == '#')
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; continue;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (isspace(line[0]))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; continue;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (delay==-1)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sscanf(line, &amp;quot;%d&amp;quot;, &amp;delay);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if (duration==-1)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sscanf(line, &amp;quot;%d&amp;quot;, &amp;duration);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parsegroup(line);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (line)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; free(line);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fclose(fp);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fp=NULL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; validateleafhogs(&amp;rootgroup);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; calckidhogs(&amp;rootgroup);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; calcpercents(&amp;rootgroup);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; calc_expected(&amp;rootgroup);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dumpconfig();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; validatepercents(&amp;rootgroup);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;int setshare(int share, char *path)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char filename[128];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sprintf(filename, &amp;quot;%s/cpu.shares&amp;quot;, path); 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int fd = open(filename, O_RDWR);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char buf[1000];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int len=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; len += sprintf(buf+len, &amp;quot;%d&amp;quot;, share);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int rc = write(fd, buf, strlen(buf)+1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(fd);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (rc &amp;lt; 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%s: errror writing: %s\n&amp;quot;, path, buf);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;int setgroup(pid_t pid, char *path)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char members[128];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sprintf(members, &amp;quot;%s/tasks&amp;quot;, path);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int fd = open(members, O_RDWR);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char buf[100];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sprintf(buf, &amp;quot;%d&amp;quot;, pid);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int rc = write(fd, buf, strlen(buf));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (rc == -1) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&amp;quot;problem setting task group:&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(fd);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;void makegroups(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (info != &amp;rootgroup) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char *name = buildname(info);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mkdir(name, 0777);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setshare(info-&amp;gt;share, name);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; makegroups(kid(i,info));
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;int setupsched()
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; system(&amp;quot;mount -t cgroup -o cpu cgroup /dev/cgroup/ &amp;&amp;gt; /dev/null&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chdir(&amp;quot;/dev/cgroup&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; system(&amp;quot;find /dev/cgroup -type d -mindepth 1 &amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;| sort -r | xargs rmdir &amp;gt;&amp; /dev/null&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; system(&amp;quot;mkdir -p sys;cd sys;echo 2 &amp;gt; cpu.shares;for i in `cat ../tasks`; do echo $i &amp;gt; tasks; &amp;nbsp; done&amp;quot;);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; makegroups(&amp;rootgroup);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;void forkkidgroups(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_hogs(i,info) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int rc = fork();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!rc) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //printf(&amp;quot;pid %d in group %s, cpu %d\n&amp;quot;, getpid(), buildname(info), i);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //fflush(stdout);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (doaffine) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;			cpu_set_t cpumask;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 			CPU_ZERO(&amp;cpumask);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 			CPU_SET(i, &amp;cpumask);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 			int rc = syscall(__NR_sched_setaffinity, getpid(), sizeof(cpumask), &amp;cpumask);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 			if (rc &amp;lt; 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;unable to set affinity for pid %d, cpu %d, group %s: %m&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; getpid(), i, buildname(info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sched_param p;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (setfifo) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p.sched_priority = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sched_setscheduler(getpid(), SCHED_FIFO, &amp;p);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 	p.sched_priority = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 	sched_setscheduler(getpid(), SCHED_OTHER, &amp;p);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setpriority(PRIO_PROCESS, 0, -10);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //infinite loop in child process
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* put ourselves to sleep until woken by parent */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; raise(SIGSTOP);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int count = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(1) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (count++ &amp;gt; 1000000){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; count=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (do_yield)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sched_yield();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (do_sleep) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct timespec ts = {0,1};
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nanosleep(&amp;ts,0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else if (rc&amp;gt;0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* need to put kid into non-rt policy so we can set its group */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sched_param p;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p.sched_priority = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sched_setscheduler(rc, SCHED_OTHER, &amp;p);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hog(i,info)=rc;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setgroup(rc, buildname(info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;error, unable to fork child hog %d, group %s: %m\n&amp;quot;, i, buildname(info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; forkkidgroups(kid(i,info));
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;void killkidgroups(struct groupinfo *info, int sig)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_hogs(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; kill(hog(i,info), sig);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; killkidgroups(kid(i,info), sig);
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;void resetstats(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_hogs(i,info) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char cmd[1024];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; snprintf(cmd, sizeof(cmd), &amp;quot;echo 0 &amp;gt; /proc/%d/sched&amp;quot;, hog(i,info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; system(cmd);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; resetstats(kid(i,info));
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;void parseline(char *line, char *key, float *val)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float tmp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int conv;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char *s = strstr(line, key);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!s)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s = strstr(s, &amp;quot;:&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!s)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; conv = sscanf(s, &amp;quot; %f&amp;quot;, &amp;tmp);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (conv==1)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *val = tmp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;error parsing line %s for key %s&amp;quot;, line, key);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;/* exit if we can't read data for this pid */
&lt;br&gt;void getpiddata(pid_t pid, struct acct_data_struct *data)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FILE * fp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char * line = NULL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; size_t len = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ssize_t read;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char name[1024];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float wait_max, wait_sum, wait_count, sum_exec_runtime,ctx;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (extraverbose) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; snprintf(name, sizeof(name), &amp;quot;cat /proc/%d/sched&amp;quot;, pid);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; system(name);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; snprintf(name, sizeof(name), &amp;quot;/proc/%d/sched&amp;quot;, pid);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fp = fopen(name, &amp;quot;r&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!fp) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;error opening sched stats file for pid %d: %m&amp;quot;, pid);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wait_max = wait_sum = wait_count = sum_exec_runtime = 0;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while ((read = getline(&amp;line, &amp;len, fp)) != -1) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!len) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;error reading stats file for pid %d\n&amp;quot;, pid);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parseline(line, &amp;quot;se.wait_max&amp;quot;, &amp;wait_max);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parseline(line, &amp;quot;se.wait_sum&amp;quot;, &amp;wait_sum);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parseline(line, &amp;quot;se.wait_count&amp;quot;, &amp;wait_count);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parseline(line, &amp;quot;se.sum_exec_runtime&amp;quot;, &amp;sum_exec_runtime);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parseline(line, &amp;quot;nr_switches&amp;quot;, &amp;ctx);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (line)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; free(line);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fclose(fp);
&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!wait_max || !wait_sum || !wait_count || !sum_exec_runtime || !ctx){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;error parsing stats for pid %d\n&amp;quot;, pid);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data-&amp;gt;cputime = sum_exec_runtime;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data-&amp;gt;wait_max = wait_max;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data-&amp;gt;wait_sum = wait_sum;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data-&amp;gt;wait_count = wait_count;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data-&amp;gt;wait_avg = wait_sum/wait_count;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data-&amp;gt;ctx = ctx;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;int updatetime(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_hogs(i,info) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; getpiddata(hog(i,info), &amp;info-&amp;gt;hogdata[i]);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;totalactual+=info-&amp;gt;hogdata[i].cputime;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int rc = updatetime(kid(i,info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (rc == 1)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;totalactual+=kid(i,info)-&amp;gt;totalactual;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;int checktime(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_hogs(i,info) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (hog(i,info) != info-&amp;gt;hogdata[i].pid) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;error, no timing data for pid %d, results unreliable\n&amp;quot;, hog(i,info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int rc = checktime(kid(i,info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (rc == 1)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;float allowed_variance(struct groupinfo *info, int cpu)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //allow 3% of specified weight as error
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float allowed_error = info-&amp;gt;percent * 0.03;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //with smallest tolerance of 0.25%
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (allowed_error &amp;lt; 0.25)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; allowed_error = 0.25;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return allowed_error;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;const char * meets_share_spec(struct groupinfo *info, int hog)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* note....this is the old calculation, need to update it with the new */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float actual;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (hog==-1)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; actual = info-&amp;gt;totalactual*100.0/rootgroup.totalactual;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; actual = (float)info-&amp;gt;hogdata[hog].cputime*100.0*numcpus/rootgroup.totalactual;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float expected = info-&amp;gt;percent;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float allowed_error = allowed_variance(info, 0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((fabs(actual - expected) &amp;lt; allowed_error) || (actual &amp;gt; expected))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return &amp;quot;y&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return &amp;quot;n&amp;quot;;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;float allowed_lat(struct groupinfo *info, int cpu)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float tmp = 1000 / (info-&amp;gt;percent * 10.0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (tmp &amp;lt; 20)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tmp = 20;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return tmp;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;const char * meets_lat_spec(struct groupinfo *info, int cpu)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float worst = info-&amp;gt;hogdata[0].wait_max;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return (allowed_lat(info, cpu) &amp;gt; worst) ? &amp;quot;y&amp;quot; : &amp;quot;n&amp;quot;;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;void printresults_mult(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char tmpbuf[1024];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int pos;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((info==&amp;rootgroup) || (info-&amp;gt;numhogs == 0))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto printkidgroups;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;totalactual=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_hogs(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;totalactual+=info-&amp;gt;hogdata[i].cputime;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //name
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%7s&amp;quot;, buildname(info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (verbose) {	
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot; &amp;nbsp;%s&amp;quot;, meets_share_spec(info, -1));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot;(%s&amp;quot;, meets_share_spec(info, 0));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i=1;i&amp;lt;info-&amp;gt;numhogs;i++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot;/%s&amp;quot;, meets_share_spec(info, i));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%8s)&amp;quot;, tmpbuf);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (verbose) {	
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot; &amp;nbsp;%s&amp;quot;, meets_lat_spec(info, 0));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i=1;i&amp;lt;info-&amp;gt;numhogs;i++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot;/%s&amp;quot;, meets_lat_spec(info, i));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%12s&amp;quot;, tmpbuf);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //actual percent
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot; &amp;nbsp;%5.2f&amp;quot;, (float)info-&amp;gt;totalactual*100.0/rootgroup.totalactual);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (verbose) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot;(%5.2f&amp;quot;, (float)info-&amp;gt;hogdata[0].cputime*100.0*numcpus/rootgroup.totalactual);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i=1;i&amp;lt;info-&amp;gt;numhogs;i++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot;/%.2f&amp;quot;, (float)info-&amp;gt;hogdata[i].cputime*100.0*numcpus/rootgroup.totalactual);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%21s)&amp;quot;, tmpbuf);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%13s&amp;quot;, tmpbuf);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //expected percent
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot; &amp;nbsp;%5.2f&amp;quot;, info-&amp;gt;percent);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%14s&amp;quot;, tmpbuf);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (verbose) {	
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //error
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot; &amp;nbsp;%5.2f&amp;quot;, (float)info-&amp;gt;hogdata[0].cputime*100.0*numcpus/rootgroup.totalactual - info-&amp;gt;percent);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i=1;i&amp;lt;info-&amp;gt;numhogs;i++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot;/%.2f&amp;quot;, (float)info-&amp;gt;hogdata[i].cputime*100.0*numcpus/rootgroup.totalactual - info-&amp;gt;percent);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%14s&amp;quot;, tmpbuf);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //allowed error?
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot; &amp;nbsp; %5.2f&amp;quot;, allowed_variance(info, 0));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%10s&amp;quot;, tmpbuf);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //context switches
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot; &amp;nbsp;%.0f&amp;quot;, info-&amp;gt;hogdata[0].ctx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i=1;i&amp;lt;info-&amp;gt;numhogs;i++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot;/%.0f&amp;quot;, info-&amp;gt;hogdata[i].ctx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%15s&amp;quot;, tmpbuf);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //avg latency
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot; &amp;nbsp; %.0f&amp;quot;, info-&amp;gt;hogdata[0].wait_avg);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i=1;i&amp;lt;info-&amp;gt;numhogs;i++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot;/%.0f&amp;quot;,info-&amp;gt;hogdata[i].wait_avg);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%18s&amp;quot;, tmpbuf);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //worst latency
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot; &amp;nbsp; %.0f&amp;quot;, info-&amp;gt;hogdata[0].wait_max);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i=1;i&amp;lt;info-&amp;gt;numhogs;i++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot;/%.0f&amp;quot;, info-&amp;gt;hogdata[i].wait_max);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%18s&amp;quot;, tmpbuf);
&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (verbose) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //allowed latency
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot; &amp;nbsp; %.2f&amp;quot;, allowed_lat(info, 0));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i=1;i&amp;lt;info-&amp;gt;numhogs;i++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pos += sprintf(tmpbuf + pos, &amp;quot;/%.2f&amp;quot;, allowed_lat(info, i));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%23s&amp;quot;, tmpbuf);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;printkidgroups:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printresults(kid(i,info));
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;//results for single hog
&lt;br&gt;void printresults_single(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float percent, expected;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((info==&amp;rootgroup) || (info-&amp;gt;numhogs == 0))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto printkidgroups;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;totalactual=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_hogs(i,info) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info-&amp;gt;totalactual+=info-&amp;gt;hogdata[i].cputime;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; percent = info-&amp;gt;totalactual * 100.0 / rootgroup.totalactual;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; expected = &amp;nbsp;info-&amp;gt;percent;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%7s&amp;quot;, buildname(info));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (verbose)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%8s%12s &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;, meets_share_spec(info, -1), meets_lat_spec(info, 0));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //printf(&amp;quot;%15.2f&amp;quot;, time_ms);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%13.2f%14.2f&amp;quot;, percent, expected);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (verbose)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%14.2f%14.2f%14.0f&amp;quot;, 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; percent - expected, allowed_variance(info, 0), info-&amp;gt;hogdata[0].ctx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%18.0f%18.0f&amp;quot;, info-&amp;gt;hogdata[0].wait_avg, info-&amp;gt;hogdata[0].wait_max);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (verbose)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%20.2f&amp;quot;, allowed_lat(info,0));
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;\n&amp;quot;);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;printkidgroups:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //could print time/scheduled breakdown per pid within group
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for_all_kids(i,info)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printresults(kid(i,info));
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;void printresults(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (info-&amp;gt;numhogs &amp;gt; 1)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printresults_mult(info);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printresults_single(info);
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;&lt;br&gt;void printout(struct groupinfo *info)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double expected=duration*numcpus*1000.0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double err = fabs(rootgroup.totalactual - expected);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //complain if more than 2% discrepancy between actual and expected duration
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (err/expected &amp;gt; 0.02)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Warning, actual cpu time different than expected. actual: %f, expected: %f\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rootgroup.totalactual, expected);	
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (verbose) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;meets &amp;nbsp; &amp;nbsp; &amp;nbsp; meets\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot; &amp;nbsp;group &amp;nbsp; share spec &amp;nbsp; lat spec &amp;nbsp; &amp;nbsp; &amp;nbsp; actual(%%) &amp;nbsp; &amp;nbsp; expected(%%) &amp;nbsp; &amp;nbsp;error(%%) &amp;nbsp; allowed error(%%) &amp;nbsp;ctx switches &amp;nbsp; avg latency(ms) &amp;nbsp; max_latency(ms) &amp;nbsp;allowed_latency(ms)\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot; &amp;nbsp;group &amp;nbsp; &amp;nbsp; &amp;nbsp; actual(%%) &amp;nbsp; &amp;nbsp; expected(%%) &amp;nbsp; &amp;nbsp;avg latency(ms) &amp;nbsp; max_latency(ms)\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printresults(info);
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;int runtest()
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //configure the scheduler for the test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setupsched();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //create the cpu hogs for each group. &amp;nbsp;They will sleep
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //waiting to be sent SIGCONT.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; forkkidgroups(&amp;rootgroup);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //tell all hogs to continue
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; killkidgroups(&amp;rootgroup, SIGCONT);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //let hogs run for initial delay time to get them settled in
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sleep(delay);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //pause hogs for a sec and reset all the stats, then start them
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; killkidgroups(&amp;rootgroup, SIGSTOP);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; resetstats(&amp;rootgroup);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; killkidgroups(&amp;rootgroup, SIGCONT);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //let hogs run for duration of test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sleep(duration);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //pause all hogs
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; killkidgroups(&amp;rootgroup, SIGSTOP);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //get the runtime data
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; updatetime(&amp;rootgroup);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //terminate all hogs
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; killkidgroups(&amp;rootgroup, SIGTERM);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //dump the data
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printout(&amp;rootgroup);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //erase all groups
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; system(&amp;quot;find /dev/cgroup -type d -mindepth 1 &amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;| sort -r | xargs rmdir &amp;gt;&amp; /dev/null&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;int main(int argc, char **argv)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(1) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int c = getopt(argc, argv, &amp;quot;syvVaf&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch(c) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 'y':
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;doing yield\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;		do_yield = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 's':
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;doing sleep\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; do_sleep = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 'v':
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; verbose = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 'V':
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; verbose = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; extraverbose = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 'a':
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; doaffine = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 'f':
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setfifo=1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case -1:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; default:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; goto done_options;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;done_options:
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; signal(SIGCHLD, SIG_IGN);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // bump up the priority of the main task so we can kill the others
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sched_param p;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p.sched_priority = 2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sched_setscheduler(getpid(), SCHED_RR, &amp;p);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; numcpus = sysconf(_SC_NPROCESSORS_ONLN);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //parse the config file specified in the arg list
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int rc = parseconfig(argv[optind]);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (rc &amp;lt; 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;unable to parse config file\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return -1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; runtest();
&lt;br&gt;}
&lt;br&gt;&lt;br /&gt;-------------------------------------------------------------------------
&lt;br&gt;This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Ltp-list mailing list
&lt;br&gt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19339959&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ltp-list@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/ltp-list&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/ltp-list&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://www.nabble.com/ltp-list-f4291.html&quot; embed=&quot;fixTarget[4291]&quot; target=&quot;_top&quot; &gt;ltp-list&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://www.nabble.com/-TESTING--SMP-nice-for-group-scheduling-tp19152315p19339959.html" />
</entry>

<entry>
	<id>tag:www.nabble.com,2006:post-19339183</id>
	<title>[PATCH] fix getcpu test on parisc</title>
	<published>2008-09-05T13:46:46Z</published>
	<updated>2008-09-05T13:46:46Z</updated>
	<author>
		<name>Helge Deller-3</name>
	</author>
	<content type="html">This patch fixes the getcpu patch for parisc (and probably other platforms as well).
&lt;br&gt;&lt;br&gt;The check for &amp;quot;__GLIBC__ &amp;gt;= 2 &amp;&amp; __GLIBC_MINOR__ &amp;gt;= 6&amp;quot; is wrong.
&lt;br&gt;It breaks as soon as a glibc 3.0 would be published. 
&lt;br&gt;Replace it with __GLIBC_PREREQ(2,6).
&lt;br&gt;&lt;br&gt;Tested on parisc and i386.
&lt;br&gt;&lt;br&gt;Signed-off-by: Helge Deller &amp;lt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19339183&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;deller@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -u -p -r1.1 getcpu01.c
&lt;br&gt;--- testcases/kernel/syscalls/getcpu/getcpu01.c	22 Aug 2008 21:09:59 -0000	1.1
&lt;br&gt;+++ testcases/kernel/syscalls/getcpu/getcpu01.c	5 Sep 2008 20:37:25 -0000
&lt;br&gt;@@ -61,8 +61,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;dirent.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#if defined(__i386__) || defined(__x86_64__)
&lt;br&gt;-	#if defined(__GLIBC__) &amp;&amp; defined(__GLIBC_MINOR__) \
&lt;br&gt;-	 &amp;nbsp; &amp;nbsp;&amp;&amp; __GLIBC__ &amp;gt;= 2 &amp;&amp; __GLIBC_MINOR__ &amp;gt;= 6
&lt;br&gt;+	#if __GLIBC_PREREQ(2,6)
&lt;br&gt;&amp;nbsp;	#if defined(__x86_64__)
&lt;br&gt;&amp;nbsp;		#include &amp;lt;utmpx.h&amp;gt; 
&lt;br&gt;&amp;nbsp;	#endif
&lt;br&gt;@@ -165,12 +164,8 @@ static inline int getcpu(unsigned *cpu_i
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp;	#if defined(__i386__)
&lt;br&gt;&amp;nbsp;		return syscall(318, cpu_id,node_id,cache_struct);
&lt;br&gt;-	#elif defined(__x86_64__) 
&lt;br&gt;-		#if defined(__GLIBC__) &amp;&amp; defined(__GLIBC_MINOR__) \
&lt;br&gt;-		 &amp;nbsp; &amp;nbsp;&amp;&amp; __GLIBC__ &amp;gt;= 2 &amp;&amp; __GLIBC_MINOR__ &amp;gt;= 6
&lt;br&gt;-			return *cpu_id = sched_getcpu();
&lt;br&gt;-		#endif
&lt;br&gt;-	return 0;
&lt;br&gt;+	#elif __GLIBC_PREREQ(2,6)
&lt;br&gt;+		return *cpu_id = sched_getcpu();
&lt;br&gt;&amp;nbsp;	#endif
&lt;br&gt;&amp;nbsp;	return 0;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;-------------------------------------------------------------------------
&lt;br&gt;This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Ltp-list mailing list
&lt;br&gt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19339183&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ltp-list@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/ltp-list&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/ltp-list&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://www.nabble.com/ltp-list-f4291.html&quot; embed=&quot;fixTarget[4291]&quot; target=&quot;_top&quot; &gt;ltp-list&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://www.nabble.com/-PATCH--fix-getcpu-test-on-parisc-tp19339183p19339183.html" />
</entry>

<entry>
	<id>tag:www.nabble.com,2006:post-19330458</id>
	<title>Re: [PATCH] Fix utimensat build failure</title>
	<published>2008-09-05T05:42:59Z</published>
	<updated>2008-09-05T05:42:59Z</updated>
	<author>
		<name>Michael Kerrisk-4</name>
	</author>
	<content type="html">On Fri, Sep 5, 2008 at 8:16 AM, Subrata Modak
&lt;br&gt;&amp;lt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19330458&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;subrata@...&lt;/a&gt;&amp;gt; wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; On Thu, 2008-09-04 at 20:39 +0530, Subrata Modak wrote:
&lt;br&gt;&amp;gt;&amp;gt; Hi Michael,
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I have seen that in some of my systems, utimensat fails to build because
&lt;br&gt;&amp;gt;&amp;gt; of some definitions missing in system headers. Do, you think we can
&lt;br&gt;&amp;gt;&amp;gt; apply the following patch:
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Signed-Off-By: Subrata Modak &amp;lt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19330458&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;subrata@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; I thought this to be prudent until all headers are properly updated.
&lt;br&gt;&amp;gt; Hence i merged this.
&lt;/div&gt;&lt;br&gt;Looking at the kernel headers, these two constants are defined in
&lt;br&gt;headers common to all architectures, so I think this should be okay.
&lt;br&gt;&lt;br&gt;Cheers,
&lt;br&gt;&lt;br&gt;Michael
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; ---
&lt;br&gt;&amp;gt;&amp;gt; diff -uprN
&lt;br&gt;&amp;gt;&amp;gt; ltp-full-20080831.orig/testcases/kernel/syscalls/utimensat/utimensat01.c
&lt;br&gt;&amp;gt;&amp;gt; ltp-full-20080831/testcases/kernel/syscalls/utimensat/utimensat01.c
&lt;br&gt;&amp;gt;&amp;gt; ---
&lt;br&gt;&amp;gt;&amp;gt; ltp-full-20080831.orig/testcases/kernel/syscalls/utimensat/utimensat01.c
&lt;br&gt;&amp;gt;&amp;gt; 2008-09-04 20:33:24.000000000 +0530
&lt;br&gt;&amp;gt;&amp;gt; +++ ltp-full-20080831/testcases/kernel/syscalls/utimensat/utimensat01.c
&lt;br&gt;&amp;gt;&amp;gt; 2008-09-04 20:36:39.000000000 +0530
&lt;br&gt;&amp;gt;&amp;gt; @@ -50,6 +50,13 @@
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#ifdef __NR_utimensat
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; +#ifndef AT_FDCWD
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp;#define AT_FDCWD -100
&lt;br&gt;&amp;gt;&amp;gt; +#endif
&lt;br&gt;&amp;gt;&amp;gt; +#ifndef AT_SYMLINK_NOFOLLOW
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp;#define AT_SYMLINK_NOFOLLOW 0x100
&lt;br&gt;&amp;gt;&amp;gt; +#endif
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#define EXIT_bad_usage 3
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp;#define EXIT_failed_syscall 3
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Regards--
&lt;br&gt;&amp;gt;&amp;gt; Subrata
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; -------------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt; This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;&amp;gt;&amp;gt; Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;&amp;gt;&amp;gt; Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt; _______________________________________________
&lt;br&gt;&amp;gt;&amp;gt; Ltp-list mailing list
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19330458&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ltp-list@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/ltp-list&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/ltp-list&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Michael Kerrisk
&lt;br&gt;Linux man-pages maintainer; &lt;a href=&quot;http://www.kernel.org/doc/man-pages/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.kernel.org/doc/man-pages/&lt;/a&gt;&lt;br&gt;man-pages online: &lt;a href=&quot;http://www.kernel.org/doc/man-pages/online_pages.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.kernel.org/doc/man-pages/online_pages.html&lt;/a&gt;&lt;br&gt;Found a bug? &lt;a href=&quot;http://www.kernel.org/doc/man-pages/reporting_bugs.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.kernel.org/doc/man-pages/reporting_bugs.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;-------------------------------------------------------------------------
&lt;br&gt;This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Ltp-list mailing list
&lt;br&gt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19330458&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ltp-list@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/ltp-list&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/ltp-list&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://www.nabble.com/ltp-list-f4291.html&quot; embed=&quot;fixTarget[4291]&quot; target=&quot;_top&quot; &gt;ltp-list&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://www.nabble.com/-PATCH--Fix-utimensat-build-failure-tp19312679p19330458.html" />
</entry>

<entry>
	<id>tag:www.nabble.com,2006:post-19329408</id>
	<title>[RFC] [OLS 2008 FALLOUT] Issue # 3 (LTP-Robust)</title>
	<published>2008-09-05T04:33:53Z</published>
	<updated>2008-09-05T04:33:53Z</updated>
	<author>
		<name>Subrata Modak</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;With a brief stop over in our fallout discussion, i thought of resuming
&lt;br&gt;discussing the other issues i came up.
&lt;br&gt;&lt;br&gt;As we have proposed in our OLS 2008 paper:
&lt;br&gt;&lt;a href=&quot;http://ltp.sourceforge.net/documentation/technical_papers/ltp-ols-2008-paper.pdf&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://ltp.sourceforge.net/documentation/technical_papers/ltp-ols-2008-paper.pdf&lt;/a&gt;,
&lt;br&gt;&lt;br&gt;about LTP-robust, which will be a sub-project under LTP. As we are aware
&lt;br&gt;that we have huge limitation in improving code coverage in testing from
&lt;br&gt;the user space alone, as , we do not have sufficient test cases to test
&lt;br&gt;all the features that gets added in the kernel exponentially. The reason
&lt;br&gt;for that is well known, as, we do not have enough volunteers to write
&lt;br&gt;test cases and keep up testing the growing kernel.
&lt;br&gt;&lt;br&gt;Hence, we envisaged the concept of creation of LTP-Robust, which
&lt;br&gt;basically will be a mechanism built in LTP to inject faults in the
&lt;br&gt;kernel. Mechanism of LTP-Robust should be able to do the following:
&lt;br&gt;&lt;br&gt;1) Inject Random faults inside the kernel, when individual test cases
&lt;br&gt;are being run by PAN,
&lt;br&gt;2) PAN should be able to detect that test failures are because of
&lt;br&gt;dynamic faults injected, rather than actual faults in the kernel,
&lt;br&gt;3) Once it is able to decipher this information, it should be able to
&lt;br&gt;restart that test once again with fault-less kernel.
&lt;br&gt;&lt;br&gt;With the above testing methods, we believe we can improve the code
&lt;br&gt;coverage by also touching the error paths inside the kernel, which in
&lt;br&gt;normal circumstance will not be touched by the test code. In order to
&lt;br&gt;achieve the above mechanism, we need to change the PAN (ltp/pan/pan.c)
&lt;br&gt;code.
&lt;br&gt;&lt;br&gt;I would like to know if any of you would be interested to work on this.
&lt;br&gt;Before that let us discuss and sort out things which you think needs
&lt;br&gt;attention before embarking.
&lt;br&gt;&lt;br&gt;Regards--
&lt;br&gt;Subrata
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-------------------------------------------------------------------------
&lt;br&gt;This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Ltp-list mailing list
&lt;br&gt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19329408&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ltp-list@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/ltp-list&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/ltp-list&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://www.nabble.com/ltp-list-f4291.html&quot; embed=&quot;fixTarget[4291]&quot; target=&quot;_top&quot; &gt;ltp-list&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://www.nabble.com/-RFC---OLS-2008-FALLOUT--Issue---3-%28LTP-Robust%29-tp19329408p19329408.html" />
</entry>

<entry>
	<id>tag:www.nabble.com,2006:post-19329308</id>
	<title>Re: Network and Network stress tests setup!!!</title>
	<published>2008-09-05T04:27:51Z</published>
	<updated>2008-09-05T04:27:51Z</updated>
	<author>
		<name>Suyog Upadhye</name>
	</author>
	<content type="html">&lt;div dir=&quot;ltr&quot;&gt;Hi Rishi,&lt;br&gt;&lt;br&gt;Even I had the same doubt. As per your suggestions I have done the manual setup according to the HOWTO.txt file for LTP.&lt;br&gt;But still I am getting the same old results.&lt;br&gt;&lt;br&gt;I have changed the .conf files as per the instructions. I restart the xinetd by &amp;quot;/etc/init.d/xinetd restart&amp;quot; and then do &amp;quot;chkconfig [service-name] on&amp;quot; &lt;br&gt;
Is this method right? Or is there any other way to restart the xinetd?&lt;br&gt;&lt;br&gt;Regards,&lt;br&gt;Suyog&lt;br&gt;&lt;br&gt;&lt;div class=&quot;gmail_quote&quot;&gt;On Fri, Sep 5, 2008 at 2:50 PM, Rishikesh K. Rajak &lt;span dir=&quot;ltr&quot;&gt;&amp;lt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19329308&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;risrajak@...&lt;/a&gt;&amp;gt;&lt;/span&gt; wrote:&lt;br&gt;
&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;&quot;&gt;


  
  

&lt;div&gt;
Yes i doubt so. So here the conclusion is, all the testcase related to r is failing/broken. so you have to manually configure rsh, rlogin, ftp etc whichever services you want to enable between client and server.&lt;br&gt;
&lt;br&gt;
Please enable and configure all the network services before running LTP network test.&lt;br&gt;
&lt;br&gt;
-Rishi&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class=&quot;Wj3C7c&quot;&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
On Fri, 2008-09-05 at 14:40 +0530, Suyog Upadhye wrote:
&lt;blockquote type=&quot;CITE&quot;&gt;
    &lt;font color=&quot;#000000&quot;&gt;Hi Rishi,&lt;/font&gt;&lt;br&gt;
    &lt;br&gt;
    &lt;font color=&quot;#000000&quot;&gt;I am attaching the result log, which LTP creates in /tmp folder.&lt;/font&gt;&lt;br&gt;
    &lt;font color=&quot;#000000&quot;&gt;netpan.log and netstress.log are the files created after running networktests.sh and networkstress.sh respectively.&lt;/font&gt;&lt;br&gt;
    &lt;font color=&quot;#000000&quot;&gt;networkResults.console.log is basically the console output after running networktests.sh.&lt;/font&gt;&lt;br&gt;
    &lt;br&gt;
    &lt;font color=&quot;#000000&quot;&gt;Kindly note that I have run networkstress.sh script with &amp;#39;-i&amp;#39; (icmp) and -t (tcp) option only.&lt;/font&gt;&lt;br&gt;
    &lt;br&gt;
    &lt;font color=&quot;#000000&quot;&gt;As per my understanding, I have to export RHOST and PASSWD in networktests.sh which I am doing.&lt;/font&gt;&lt;br&gt;
    &lt;font color=&quot;#000000&quot;&gt;And in networkstress.sh I need to export RHOST, RHOST_HWADDR (mac address), HTTP_DOWNLOAD_DIR, FTP_DOWNLOAD_DIR, FTP_UPLOAD_DIR, FTP_UPLOAD_URLDIR, IPV4_NETWORK, LHOST_IPV4_HOST, RHOST_IPV4_HOST, IPV4_NETWORK_REVERSE. In this case I am only setting RHOST and RHOST_HWADDR. Rest all is not very clear to me.&lt;/font&gt;&lt;br&gt;

    &lt;br&gt;
    &lt;br&gt;
    &lt;font color=&quot;#000000&quot;&gt;Regards,&lt;/font&gt;&lt;br&gt;
    &lt;font color=&quot;#000000&quot;&gt;Suyog&lt;/font&gt;&lt;br&gt;
    &lt;font color=&quot;#000000&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;br&gt;
    &lt;br&gt;
&lt;/blockquote&gt;
&lt;blockquote type=&quot;CITE&quot;&gt;
    &lt;font color=&quot;#000000&quot;&gt;On Fri, Sep 5, 2008 at 1:53 PM, Rishikesh K. Rajak &amp;lt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19329308&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;risrajak@...&lt;/a&gt;&amp;gt; wrote:&lt;/font&gt;
&lt;/blockquote&gt;
&lt;blockquote type=&quot;CITE&quot;&gt;
    &lt;blockquote&gt;
        &lt;font color=&quot;#000000&quot;&gt;Hi,&lt;/font&gt;&lt;br&gt;
        &lt;br&gt;
        &lt;font color=&quot;#000000&quot;&gt;Before running ltp-network test you have to configure many things e.g: rsh, ftp, dhcp server etc...&lt;/font&gt;&lt;br&gt;
        &lt;br&gt;
        &lt;font color=&quot;#000000&quot;&gt;Can you show us your failure so that i can tell you what other configuration you require to run successfully on your machine ?&lt;/font&gt;&lt;br&gt;
        &lt;br&gt;
        &lt;font color=&quot;#000000&quot;&gt;I hope you are running the latest ltp.&lt;/font&gt;&lt;br&gt;
        &lt;br&gt;
        &lt;font color=&quot;#000000&quot;&gt;-Rishi&lt;/font&gt;
    &lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote type=&quot;CITE&quot;&gt;
    &lt;blockquote&gt;
        &lt;br&gt;
    &lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote type=&quot;CITE&quot;&gt;
    &lt;blockquote&gt;
        &lt;br&gt;
        &lt;br&gt;
        &lt;font color=&quot;#000000&quot;&gt;On Fri, 2008-09-05 at 12:28 +0530, Suyog Upadhye wrote: &lt;/font&gt;&lt;br&gt;
        &lt;blockquote type=&quot;CITE&quot;&gt;
            &lt;font color=&quot;#000000&quot;&gt;Hi,&lt;/font&gt;&lt;br&gt;
            &lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;I am trying to run networktests.sh and networkstress.sh on a setup of two machines.&lt;/font&gt;&lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;I have same version of LTP on both the machines. I have added RHOST/PASSWD entries in networktests.sh and in networkstress.sh.&lt;/font&gt;&lt;br&gt;
            &lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;I am seeing only 10 test cases out of 33 network test cases are passed and no test case is passing in network stress test cases.&lt;/font&gt;&lt;br&gt;
            &lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;I doubt this is mainly the issue with the setup. &lt;/font&gt;&lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;Can you kindly send me a consolidated list of the exports need to be done or if any services need to be restarted?&lt;/font&gt;&lt;br&gt;
            &lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;I am doing the following.&lt;/font&gt;&lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;1. Installed all the servers on build machine. (e.g. telnetd, ftp, rlogin, finger etc.) &lt;/font&gt;&lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;2. /etc/init.d/xinetd restart&lt;/font&gt;&lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;3. service nfs restart&lt;/font&gt;&lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;(Both machines can ping to each other normally, but all icmp tests in networkstress.sh are failing.)&lt;/font&gt;&lt;br&gt;
            &lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;Kindly let me know if I am on right track. And also let me know any pointers or a list of software setup instructions.&lt;/font&gt;&lt;br&gt;
            &lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;Regards,&lt;/font&gt;&lt;br&gt;
            &lt;font color=&quot;#000000&quot;&gt;Suyog&lt;/font&gt;&lt;br&gt;
            &lt;br&gt;
        &lt;/blockquote&gt;
    &lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote type=&quot;CITE&quot;&gt;
    &lt;blockquote&gt;
        &lt;blockquote type=&quot;CITE&quot;&gt;
&lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;-------------------------------------------------------------------------&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;This SF.Net email is sponsored by the Moblin Your Move Developer&amp;#39;s challenge&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;Build the coolest Linux based applications with Moblin SDK &amp;amp; win great prizes&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;Grand prize is a trip for two to an Open Source event anywhere in the world&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;amp;url=/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;amp;url=/&lt;/a&gt;&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;_______________________________________________ Ltp-list mailing list &lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19329308&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ltp-list@...&lt;/a&gt; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/ltp-list&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/ltp-list&lt;/a&gt;&lt;/font&gt;
&lt;/pre&gt;
        &lt;/blockquote&gt;
    &lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote type=&quot;CITE&quot;&gt;
    &lt;br&gt;
    &lt;br&gt;
&lt;/blockquote&gt;
&lt;blockquote type=&quot;CITE&quot;&gt;
&lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;-------------------------------------------------------------------------&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;This SF.Net email is sponsored by the Moblin Your Move Developer&amp;#39;s challenge&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;Build the coolest Linux based applications with Moblin SDK &amp;amp; win great prizes&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;Grand prize is a trip for two to an Open Source event anywhere in the world&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;amp;url=/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;amp;url=/&lt;/a&gt;&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;_______________________________________________ Ltp-list mailing list &lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19329308&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ltp-list@...&lt;/a&gt; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/ltp-list&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/ltp-list&lt;/a&gt;&lt;/font&gt;
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;

&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;
&lt;br /&gt;-------------------------------------------------------------------------
&lt;br&gt;This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Ltp-list mailing list
&lt;br&gt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19329308&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ltp-list@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/ltp-list&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/ltp-list&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://www.nabble.com/ltp-list-f4291.html&quot; embed=&quot;fixTarget[4291]&quot; target=&quot;_top&quot; &gt;ltp-list&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://www.nabble.com/Network-and-Network-stress-tests-setup%21%21%21-tp19325931p19329308.html" />
</entry>

<entry>
	<id>tag:www.nabble.com,2006:post-19329082</id>
	<title>Re: [TESTING] x86: implement prctl PR_GET_TSC and PR_SET_TSC	in	2.6.26</title>
	<published>2008-09-05T04:09:37Z</published>
	<updated>2008-09-05T04:09:37Z</updated>
	<author>
		<name>Subrata Modak</name>
	</author>
	<content type="html">Hi Erik,
&lt;br&gt;&lt;br&gt;On Thu, 2008-09-04 at 18:44 +0530, Subrata Modak wrote:
&lt;br&gt;&amp;gt; Hi Erik,
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; On Mon, 2008-09-01 at 19:36 +0200, Erik Bosman wrote:
&lt;br&gt;&amp;gt; &amp;gt; Hi Subrata,
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; Sorry for my late reaction. I'm busy working on my Master thesis right
&lt;br&gt;&amp;gt; &amp;gt; now.
&lt;br&gt;&lt;br&gt;I would disturb you for a brief period once again.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; On Tue, 26 Aug 2008, Subrata Modak wrote:
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; Hi Erik,
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; Would you kindly let us know how you tested prctl PR_GET_TSC and
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; PR_SET_TSC, which is added in 2.6.26. Did you write/develop an automated
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; test case(s) of your own. Let us know if you would like the same to
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; share with LTP under GPLv2.
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; One of my patches added three tests to the Documentation/prctl, so you can
&lt;br&gt;&amp;gt; &amp;gt; find them there from 2.6.26 on. They are not automated but it is not hard
&lt;br&gt;&amp;gt; &amp;gt; to change that. I would recommend using disable-tsc-on-off-stress-test.c.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Thank you very much. I would look into them surely, and see how i can
&lt;br&gt;&amp;gt; integrate them inside LTP.
&lt;/div&gt;&lt;br&gt;I have run those tests on i686, x86_64 &amp; ppc64 running 2.6.26 kernel.
&lt;br&gt;And here are my observations:
&lt;br&gt;&lt;br&gt;1) Built and ran perfectly on X86_64:
&lt;br&gt;&lt;br&gt;# uname -a
&lt;br&gt;Linux 2.6.26-autokern1 #1 SMP PREEMPT Fri Sep 5 09:40:31 UTC 2008 x86_64
&lt;br&gt;GNU/Linux
&lt;br&gt;&lt;br&gt;# ./disable-tsc-test &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;rdtsc() == 9766811077875
&lt;br&gt;prctl(PR_GET_TSC, &amp;tsc_val); tsc_val == PR_TSC_ENABLE
&lt;br&gt;rdtsc() == 9766811184102
&lt;br&gt;prctl(PR_SET_TSC, PR_TSC_ENABLE)
&lt;br&gt;rdtsc() == 9766811200743
&lt;br&gt;prctl(PR_SET_TSC, PR_TSC_SIGSEGV)
&lt;br&gt;rdtsc() == [ SIG_SEGV ]
&lt;br&gt;prctl(PR_GET_TSC, &amp;tsc_val); tsc_val == PR_TSC_SIGSEGV
&lt;br&gt;prctl(PR_SET_TSC, PR_TSC_ENABLE)
&lt;br&gt;rdtsc() == 9766811246535
&lt;br&gt;# echo $?
&lt;br&gt;0
&lt;br&gt;&lt;br&gt;# ./disable-tsc-on-off-stress-test 
&lt;br&gt;[No further output means we're allright]
&lt;br&gt;# echo $?
&lt;br&gt;0
&lt;br&gt;&lt;br&gt;# ./disable-tsc-ctxt-sw-stress-test 
&lt;br&gt;[No further output means we're allright]
&lt;br&gt;# echo $?
&lt;br&gt;0
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;2) Built fine on i686, but disable-tsc-on-off-stress-test failed:
&lt;br&gt;&lt;br&gt;# uname -a
&lt;br&gt;Linux 2.6.26-autokern1 #1 SMP Fri Sep 5 09:49:37 UTC 2008 i686 GNU/Linux
&lt;br&gt;&lt;br&gt;# ./disable-tsc-test 
&lt;br&gt;rdtsc() == 4098191459558
&lt;br&gt;prctl(PR_GET_TSC, &amp;tsc_val); tsc_val == PR_TSC_ENABLE
&lt;br&gt;rdtsc() == 4098192032718
&lt;br&gt;prctl(PR_SET_TSC, PR_TSC_ENABLE)
&lt;br&gt;rdtsc() == 4098192209502
&lt;br&gt;prctl(PR_SET_TSC, PR_TSC_SIGSEGV)
&lt;br&gt;rdtsc() == [ SIG_SEGV ]
&lt;br&gt;prctl(PR_GET_TSC, &amp;tsc_val); tsc_val == PR_TSC_SIGSEGV
&lt;br&gt;prctl(PR_SET_TSC, PR_TSC_ENABLE)
&lt;br&gt;rdtsc() == 4098192880534
&lt;br&gt;# echo $?
&lt;br&gt;0
&lt;br&gt;&lt;br&gt;# ./disable-tsc-on-off-stress-test 
&lt;br&gt;Floating point exception
&lt;br&gt;# echo $?
&lt;br&gt;136
&lt;br&gt;&lt;br&gt;# ./disable-tsc-ctxt-sw-stress-test 
&lt;br&gt;[No further output means we're allright]
&lt;br&gt;# echo $?
&lt;br&gt;0
&lt;br&gt;&lt;br&gt;&lt;br&gt;3) Build failure on ppc64 with a POWER6 cpu:
&lt;br&gt;&lt;br&gt;# uname -a
&lt;br&gt;Linux 2.6.26-autokern1 #1 SMP Fri Sep 5 05:41:12 EDT 2008 ppc64 ppc64
&lt;br&gt;ppc64 GNU/Linux
&lt;br&gt;&lt;br&gt;# make
&lt;br&gt;cc &amp;nbsp; &amp;nbsp; disable-tsc-ctxt-sw-stress-test.c &amp;nbsp; -o
&lt;br&gt;disable-tsc-ctxt-sw-stress-test
&lt;br&gt;disable-tsc-ctxt-sw-stress-test.c: In function ‘rdtsc’:
&lt;br&gt;disable-tsc-ctxt-sw-stress-test.c:33: error: impossible constraint in
&lt;br&gt;‘asm’
&lt;br&gt;make: *** [disable-tsc-ctxt-sw-stress-test] Error 1
&lt;br&gt;&lt;br&gt;# gcc --version
&lt;br&gt;gcc (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42)
&lt;br&gt;Copyright (C) 2006 Free Software Foundation, Inc.
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Can you kindly help us fix the:
&lt;br&gt;1) Floating point exception for disable-tsc-on-off-stress-test, running
&lt;br&gt;2.6.26 on i686,
&lt;br&gt;2) build failure issue(s) with ppc64.
&lt;br&gt;&lt;br&gt;I also see the following issue(s) when i run it on i386 machine running
&lt;br&gt;kernel less than 2.6.26:
&lt;br&gt;&lt;br&gt;$ uname -a
&lt;br&gt;Linux 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:12 EDT 2008 i686 i686 i386
&lt;br&gt;GNU/Linux
&lt;br&gt;&lt;br&gt;$ ./disable-tsc-test 
&lt;br&gt;rdtsc() == 34367216958620
&lt;br&gt;prctl(PR_GET_TSC, &amp;tsc_val); prctl: Invalid argument
&lt;br&gt;tsc_val == [not set]
&lt;br&gt;rdtsc() == 34367217591252
&lt;br&gt;prctl(PR_SET_TSC, PR_TSC_ENABLE)
&lt;br&gt;prctl: Invalid argument
&lt;br&gt;rdtsc() == 34367217645449
&lt;br&gt;prctl(PR_SET_TSC, PR_TSC_SIGSEGV)
&lt;br&gt;prctl: Invalid argument
&lt;br&gt;rdtsc() == 34367217698450
&lt;br&gt;$ echo $?
&lt;br&gt;0
&lt;br&gt;&lt;br&gt;$ ./disable-tsc-ctxt-sw-stress-test 
&lt;br&gt;[No further output means we're allright]
&lt;br&gt;prctl: Invalid argument
&lt;br&gt;prctl: Invalid argument
&lt;br&gt;..............
&lt;br&gt;..............
&lt;br&gt;prctl: Invalid argument
&lt;br&gt;$ echo $?
&lt;br&gt;0
&lt;br&gt;&lt;br&gt;$ ./disable-tsc-ctxt-sw-stress-test 
&lt;br&gt;[No further output means we're allright]
&lt;br&gt;prctl: Invalid argument
&lt;br&gt;prctl: Invalid argument
&lt;br&gt;..............
&lt;br&gt;..............
&lt;br&gt;prctl: Invalid argument
&lt;br&gt;$ echo $?
&lt;br&gt;0
&lt;br&gt;&lt;br&gt;Should it not fail on any kernel(s) below 2.6.26 ? It shows pass for all
&lt;br&gt;the tests. And also lots of lines like:
&lt;br&gt;&lt;br&gt;prctl: Invalid argument
&lt;br&gt;&lt;br&gt;is printed, which in ideal situation should not be printed at all. What
&lt;br&gt;do you think ?
&lt;br&gt;&lt;br&gt;Regards--
&lt;br&gt;Subrata
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; Is it a problem if the test causes a very high load?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; No, there is no such problem. But we will run it separately rather than
&lt;br&gt;&amp;gt; with default run. Normally, we run the stress tests separately from the
&lt;br&gt;&amp;gt; normal functional tests.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Regards--
&lt;br&gt;&amp;gt; Subrata
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; We already have the prctl() test cases in LTP and probably with this
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; addition, we need to add some more tests to the existing scenario. Would
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; you review the existing ones too:
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; &amp;gt; &lt;a href=&quot;http://ltp.cvs.sourceforge.net/ltp/ltp/testcases/kernel/syscalls/prctl/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://ltp.cvs.sourceforge.net/ltp/ltp/testcases/kernel/syscalls/prctl/&lt;/a&gt;,
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; Prctl is by definition a very diverse syscall, I am not an expert on
&lt;br&gt;&amp;gt; &amp;gt; all prctl calls. I don't think I can help you with many of them (as I
&lt;br&gt;&amp;gt; &amp;gt; don't have the hardware, ) and as I said, I'm rather busy finishing my
&lt;br&gt;&amp;gt; &amp;gt; master thesis.
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; Regards,
&lt;br&gt;&amp;gt; &amp;gt; Erik
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; -------------------------------------------------------------------------
&lt;br&gt;&amp;gt; This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;&amp;gt; Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;&amp;gt; Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br&gt;&amp;gt; _______________________________________________
&lt;br&gt;&amp;gt; Ltp-list mailing list
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19329082&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ltp-list@...&lt;/a&gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/ltp-list&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/ltp-list&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;-------------------------------------------------------------------------
&lt;br&gt;This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;Build the coolest Linux based applications with Moblin SDK &amp; win great prizes
&lt;br&gt;Grand prize is a trip for two to an Open Source event anywhere in the world
&lt;br&gt;&lt;a href=&quot;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://moblin-contest.org/redirect.php?banner_id=100&amp;url=/&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Ltp-list mailing list
&lt;br&gt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19329082&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ltp-list@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/ltp-list&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/ltp-list&lt;/a&gt;&lt;br&gt;&lt;p&gt;From forum: &lt;a href=&quot;http://www.nabble.com/ltp-list-f4291.html&quot; embed=&quot;fixTarget[4291]&quot; target=&quot;_top&quot; &gt;ltp-list&lt;/a&gt;&lt;/p&gt;</content>
	<link rel="alternate" type="text/html" href="http://www.nabble.com/-TESTING--x86%3A-implement-prctl-PR_GET_TSC-and-PR_SET_TSC-in-2.6.26-tp19166941p19329082.html" />
</entry>

<entry>
	<id>tag:www.nabble.com,2006:post-19328741</id>
	<title>Re: Access to non-Linux systems for testing purposes</title>
	<published>2008-09-05T03:43:18Z</published>
	<updated>2008-09-05T03:43:18Z</updated>
	<author>
		<name>Subrata Modak</name>
	</author>
	<content type="html">&lt;br&gt;On Fri, 2008-09-05 at 12:41 +0200, Michael Kerrisk wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi Subrata
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Thanks for your reply.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; On Thu, Sep 4, 2008 at 2:46 PM, Subrata Modak
&lt;br&gt;&amp;gt; &amp;lt;&lt;a href=&quot;http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=19328741&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;subrata@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt; &amp;gt; Hi Michael,
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Sorry for the late reply.
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; On Tue, 2008-09-02 at 08:16 -0700, Michael Kerrisk wrote:
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Hello,
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; This list may be a fruitful place to ask this question.
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; For the purposes of writing and verifying Linux man pages, I sometimes
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; want to run test programs on other Unix systems in order to verify
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; portability details. &amp;nbsp;I currently have access to some versions of
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; FreeBSD, and also, thanks to www.testdrive.hp.com, HP-UX. &amp;nbsp;I also have
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; private access to Solaris 8. &amp;nbsp;However, I'd very much like to get
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; access to other systems -- especially Solaris 9 and/or 10, but other
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Unixes are also of interest.
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; I have access to only IBM hardwares like the i386, x86_64, ppc, ppc64,
&lt;br&gt;&amp;gt; &amp;gt; ia64 &amp; s390x only.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; I'm not sure whether you've misunderstood my question in this mail (as
&lt;br&gt;&amp;gt; opposed to the mail I sent to you offlist). &amp;nbsp;Here I'm asking about
&lt;br&gt;&amp;gt; access to Unix systems *other than* Linux -- especially Solaris 9, 10,
&lt;br&gt;&amp;gt; but others Unixes also. &amp;nbsp;I suspect that the systems you list above are
&lt;br&gt;&amp;gt; all running Linux, right?
&lt;/div&gt;&lt;br&gt;Oops. I do not have any one of them.
&lt;br&gt;&lt;br&gt;Regards--
&lt;br&gt;Subrata
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Cheers,
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Michael
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Ideally what I'd be looking for is ssh access to said systems, so that
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; I can login and run the tests myself. &amp;nbsp;(If I need to do things such as
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; ask someone else to run them, then that slows my workflow down, and
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; also disinclines me from running too many tests, since I don't want to
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; be in the position of bothering people each time I have a new test.)
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Unfortunately, none of them can be accessed from outside IBM network
&lt;br&gt;&amp;gt; &amp;gt; without proper authentication, and off course without being a valid user
&lt;br&gt;&amp;gt; &amp;gt; of the system.
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; All of the tests I'm thinking of are the ones that would require at
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; most a few seconds of CPU time (no stress tests), and most would be
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; runnable under non-privileged accounts. &amp;nbsp;(For the rare occasions when
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; I wanted to run a test that required superuser privs, which I realize
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; I'm unlikely to get, then I wouldn't mind having to pester someone to
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; run the test for me, if there is anyone willing to oblige.)
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Can anyone help out?
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; I do not mind running tests on your behalf. Infact it will give me
&lt;br&gt;&amp;gt; &amp;gt; opportunity to access to more no. of tests buckets, which i can infact
&lt;br&gt;&amp;gt; &amp;gt; add to LTP later. So, whenever you have such tests to run, i will take
&lt;br&gt;&amp;gt; &amp;gt; time to do it for you.
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt; Regards--
&lt;br&gt;&amp;gt; &amp;gt; Subrata
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Cheers,
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt; Michael
&lt;br&gt;&amp;gt; &amp;gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; &amp;gt;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;/div&gt;&lt;br&gt;&lt;br&gt;-------------------------------------------------------------------------
&lt;br&gt;This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
&lt;br&gt;Build the coolest Linux based application