seg fault on kse_release () (fwd)

Julian Elischer julian at elischer.org
Tue Jan 25 14:04:46 PST 2005



Jose Hidalgo Herrera wrote:

>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);
>

probably we shouldn't crash the system however.. (it is crashing right?
that wasn't so clear to me).

>
>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 at freebsd.org mailing list
>>>>http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
>>>>To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>>>>        
>>>>



More information about the freebsd-hackers mailing list