Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 9 Mar 2009 13:55:49 -0700
From:      Justin Teller <justin.teller@gmail.com>
To:        "freebsd-current@freebsd.org" <freebsd-current@freebsd.org>
Subject:   Re: Using PTHREAD_PRIO_INHERIT causes panic in kern_umtx.c
Message-ID:  <c47019cc0903091355q2273d1fft715cd47cedab1d3d@mail.gmail.com>
In-Reply-To: <3561C827-66BD-4B3F-A3D4-97C4C06884B4@gmail.com>
References:  <3561C827-66BD-4B3F-A3D4-97C4C06884B4@gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Mar 9, 2009 at 12:02 PM, Justin Teller <justin.teller@gmail.com>wrote:

> When I compile and run the attached program, it panics my system, (FreeBSD
> CURRENT as of 2-20-09) with the following message:
>
> panic: Assertion pi != NULL failed at /usr/src/sys/kern/kern_umtx: 1464
>
> With the backtrace being:
> Tracing pid 1079 tid 100045 td 0xffffff00037c8000
> kdb_enter() at kdb_enter+0x40
> panic() at panic+0x1ec
> umtx_pi_adjust() at umtx_pi_adjust+0xfc8
> umtx_pi_adjust() at umtx_pi_adjust+0x19bd
> _umtx_unlock() at _umtx_unlock+0x2c41
> _umtx_op() at _umtx_op+0x22
> syscall() at syscall+0x1f4
> Xfast_syscall() at Xfast_syscall+0xaa
> --- syscall (454, FreeBSD ELF64, _umtx_op), rip = 0x4056ac, rsp =
> 0x7fffffbfef38, rbp = 0x80060b150 ---
>
> This problem only shows up when I use PTHREAD_PRIO_INHERIT -- if I change
> the line for pthread_mutexattr_setprotocol to PTHREAD_PRIO_NONE, then it
> works fine.  I've been trying to trace thru the code to figure out where
> uq_pi_blocked should be setup, but I'm not too familiar with the code so I
> haven't found where the problem originates.  How can I get
> PTHREAD_PRIO_INHERIT to work?  And even if the change is in user-space, it
> probably shouldn't be this easy to panic the kernel :-)
>
> -Justin
>
>
> PS I'm reasonably certain that the most recent checkins (between now and
> Feb 20th) wouldn't fix this, but if I'm wrong, just let me know!
>
>
>
>
It looks like the list stripped out the .cpp file ... here it is below.  To
compile, run c++ -lthr mutex_prio_example.cpp -o mutex_prio_example

mutex_prio_example:

#include <stdio.h>
#include <pthread.h>

#define NRUNS   1000000
#define NCONSUMERS   4

volatile int g_num_items;
pthread_mutex_t g_mutex;


void* producer_proc ( void* ) {
    for ( int i = 0; i < NRUNS * NCONSUMERS; ++i ) {
        pthread_mutex_lock( &g_mutex );
        ++g_num_items;
        pthread_mutex_unlock( &g_mutex );
    }
    return NULL;
}

void* consumer_proc ( void* ) {
    for ( int i = 0; i < NRUNS; ++i ) {
        pthread_mutex_lock( &g_mutex );
        --g_num_items;
        pthread_mutex_unlock( &g_mutex );
    }
    return NULL;
}

int main() {
    g_num_items = 0;

    pthread_mutexattr_t mattr;
    pthread_mutexattr_init( &mattr );
    pthread_mutexattr_setprotocol( &mattr, PTHREAD_PRIO_INHERIT );
    pthread_mutex_init( &g_mutex, &mattr );
    pthread_mutexattr_destroy( &mattr );

    const int num_workers = NCONSUMERS;
    pthread_t threads[num_workers];
    for ( int i = 0; i < num_workers; ++i )
        pthread_create( threads + i, NULL, consumer_proc, NULL);
    producer_proc(NULL);
    for ( int i = 0; i < num_workers; ++i )
        pthread_join( threads[i], NULL );

    printf("done\n");
    return 0;
}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?c47019cc0903091355q2273d1fft715cd47cedab1d3d>