Skip to content
  • Roland Dreier's avatar
    aio: wake all waiters when destroying ctx · e91f90bb
    Roland Dreier authored
    
    
    The test program below will hang because io_getevents() uses
    add_wait_queue_exclusive(), which means the wake_up() in io_destroy() only
    wakes up one of the threads.  Fix this by using wake_up_all() in the aio
    code paths where we want to make sure no one gets stuck.
    
    	// t.c -- compile with gcc -lpthread -laio t.c
    
    	#include <libaio.h>
    	#include <pthread.h>
    	#include <stdio.h>
    	#include <unistd.h>
    
    	static const int nthr = 2;
    
    	void *getev(void *ctx)
    	{
    		struct io_event ev;
    		io_getevents(ctx, 1, 1, &ev, NULL);
    		printf("io_getevents returned\n");
    		return NULL;
    	}
    
    	int main(int argc, char *argv[])
    	{
    		io_context_t ctx = 0;
    		pthread_t thread[nthr];
    		int i;
    
    		io_setup(1024, &ctx);
    
    		for (i = 0; i < nthr; ++i)
    			pthread_create(&thread[i], NULL, getev, ctx);
    
    		sleep(1);
    
    		io_destroy(ctx);
    
    		for (i = 0; i < nthr; ++i)
    			pthread_join(thread[i], NULL);
    
    		return 0;
    	}
    
    Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
    Reviewed-by: default avatarJeff Moyer <jmoyer@redhat.com>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e91f90bb