Merged,
Maxim.

On 01/12/17 02:41, Bill Fischofer wrote:
> For this series:
> 
> Reviewed-and-tested-by: Bill Fischofer <bill.fischo...@linaro.org>
> 
> On Wed, Jan 11, 2017 at 1:50 AM, Yi He <yi...@linaro.org> wrote:
>> For ordered queue, a thread consumes events (dequeue) and
>> acquires its unique sequential context in two steps, non
>> atomic and preemptable.
>>
>> This leads to potential ordered context inversion in case
>> the thread consumes prior events acquired subsequent context,
>> while the thread consumes subsequent events but acquired
>> prior context.
>>
>> This patch insert the ordered context acquisition into
>> event dequeue operation to make these two steps atomic.
>>
>> Signed-off-by: Yi He <yi...@linaro.org>
>> ---
>>  platform/linux-generic/include/odp_schedule_if.h | 3 +++
>>  platform/linux-generic/odp_queue.c               | 3 +++
>>  platform/linux-generic/odp_schedule.c            | 7 ++++++-
>>  platform/linux-generic/odp_schedule_sp.c         | 7 ++++++-
>>  4 files changed, 18 insertions(+), 2 deletions(-)
>>
>> diff --git a/platform/linux-generic/include/odp_schedule_if.h 
>> b/platform/linux-generic/include/odp_schedule_if.h
>> index 6c2b050..c0aee42 100644
>> --- a/platform/linux-generic/include/odp_schedule_if.h
>> +++ b/platform/linux-generic/include/odp_schedule_if.h
>> @@ -12,6 +12,7 @@ extern "C" {
>>  #endif
>>
>>  #include <odp/api/queue.h>
>> +#include <odp_queue_internal.h>
>>  #include <odp/api/schedule.h>
>>
>>  typedef void (*schedule_pktio_start_fn_t)(int pktio_index, int num_in_queue,
>> @@ -33,6 +34,7 @@ typedef int (*schedule_term_local_fn_t)(void);
>>  typedef void (*schedule_order_lock_fn_t)(void);
>>  typedef void (*schedule_order_unlock_fn_t)(void);
>>  typedef unsigned (*schedule_max_ordered_locks_fn_t)(void);
>> +typedef void (*schedule_save_context_fn_t)(queue_entry_t *queue);
>>
>>  typedef struct schedule_fn_t {
>>         schedule_pktio_start_fn_t   pktio_start;
>> @@ -50,6 +52,7 @@ typedef struct schedule_fn_t {
>>         schedule_order_lock_fn_t    order_lock;
>>         schedule_order_unlock_fn_t  order_unlock;
>>         schedule_max_ordered_locks_fn_t max_ordered_locks;
>> +       schedule_save_context_fn_t  save_context;
>>  } schedule_fn_t;
>>
>>  /* Interface towards the scheduler */
>> diff --git a/platform/linux-generic/odp_queue.c 
>> b/platform/linux-generic/odp_queue.c
>> index d9cb9f3..3b6a68b 100644
>> --- a/platform/linux-generic/odp_queue.c
>> +++ b/platform/linux-generic/odp_queue.c
>> @@ -568,6 +568,9 @@ static inline int deq_multi(queue_entry_t *queue, 
>> odp_buffer_hdr_t *buf_hdr[],
>>         if (hdr == NULL)
>>                 queue->s.tail = NULL;
>>
>> +       if (queue->s.type == ODP_QUEUE_TYPE_SCHED)
>> +               sched_fn->save_context(queue);
>> +
>>         UNLOCK(&queue->s.lock);
>>
>>         return i;
>> diff --git a/platform/linux-generic/odp_schedule.c 
>> b/platform/linux-generic/odp_schedule.c
>> index 645630a..264c58f 100644
>> --- a/platform/linux-generic/odp_schedule.c
>> +++ b/platform/linux-generic/odp_schedule.c
>> @@ -1205,6 +1205,10 @@ static int schedule_num_grps(void)
>>         return NUM_SCHED_GRPS;
>>  }
>>
>> +static void schedule_save_context(queue_entry_t *queue ODP_UNUSED)
>> +{
>> +}
>> +
>>  /* Fill in scheduler interface */
>>  const schedule_fn_t schedule_default_fn = {
>>         .pktio_start = schedule_pktio_start,
>> @@ -1221,7 +1225,8 @@ const schedule_fn_t schedule_default_fn = {
>>         .term_local  = schedule_term_local,
>>         .order_lock = order_lock,
>>         .order_unlock = order_unlock,
>> -       .max_ordered_locks = schedule_max_ordered_locks
>> +       .max_ordered_locks = schedule_max_ordered_locks,
>> +       .save_context = schedule_save_context
>>  };
>>
>>  /* Fill in scheduler API calls */
>> diff --git a/platform/linux-generic/odp_schedule_sp.c 
>> b/platform/linux-generic/odp_schedule_sp.c
>> index 5150d28..1406312 100644
>> --- a/platform/linux-generic/odp_schedule_sp.c
>> +++ b/platform/linux-generic/odp_schedule_sp.c
>> @@ -803,6 +803,10 @@ static void order_unlock(void)
>>  {
>>  }
>>
>> +static void save_context(queue_entry_t *queue ODP_UNUSED)
>> +{
>> +}
>> +
>>  /* Fill in scheduler interface */
>>  const schedule_fn_t schedule_sp_fn = {
>>         .pktio_start   = pktio_start,
>> @@ -819,7 +823,8 @@ const schedule_fn_t schedule_sp_fn = {
>>         .term_local    = term_local,
>>         .order_lock =    order_lock,
>>         .order_unlock =  order_unlock,
>> -       .max_ordered_locks = max_ordered_locks
>> +       .max_ordered_locks = max_ordered_locks,
>> +       .save_context  = save_context
>>  };
>>
>>  /* Fill in scheduler API calls */
>> --
>> 2.7.4
>>

Reply via email to