Re: seg fault on kse_release () (fwd)

From: Yan Yu (yanyu_at_CS.UCLA.EDU)
Date: 01/25/05

  • Next message: Yan Yu: "Re: seg fault on kse_release () (fwd)"
    Date: Tue, 25 Jan 2005 13:08:36 -0800 (PST)
    To: Jose Hidalgo Herrera <jose@hostarica.com>
    
    

    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"
    > > >
    >
    _______________________________________________
    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"


  • Next message: Yan Yu: "Re: seg fault on kse_release () (fwd)"

    Relevant Pages