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; [email protected] > 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:[email protected]] On Behalf Of > [email protected] > Sent: Monday, May 12, 2014 12:56 PM > To: [email protected] > Cc: Luo, Xionghu > Subject: [Beignet] [PATCH V1 1/2] fix event related bugs. > > From: Luo <[email protected]> > > 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 > [email protected] > http://lists.freedesktop.org/mailman/listinfo/beignet > _______________________________________________ > Beignet mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
