[Beignet] [PATCH V1 1/2] fix event related bugs.

Zhigang Gong zhigang.gong at linux.intel.com
Wed May 21 23:20:36 PDT 2014


Right, I just pushed the two patches to the master branch. And merge the second to opencl-1.2 branch.

On Wed, May 21, 2014 at 02:27:31AM +0000, Luo, Xionghu wrote:
> This patch set is for master branch ported from opencl-1.2 branch.
> 
> Confirmed with Zhigang, common code should be committed to the master branch first. Will follow the rule in later development.
> 
> 
> Luo Xionghu
> Best Regards
> 
> 
> -----Original Message-----
> From: Yang, Rong R 
> Sent: Monday, May 19, 2014 3:49 PM
> To: Luo, Xionghu; beignet at lists.freedesktop.org
> Cc: Luo, Xionghu
> Subject: RE: [Beignet] [PATCH V1 1/2] fix event related bugs.
> 
> From 1.2 branch? This patch Look good to me.
> 
> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of xionghu.luo at intel.com
> Sent: Monday, May 12, 2014 12:56 PM
> To: beignet at lists.freedesktop.org
> Cc: Luo, Xionghu
> Subject: [Beignet] [PATCH V1 1/2] fix event related bugs.
> 
> From: Luo <xionghu.luo at intel.com>
> 
> 1. remove repeated user events in list.
> 2. missed braces in loops.
> 3. fix barrier event reference not incresed.
> ---
>  src/cl_alloc.c |   1 +
>  src/cl_event.c | 111 ++++++++++++++++++++++++++++++++++++---------------------
>  src/cl_event.h |   4 +++
>  3 files changed, 75 insertions(+), 41 deletions(-)
> 
> diff --git a/src/cl_alloc.c b/src/cl_alloc.c index 20d5578..93d2e6a 100644
> --- a/src/cl_alloc.c
> +++ b/src/cl_alloc.c
> @@ -71,6 +71,7 @@ cl_free(void *ptr)
>      return;
>    atomic_dec(&cl_alloc_n);
>    free(ptr);
> +  ptr = NULL;
>  }
>  
>  LOCAL size_t
> diff --git a/src/cl_event.c b/src/cl_event.c index 727ee1f..101e735 100644
> --- a/src/cl_event.c
> +++ b/src/cl_event.c
> @@ -231,6 +231,9 @@ cl_int cl_event_wait_events(cl_uint num_events_in_wait_list, const cl_event *eve
>    }
>  
>    if(queue && queue->barrier_index > 0) {
> +    for(j=0; j<queue->wait_events_num; j++){
> +      cl_event_add_ref(queue->wait_events[j]);  //add defer enqueue's 
> + wait event reference  }
>      return CL_ENQUEUE_EXECUTE_DEFER;
>    }
>  
> @@ -258,9 +261,10 @@ void cl_event_new_enqueue_callback(cl_event event,
>    user_event *user_events, *u_ev;
>    cl_command_queue queue = event->queue;
>    cl_int i;
> +  cl_int err = CL_SUCCESS;
>    GET_QUEUE_THREAD_GPGPU(data->queue);
>  
> -  /* Allocate and inialize the structure itself */
> +  /* Allocate and initialize the structure itself */
>    TRY_ALLOC_NO_ERR (cb, CALLOC(enqueue_callback));
>    cb->num_events = num_events_in_wait_list;
>    TRY_ALLOC_NO_ERR (cb->wait_list, CALLOC_ARRAY(cl_event, num_events_in_wait_list)); @@ -276,22 +280,20 @@ void cl_event_new_enqueue_callback(cl_event event,
>        node = queue->wait_events[i]->waits_head;
>        if(node == NULL)
>          queue->wait_events[i]->waits_head = cb;
> -      else
> +      else{
>          while((node != cb) && node->next)
>            node = node->next;
>          if(node == cb)   //wait on dup user event
>            continue;
>          node->next = cb;
> +      }
>  
>        /* Insert the user event to enqueue_callback's wait_user_events */
> -      TRY_ALLOC_NO_ERR (u_ev, CALLOC(user_event));
> -      u_ev->event = queue->wait_events[i];
> -      u_ev->next = cb->wait_user_events;
> -      cb->wait_user_events = u_ev;
> +      TRY(cl_event_insert_user_event, &cb->wait_user_events,
> + queue->wait_events[i]);
>      }
>    }
>  
> -  /* Find out all user events that events in event_wait_list wait */
> +  /* Find out all user events that in event_wait_list wait */
>    for(i=0; i<num_events_in_wait_list; i++) {
>      if(event_wait_list[i]->status <= CL_COMPLETE)
>        continue;
> @@ -309,31 +311,29 @@ void cl_event_new_enqueue_callback(cl_event event,
>          node->next = cb;
>        }
>        /* Insert the user event to enqueue_callback's wait_user_events */
> -      TRY_ALLOC_NO_ERR (u_ev, CALLOC(user_event));
> -      u_ev->event = event_wait_list[i];
> -      u_ev->next = cb->wait_user_events;
> -      cb->wait_user_events = u_ev;
> +      TRY(cl_event_insert_user_event, &cb->wait_user_events, 
> + event_wait_list[i]);
>        cl_command_queue_insert_event(event->queue, event_wait_list[i]);
>      } else if(event_wait_list[i]->enqueue_cb != NULL) {
>        user_events = event_wait_list[i]->enqueue_cb->wait_user_events;
>        while(user_events != NULL) {
>          /* Insert the enqueue_callback to user event's  waits_tail */
>          node = user_events->event->waits_head;
> -        while((node != cb) && node->next)
> -          node = node->next;
> -        if(node == cb) {  //wait on dup user event
> -          user_events = user_events->next;
> -          continue;
> +        if(node == NULL)
> +          event_wait_list[i]->waits_head = cb;
> +        else{
> +          while((node != cb) && node->next)
> +            node = node->next;
> +          if(node == cb) {  //wait on dup user event
> +            user_events = user_events->next;
> +            continue;
> +          }
> +          node->next = cb;
>          }
> -        node->next = cb;
>  
>          /* Insert the user event to enqueue_callback's wait_user_events */
> -        TRY_ALLOC_NO_ERR (u_ev, CALLOC(user_event));
> -        u_ev->event = user_events->event;
> -        u_ev->next = cb->wait_user_events;
> -        cb->wait_user_events = u_ev;
> +        TRY(cl_event_insert_user_event, &cb->wait_user_events, user_events->event);
> +        cl_command_queue_insert_event(event->queue,
> + user_events->event);
>          user_events = user_events->next;
> -        cl_command_queue_insert_event(event->queue, event_wait_list[i]);
>        }
>      }
>    }
> @@ -363,7 +363,6 @@ error:
>  void cl_event_set_status(cl_event event, cl_int status)  {
>    user_callback *user_cb;
> -  user_event    *u_ev, *u_ev_next;
>    cl_int ret, i;
>    cl_event evt;
>  
> @@ -419,23 +418,8 @@ void cl_event_set_status(cl_event event, cl_int status)
>    /* Check all defer enqueue */
>    enqueue_callback *cb, *enqueue_cb = event->waits_head;
>    while(enqueue_cb) {
> -    /* Remove this user event in enqueue_cb */
> -    while(enqueue_cb->wait_user_events &&
> -          enqueue_cb->wait_user_events->event == event) {
> -      u_ev = enqueue_cb->wait_user_events;
> -      enqueue_cb->wait_user_events = enqueue_cb->wait_user_events->next;
> -      cl_free(u_ev);
> -    }
> -
> -    u_ev = enqueue_cb->wait_user_events;
> -    while(u_ev) {
> -      u_ev_next = u_ev->next;
> -      if(u_ev_next && u_ev_next->event == event) {
> -        u_ev->next = u_ev_next->next;
> -        cl_free(u_ev_next);
> -      } else
> -        u_ev->next = u_ev_next;
> -    }
> +    /* Remove this user event in enqueue_cb, update the header if needed. */
> +    cl_event_remove_user_event(&enqueue_cb->wait_user_events, event);
>  
>      /* Still wait on other user events */
>      if(enqueue_cb->wait_user_events != NULL) { @@ -448,7 +432,7 @@ void cl_event_set_status(cl_event event, cl_int status)
>  
>      /* All user events complete, now wait enqueue events */
>      ret = cl_event_wait_events(enqueue_cb->num_events, enqueue_cb->wait_list,
> -                               enqueue_cb->event->queue);
> +        enqueue_cb->event->queue);
>      ret = ret;
>      assert(ret != CL_ENQUEUE_EXECUTE_DEFER);
>  
> @@ -524,3 +508,48 @@ cl_int cl_event_get_timestamp(cl_event event, cl_profiling_info param_name)
>    }
>    return CL_INVALID_VALUE;
>  }
> +
> +cl_int cl_event_insert_user_event(user_event** p_u_ev, cl_event event) 
> +{
> +  user_event * u_iter = *p_u_ev;
> +  user_event * u_ev;
> +
> +  while(u_iter)
> +  {
> +    if(u_iter->event == event)
> +      return CL_SUCCESS;
> +    u_iter = u_iter->next;
> +  }
> +
> +  TRY_ALLOC_NO_ERR (u_ev, CALLOC(user_event));  u_ev->event = event; 
> + u_ev->next = *p_u_ev;  *p_u_ev = u_ev;
> +
> +
> +  return CL_SUCCESS;
> +error:
> +  return CL_FALSE;
> +}
> +
> +cl_int cl_event_remove_user_event(user_event** p_u_ev, cl_event event) 
> +{
> +  user_event * u_iter = *p_u_ev;
> +  user_event * u_prev = *p_u_ev;
> +
> +  while(u_iter){
> +    if(u_iter->event == event ){
> +      if(u_iter == *p_u_ev){
> +        *p_u_ev = u_iter->next;
> +      }else{
> +        u_prev->next = u_iter->next;
> +      }
> +      cl_free(u_iter);
> +      break;
> +    }
> +    u_prev = u_iter;
> +    u_iter = u_iter->next;
> +  }
> +
> +  return CL_SUCCESS;
> +}
> diff --git a/src/cl_event.h b/src/cl_event.h index 3c61110..d864770 100644
> --- a/src/cl_event.h
> +++ b/src/cl_event.h
> @@ -93,5 +93,9 @@ void cl_event_update_status(cl_event);  cl_int cl_event_marker(cl_command_queue, cl_event*);
>  /* Do the event profiling */
>  cl_int cl_event_get_timestamp(cl_event event, cl_profiling_info param_name);
> +/*insert the user event*/
> +cl_int cl_event_insert_user_event(user_event** p_u_ev, cl_event event); 
> +/*remove the user event*/ cl_int
> +cl_event_remove_user_event(user_event** p_u_ev, cl_event event);
>  #endif /* __CL_EVENT_H__ */
>  
> --
> 1.8.1.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list