From owner-freebsd-hackers@FreeBSD.ORG Tue Jan 25 21:08:39 2005 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E6F0816A4CE for ; Tue, 25 Jan 2005 21:08:38 +0000 (GMT) Received: from panther.cs.ucla.edu (Panther.CS.UCLA.EDU [131.179.128.25]) by mx1.FreeBSD.org (Postfix) with ESMTP id AF56843D1D for ; Tue, 25 Jan 2005 21:08:38 +0000 (GMT) (envelope-from yanyu@CS.UCLA.EDU) Received: from localhost (yanyu@localhost)j0PL8a219469; Tue, 25 Jan 2005 13:08:36 -0800 (PST) Date: Tue, 25 Jan 2005 13:08:36 -0800 (PST) From: Yan Yu To: Jose Hidalgo Herrera In-Reply-To: <1106686056.4973.6.camel@jose.hostarica.net> Message-ID: References: <1106686056.4973.6.camel@jose.hostarica.net> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Mailman-Approved-At: Wed, 26 Jan 2005 13:31:17 +0000 cc: freebsd-hackers@freebsd.org Subject: Re: seg fault on kse_release () (fwd) X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Jan 2005 21:08:39 -0000 Hi, THanks a lot for the reply! in the call to pthread_create(), i cast _t_ to a void pointer, since that is pthread_create() function prototype asks for.. then in line > printf("\n%d: Hello World!\n", threadid); I use it as (cast it to) a _int_.. or i missed something here, is there a reason that i canot do this? I just tried what you suggested, > rc = pthread_create(&threads[t], NULL, PrintHello, (void *) & t); and change _printf_ line to > printf("\n%d: Hello World!\n", * (int *)threadid); I got the same SEG fault error. Thanks for any pointers! yan > The line causing the SEGFAULT is > rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); > > Why?, because t is declared as: > int t; > then you say: > args for start_routine in pthread_create are located in the address: t > This will be what you want: > rc = pthread_create(&threads[t], NULL, PrintHello, (void *) & t); > > You also have an error in this line: > > printf("\n%d: Hello World!\n", threadid); > > Since threadid is not an int, its a pointer > > On Tue, 2005-01-25 at 10:31 -0800, Yan Yu wrote: > > Hi, thanks a LOT for looking into this. > > yes, that is exactly my output before the SEG fault happens (btw, i add > > "if (p)" before > > "p[id]++ ", the prob remains.. > > what confuses me is that, if the system is out of memory, then i should > > see the error returned from pthread_create() or calloc(), but not SEG > > fault, or i must have missed something? > > > > Thanks, > > yan > > > > > > On Tue, 25 Jan 2005, Jose Hidalgo Herrera wrote: > > > > > I ran it into: > > > 4.11-STABLE FreeBSD Wed Jan 19 15:23:33 CST 2005 > > > What you find in > > > http://www1.cr.freebsd.org/~jose/stress.tgz > > > is the output of: > > > ktrace ./a.out > stress.txt > > > > > > > > > On Mon, 2005-01-24 at 14:27 -0800, Yan Yu wrote: > > > > Hi, all, I have a newbie Q: > > > > I am trying to use creating large number of threads and allocting > > > > memory to stress the system. > > > > My user program causes SEG fault in the kernel code, kse_release () in > > > > kern_kse.c. > > > > (it SEG fault before the system can be stressed;( > > > > > > > > the stack when the SEG fault happens are: > > > > #0 0x08064e54 in kse_release () > > > > #1 0x080531c4 in kse_sched_single () > > > > #2 0x00000000 in ?? () > > > > > > > > My simple program is: > > > > I have a simple function to create threads: > > > > > > > > #define NUM_THREADS 5000 > > > > #define THREADS_IN_ONE_PROCESS 5 > > > > #define BSIZE 500000 > > > > static int cc; > > > > > > > > void CreateThread(int n) > > > > { > > > > assert( n <= NUM_THREADS ); > > > > pthread_t threads[NUM_THREADS]; > > > > int rc, t; > > > > for(t=0;t < n;t++){ > > > > printf("#%d: Creating thread %d\n", cc, t); > > > > cc++; > > > > rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); > > > > if (rc){ > > > > printf("ERROR; return code from pthread_create() is %d\n", rc); > > > > } > > > > } > > > > > > > > unsigned long id; > > > > char * p = (char *) calloc(BSIZE, sizeof(char) ); > > > > if ( p == NULL ) > > > > { > > > > fprintf(stderr, "calloc error\n"); > > > > } > > > > while (1) > > > > { > > > > while (BSIZE <= (id = rand() / (RAND_MAX/BSIZE))); > > > > p[id] ++; > > > > } > > > > } > > > > > > > > void *PrintHello(void *threadid) > > > > { > > > > printf("\n%d: Hello World!\n", threadid); > > > > CreateThread(THREADS_IN_ONE_PROCESS); > > > > pthread_exit(NULL); > > > > } > > > > > > > > int main (int argc, char *argv[]) > > > > { > > > > CreateThread(THREADS_IN_ONE_PROCESS); > > > > } > > > > > > > > The SEG fault happens after creating nearly 5000 threads. > > > > and I use the default pthread.h coming w/ freeBSD 5.3 > > > > #define PTHREAD_KEYS_MAX 256 > > > > #define PTHREAD_STACK_MIN (1 << 22) > > > > #define PTHREAD_THREADS_MAX ULONG_MAX > > > > > > > > > > > > Any idea on what might happen? > > > > > > > > Many Thanks! > > > > yan > > > > _______________________________________________ > > > > freebsd-hackers@freebsd.org mailing list > > > > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers > > > > To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org" > > > >