diff mbox

[API-NEXT,PATCHv9,12/13] api: schedule: add odp_schedule_order_lock/unlock

Message ID 1438948036-31868-13-git-send-email-bill.fischofer@linaro.org
State New
Headers show

Commit Message

Bill Fischofer Aug. 7, 2015, 11:47 a.m. UTC
Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org>
---
 include/odp/api/schedule.h | 81 ++++++++++++++++++++++++----------------------
 1 file changed, 42 insertions(+), 39 deletions(-)

Comments

Balasubramanian Manoharan Aug. 7, 2015, 6:13 p.m. UTC | #1
Hi,

Comments inline...

On 7 August 2015 at 17:17, Bill Fischofer <bill.fischofer@linaro.org> wrote:

> Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org>
> ---
>  include/odp/api/schedule.h | 81
> ++++++++++++++++++++++++----------------------
>  1 file changed, 42 insertions(+), 39 deletions(-)
>
> diff --git a/include/odp/api/schedule.h b/include/odp/api/schedule.h
> index 61d3b16..f715144 100644
> --- a/include/odp/api/schedule.h
> +++ b/include/odp/api/schedule.h
> @@ -174,6 +174,41 @@ void odp_schedule_release_atomic(void);
>  int odp_schedule_release_ordered(odp_event_t ev);
>
>  /**
> + * Ordered event lock
> + *
> + * Provide reusable in-order serialization for scheduled ordered events.
> Upon
> + * return the caller is in order with respect to other events originating
> from
> + * the current ordered context and will retain order until a subsequent
> + * odp_schedule_order_unlock() call is made, or until order is resolved
> for
> + * the event via a call to odp_queue_enq() or
> odp_schedule_release_ordered().
>

[Bala]  The idea of this API is to be able to provide for a small amount of
atomic critical section within a fat ordered flow.
I believe we can add the description in the note that this lock/unlock API
is provided to avoid the *scheduler overhead* if the application wants
provide in-order serial access to a small critical section within an
ordered flow.

Regards,
Bala

+ * If the caller holds multiple events, e.g., as received from
> + * odp_schedule_multi(), then the list of events may only be locked in
> their
> + * received order to avoid deadlock.  That is, if the caller received
> events
> + * 1, 2, and 3 from odp_schedule_multi(), it is an error to attempt to
> lock
> + * event 2 before locking and unlocking event 1 or otherwise resolving
> event
> + * 1's order.
> + *
> + * @param ev   The event whose order is to be locked. This event MUST have
> + *             originated from an ordered queue.
> + */
> +void odp_schedule_order_lock(odp_event_t ev);
> +
> +/**
> + * Ordered event unlock
> + *
> + * Release an ordered lock previously acquired by
> odp_schedule_order_lock().
> + * It is an error to attempt to release a lock that had not been
> previously
> + * acquired for the specified event.  Following this call, the thread will
> + * exit the critical section protected by the ordered lock and will resume
> + * parallel execution until the next call to odp_schedule_order_lock() for
> + * that event, or until the event's order is resolved by a call to
> + * odp_queue_enq() or odp_schedule_release_ordered().
> + *
> + * @param ev    The event whose order is to be unlocked.
> + */
> +void odp_schedule_order_unlock(odp_event_t ev);
> +
> +/**
>   * Copy order from one event to another
>   *
>   * This call copies the order associated with an event originating from an
> @@ -181,14 +216,19 @@ int odp_schedule_release_ordered(odp_event_t ev);
>   * associated ordering at input to the call. If the target is ordered, the
>   * prior ordering must first be released by an
> odp_schedule_release_ordered()
>   * call. Successfuly copying an order implicitly sets the order sustain
> - * attribute for the src_event as if odp_schedule_order_sustain() were
> called
> - * for it.
> + * attribute for the src_event as if odp_schedule_order_sustain_set() were
> + * called for it.
>   *
>   * @param src_event Event whose ordering is to be copied
>   * @param dst_event Event to receive the same ordering as src_event.
>   *
>   * @retval 0  Success
>   * @retval <0 Failure.  Order not copied.
> + *
> + * @note If multiple events share the same order as a result of
> + * odp_schedule_order_copy(), only one of them should attempt to lock the
> + * order via calls to odp_schedule_order_lock(). Results are undefined if
> this
> + * restriction is not observed.
>   */
>  int odp_schedule_order_copy(odp_event_t src_event, odp_event_t dst_event);
>
> @@ -336,43 +376,6 @@ int odp_schedule_group_leave(odp_schedule_group_t
> group,
>  int odp_schedule_group_count(odp_schedule_group_t group);
>
>  /**
> - * Initialize ordered context lock
> - *
> - * Initialize an ordered queue context lock. The lock can be associated
> only
> - * with ordered queues and used only within an ordered synchronization
> context.
> - *
> - * @param queue   Ordered queue
> - * @param lock    Ordered context lock
> - *
> - * @retval 0 on success
> - * @retval <0 on failure
> - */
> -int odp_schedule_olock_init(odp_queue_t queue, odp_schedule_olock_t
> *lock);
> -
> -/**
> - * Acquire ordered context lock
> - *
> - * This call is valid only when holding an ordered synchronization
> context. The
> - * lock is used to protect a critical section that is executed within an
> - * ordered context. Threads enter the critical section in the order
> determined
> - * by the context (source queue). Lock ordering is automatically skipped
> for
> - * threads that release the context instead of calling the lock.
> - *
> - * @param lock    Ordered context lock
> - */
> -void odp_schedule_olock_lock(odp_schedule_olock_t *lock);
> -
> -/**
> - * Release ordered context lock
> - *
> - * This call is valid only when holding an ordered synchronization
> context.
> - * Release a previously locked ordered context lock.
> - *
> - * @param lock    Ordered context lock
> - */
> -void odp_schedule_olock_unlock(odp_schedule_olock_t *lock);
> -
> -/**
>   * @}
>   */
>
> --
> 2.1.4
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
>
Bill Fischofer Aug. 7, 2015, 6:45 p.m. UTC | #2
Yes, that was what I hadn't fully appreciated with the previous proposed
odp_schedule_order_sync() API.  I believe these two APIs reflect the
semantics you describe.  We can add additional color to the doxygen.  What
we really need is a section of the user describe that relates all of this
and how these APIs are intended to be used.  That's next up on the "to do"
list.  :)

