@ -3357,12 +3357,11 @@ static void *reinit_gpu(void *userdata)
struct cgpu_info * cgpu = ( struct cgpu_info * ) userdata ;
struct cgpu_info * cgpu = ( struct cgpu_info * ) userdata ;
int gpu = cgpu - > cpu_gpu ;
int gpu = cgpu - > cpu_gpu ;
struct thr_info * thr ;
struct thr_info * thr ;
char name [ 256 ] ;
int thr_id ;
int thr_id ;
_clState * clState ;
_clState * clState ;
/* Send threads message to stop */
gpus [ gpu ] . status = LIFE_DEAD ;
gpu_devices [ gpu ] = false ;
sleep ( 5 ) ;
for ( thr_id = 0 ; thr_id < gpu_threads ; thr_id + + ) {
for ( thr_id = 0 ; thr_id < gpu_threads ; thr_id + + ) {
if ( dev_from_id ( thr_id ) ! = gpu )
if ( dev_from_id ( thr_id ) ! = gpu )
@ -3371,32 +3370,44 @@ static void *reinit_gpu(void *userdata)
clState = clStates [ thr_id ] ;
clState = clStates [ thr_id ] ;
thr = & thr_info [ thr_id ] ;
thr = & thr_info [ thr_id ] ;
thr - > rolling = thr - > cgpu - > rolling = 0 ;
thr - > rolling = thr - > cgpu - > rolling = 0 ;
tq_freeze ( thr - > q ) ;
if ( ! pthread_cancel ( * thr - > pth ) ) {
if ( ! pthread_cancel ( * thr - > pth ) ) {
applog ( LOG_WARNING , " Thread still exists, killing it off " ) ;
pthread_join ( * thr - > pth , NULL ) ;
free ( thr - > q ) ;
free ( thr - > q ) ;
} else
}
applog ( LOG_WARNING , " Thread no longer exists " ) ;
thr - > q = tq_new ( ) ;
thr - > q = tq_new ( ) ;
if ( ! thr - > q )
if ( ! thr - > q )
quit ( 1 , " Failed to tq_new in reinit_gpu " ) ;
quit ( 1 , " Failed to tq_new in reinit_gpu " ) ;
applog ( LOG_WARNING , " Attempting to create new worker thread %d " , thr_id ) ;
/* Send it a command. If it responds we can restart */
applog ( LOG_WARNING , " Attempting to send GPU command " ) ;
clFlush ( clState - > commandQueue ) ;
free ( clState ) ;
applog ( LOG_WARNING , " Command successful, attempting to reinit device " ) ;
applog ( LOG_INFO , " Reinit GPU thread %d " , thr_id ) ;
clState = initCl ( gpu , name , sizeof ( name ) ) ;
if ( ! clState ) {
applog ( LOG_ERR , " Failed to reinit GPU thread %d " , thr_id ) ;
return NULL ;
}
applog ( LOG_INFO , " initCl() finished. Found %s " , name ) ;
if ( unlikely ( thr_info_create ( thr , NULL , gpuminer_thread , thr ) ) ) {
if ( unlikely ( thr_info_create ( thr , NULL , gpuminer_thread , thr ) ) ) {
applog ( LOG_ERR , " thread %d create failed " , thr_id ) ;
applog ( LOG_ERR , " thread %d create failed " , thr_id ) ;
return NULL ;
return NULL ;
}
}
/* Try to re-enable it */
gpu_devices [ gpu ] = true ;
if ( opt_debug )
if ( opt_debug )
applog ( LOG_DEBUG , " Pushing ping to thread %d " , thr_id ) ;
applog ( LOG_DEBUG , " Pushing ping to thread %d " , thr_id ) ;
tq_push ( thr - > q , & ping ) ;
tq_push ( thr - > q , & ping ) ;
applog ( LOG_WARNING , " Thread %d restarted successfully " , thr_id ) ;
applog ( LOG_WARNING , " Thread %d restarted " , thr_id ) ;
}
}
/* Try to re-enable it */
gpu_devices [ gpu ] = true ;
return NULL ;
return NULL ;
}
}
# endif
# endif