On Fri, Aug 7, 2015 at 1:13 PM, Bala Manoharan <bala.manoharan@linaro.org>
wrote:

> Hi,
>
> Comments inline...
>
> On 7 August 2015 at 17:17, Bill Fischofer <bill.fischofer@linaro.org>
> wrote:
>
>> Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org>
>> ---
>>  include/odp/api/schedule.h | 81
>> ++++++++++++++++++++++++----------------------
>>  1 file changed, 42 insertions(+), 39 deletions(-)
>>
>> diff --git a/include/odp/api/schedule.h b/include/odp/api/schedule.h
>> index 61d3b16..f715144 100644
>> --- a/include/odp/api/schedule.h
>> +++ b/include/odp/api/schedule.h
>> @@ -174,6 +174,41 @@ void odp_schedule_release_atomic(void);
>>  int odp_schedule_release_ordered(odp_event_t ev);
>>
>>  /**
>> + * Ordered event lock
>> + *
>> + * Provide reusable in-order serialization for scheduled ordered events.
>> Upon
>> + * return the caller is in order with respect to other events
>> originating from
>> + * the current ordered context and will retain order until a subsequent
>> + * odp_schedule_order_unlock() call is made, or until order is resolved
>> for
>> + * the event via a call to odp_queue_enq() or
>> odp_schedule_release_ordered().
>>
>
> [Bala]  The idea of this API is to be able to provide for a small amount
> of atomic critical section within a fat ordered flow.
> I believe we can add the description in the note that this lock/unlock API
> is provided to avoid the *scheduler overhead* if the application wants
> provide in-order serial access to a small critical section within an
> ordered flow.
>
> Regards,
> Bala
>
> + * If the caller holds multiple events, e.g., as received from
>> + * odp_schedule_multi(), then the list of events may only be locked in
>> their
>> + * received order to avoid deadlock.  That is, if the caller received
>> events
>> + * 1, 2, and 3 from odp_schedule_multi(), it is an error to attempt to
>> lock
>> + * event 2 before locking and unlocking event 1 or otherwise resolving
>> event
>> + * 1's order.
>> + *
>> + * @param ev   The event whose order is to be locked. This event MUST
>> have
>> + *             originated from an ordered queue.
>> + */
>> +void odp_schedule_order_lock(odp_event_t ev);
>> +
>> +/**
>> + * Ordered event unlock
>> + *
>> + * Release an ordered lock previously acquired by
>> odp_schedule_order_lock().
>> + * It is an error to attempt to release a lock that had not been
>> previously
>> + * acquired for the specified event.  Following this call, the thread
>> will
>> + * exit the critical section protected by the ordered lock and will
>> resume
>> + * parallel execution until the next call to odp_schedule_order_lock()
>> for
>> + * that event, or until the event's order is resolved by a call to
>> + * odp_queue_enq() or odp_schedule_release_ordered().
>> + *
>> + * @param ev    The event whose order is to be unlocked.
>> + */
>> +void odp_schedule_order_unlock(odp_event_t ev);
>> +
>> +/**
>>   * Copy order from one event to another
>>   *
>>   * This call copies the order associated with an event originating from
>> an
>> @@ -181,14 +216,19 @@ int odp_schedule_release_ordered(odp_event_t ev);
>>   * associated ordering at input to the call. If the target is ordered,
>> the
>>   * prior ordering must first be released by an
>> odp_schedule_release_ordered()
>>   * call. Successfuly copying an order implicitly sets the order sustain
>> - * attribute for the src_event as if odp_schedule_order_sustain() were
>> called
>> - * for it.
>> + * attribute for the src_event as if odp_schedule_order_sustain_set()
>> were
>> + * called for it.
>>   *
>>   * @param src_event Event whose ordering is to be copied
>>   * @param dst_event Event to receive the same ordering as src_event.
>>   *
>>   * @retval 0  Success
>>   * @retval <0 Failure.  Order not copied.
>> + *
>> + * @note If multiple events share the same order as a result of
>> + * odp_schedule_order_copy(), only one of them should attempt to lock the
>> + * order via calls to odp_schedule_order_lock(). Results are undefined
>> if this
>> + * restriction is not observed.
>>   */
>>  int odp_schedule_order_copy(odp_event_t src_event, odp_event_t
>> dst_event);
>>
>> @@ -336,43 +376,6 @@ int odp_schedule_group_leave(odp_schedule_group_t
>> group,
>>  int odp_schedule_group_count(odp_schedule_group_t group);
>>
>>  /**
>> - * Initialize ordered context lock
>> - *
>> - * Initialize an ordered queue context lock. The lock can be associated
>> only
>> - * with ordered queues and used only within an ordered synchronization
>> context.
>> - *
>> - * @param queue   Ordered queue
>> - * @param lock    Ordered context lock
>> - *
>> - * @retval 0 on success
>> - * @retval <0 on failure
>> - */
>> -int odp_schedule_olock_init(odp_queue_t queue, odp_schedule_olock_t
>> *lock);
>> -
>> -/**
>> - * Acquire ordered context lock
>> - *
>> - * This call is valid only when holding an ordered synchronization
>> context. The
>> - * lock is used to protect a critical section that is executed within an
>> - * ordered context. Threads enter the critical section in the order
>> determined
>> - * by the context (source queue). Lock ordering is automatically skipped
>> for
>> - * threads that release the context instead of calling the lock.
>> - *
>> - * @param lock    Ordered context lock
>> - */
>> -void odp_schedule_olock_lock(odp_schedule_olock_t *lock);
>> -
>> -/**
>> - * Release ordered context lock
>> - *
>> - * This call is valid only when holding an ordered synchronization
>> context.
>> - * Release a previously locked ordered context lock.
>> - *
>> - * @param lock    Ordered context lock
>> - */
>> -void odp_schedule_olock_unlock(odp_schedule_olock_t *lock);
>> -
>> -/**
>>   * @}
>>   */
>>
>> --
>> 2.1.4
>>
>> _______________________________________________
>> lng-odp mailing list
>> lng-odp@lists.linaro.org
>> https://lists.linaro.org/mailman/listinfo/lng-odp
>>
>
>
diff mbox

Patch

diff --git a/include/odp/api/schedule.h b/include/odp/api/schedule.h
index 61d3b16..f715144 100644
--- a/include/odp/api/schedule.h
+++ b/include/odp/api/schedule.h
@@ -174,6 +174,41 @@  void odp_schedule_release_atomic(void);
 int odp_schedule_release_ordered(odp_event_t ev);
 
 /**
+ * Ordered event lock
+ *
+ * Provide reusable in-order serialization for scheduled ordered events. Upon
+ * return the caller is in order with respect to other events originating from
+ * the current ordered context and will retain order until a subsequent
+ * odp_schedule_order_unlock() call is made, or until order is resolved for
+ * the event via a call to odp_queue_enq() or odp_schedule_release_ordered().
+ * If the caller holds multiple events, e.g., as received from
+ * odp_schedule_multi(), then the list of events may only be locked in their
+ * received order to avoid deadlock.  That is, if the caller received events
+ * 1, 2, and 3 from odp_schedule_multi(), it is an error to attempt to lock
+ * event 2 before locking and unlocking event 1 or otherwise resolving event
+ * 1's order.
+ *
+ * @param ev   The event whose order is to be locked. This event MUST have
+ *             originated from an ordered queue.
+ */
+void odp_schedule_order_lock(odp_event_t ev);
+
+/**
+ * Ordered event unlock
+ *
+ * Release an ordered lock previously acquired by odp_schedule_order_lock().
+ * It is an error to attempt to release a lock that had not been previously
+ * acquired for the specified event.  Following this call, the thread will
+ * exit the critical section protected by the ordered lock and will resume
+ * parallel execution until the next call to odp_schedule_order_lock() for
+ * that event, or until the event's order is resolved by a call to
+ * odp_queue_enq() or odp_schedule_release_ordered().
+ *
+ * @param ev    The event whose order is to be unlocked.
+ */
+void odp_schedule_order_unlock(odp_event_t ev);
+
+/**
  * Copy order from one event to another
  *
  * This call copies the order associated with an event originating from an
@@ -181,14 +216,19 @@  int odp_schedule_release_ordered(odp_event_t ev);
  * associated ordering at input to the call. If the target is ordered, the
  * prior ordering must first be released by an odp_schedule_release_ordered()
  * call. Successfuly copying an order implicitly sets the order sustain
- * attribute for the src_event as if odp_schedule_order_sustain() were called
- * for it.
+ * attribute for the src_event as if odp_schedule_order_sustain_set() were
+ * called for it.
  *
  * @param src_event Event whose ordering is to be copied
  * @param dst_event Event to receive the same ordering as src_event.
  *
  * @retval 0  Success
  * @retval <0 Failure.  Order not copied.
+ *
+ * @note If multiple events share the same order as a result of
+ * odp_schedule_order_copy(), only one of them should attempt to lock the
+ * order via calls to odp_schedule_order_lock(). Results are undefined if this
+ * restriction is not observed.
  */
 int odp_schedule_order_copy(odp_event_t src_event, odp_event_t dst_event);
 
@@ -336,43 +376,6 @@  int odp_schedule_group_leave(odp_schedule_group_t group,
 int odp_schedule_group_count(odp_schedule_group_t group);
 
 /**
- * Initialize ordered context lock
- *
- * Initialize an ordered queue context lock. The lock can be associated only
- * with ordered queues and used only within an ordered synchronization context.
- *
- * @param queue   Ordered queue
- * @param lock    Ordered context lock
- *
- * @retval 0 on success
- * @retval <0 on failure
- */
-int odp_schedule_olock_init(odp_queue_t queue, odp_schedule_olock_t *lock);
-
-/**
- * Acquire ordered context lock
- *
- * This call is valid only when holding an ordered synchronization context. The
- * lock is used to protect a critical section that is executed within an
- * ordered context. Threads enter the critical section in the order determined
- * by the context (source queue). Lock ordering is automatically skipped for
- * threads that release the context instead of calling the lock.
- *
- * @param lock    Ordered context lock
- */
-void odp_schedule_olock_lock(odp_schedule_olock_t *lock);
-
-/**
- * Release ordered context lock
- *
- * This call is valid only when holding an ordered synchronization context.
- * Release a previously locked ordered context lock.
- *
- * @param lock    Ordered context lock
- */
-void odp_schedule_olock_unlock(odp_schedule_olock_t *lock);
-
-/**
  * @}
  */