Balasubramanian Manoharan(bala-manoharan) replied on github web page:

include/odp/api/spec/schedule.h
line 43
@@ -365,7 +368,28 @@ void odp_schedule_order_lock(unsigned lock_index);
  *                   hold this lock. Must be in the range
  *                   0..odp_queue_lock_count() - 1
  */
-void odp_schedule_order_unlock(unsigned lock_index);
+void odp_schedule_order_unlock(uint32_t lock_index);
+
+/**
+ * Release existing ordered context lock and acquire a new lock
+ *
+ * This call is valid only when holding an ordered synchronization context.
+ * Release a previously locked ordered context lock and acquire a new ordered
+ * context lock. The operation is equivalent to application calling first
+ * odp_schedule_order_unlock(unlock_index) and then
+ * odp_schedule_order_lock(lock_index). The same constraints apply to this call
+ * similar to calling these two calls in sequence.
+ *
+ * @param unlock_index Index of the acquired ordered lock in the current
+ *                     context to be released.
+ * @param lock_index   Index of the ordered lock in the current context to be
+ *                     acquired. Must be in the range
+ *                     0...odp_queue_lock_count() - 1.
+ *
+ * @see odp_schedule_order_lock(), odp_schedule_order_unlock()
+ *
+ */
+void odp_schedule_order_unlock_lock(uint32_t unlock_index, uint32_t 
lock_index);


Comment:
changed in next verion.

> Balasubramanian Manoharan(bala-manoharan) wrote:
> Okay


>> Balasubramanian Manoharan(bala-manoharan) wrote:
>> Okay


>>> Petri Savolainen(psavol) wrote:
>>> Also lock_count should be updated to uint32_t.
>>> 
>>> unsigned -> uint32_t
>>> typedef     struct odp_schedule_param_t {
>>>    ....
>>>    unsigned lock_count;
>>> }
>>> 
>>> int -> int32_t
>>> int odp_queue_lock_count(odp_queue_t queue);
>>> 
>>> Check also validation code which uses int/unsigned variables today.


>>>> Petri Savolainen(psavol) wrote:
>>>> Also lock / unlock function pointer prototypes need to be updated to 
>>>> uint32_t.


>>>>> Petri Savolainen(psavol) wrote:
>>>>> Maybe this "The same constraints apply to this call similar to calling 
>>>>> these two calls in sequence" needs to be re-worded to be more fluent. 
>>>>> E.g. "The same constraints apply with this call as with those two."


>>>>>> Petri Savolainen(psavol) wrote:
>>>>>> "Results are undefined if the
>>>>>> ordered lock with the given unlock_index is not held by
>>>>>> this ordered context."
>>>>>> 
>>>>>> Duplication on unlock() API text. Better to remove this from here.
>>>>>>  


>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>> It's better to remove this duplicate spec ...
>>>>>>> "This call is valid only when there is a single ordered context
>>>>>>> lock active. Results are undefined if this call is made when multiple 
>>>>>>> ordered
>>>>>>> context locks are acquired in nested fashion.
>>>>>>> This call does not release the existing ordered context and only 
>>>>>>> switches
>>>>>>> from one ordered lock to another ordered lock within the same ordered
>>>>>>> context."
>>>>>>> 
>>>>>>> ... and refer to lock()/unlock() spec instead: "The operation is 
>>>>>>> equivalent to application calling first 
>>>>>>> odp_schedule_order_unlock(unlock_index) and then 
>>>>>>> odp_schedule_order_lock(lock_index). The same constraints apply to this 
>>>>>>> call than those two."


>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>> Remove this outdated sentence: " Previously acquired ordered lock is 
>>>>>>>> released." We have now unlock_index to identify which lock is unlocked.


>>>>>>>>> muvarov wrote
>>>>>>>>> @psavol only comment like you did.


>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>> Was there some benefit of not having index of the unlocked lock as a 
>>>>>>>>>> parameter ? Can't remember if I suggested it myself.  Anyway, 
>>>>>>>>>> implementation would simplify and it would still be as robust as 
>>>>>>>>>> unlock() (which application may pass bad lock index). 


>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>> Don't know how to comment on COMMIT LOG on Github !
>>>>>>>>>>> 
>>>>>>>>>>> Anyway, commit log needs correct format "linux-gen: sched: ...." 
>>>>>>>>>>> and some more text (it's empty now)


>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>> "This call does not release the existing ordered context and only 
>>>>>>>>>>>> switches
>>>>>>>>>>>> from one ordered lock to another ordered lock within the same 
>>>>>>>>>>>> ordered
>>>>>>>>>>>> context."
>>>>>>>>>>>> 
>>>>>>>>>>>> I'd remove this since this call is not different to lock/unlock 
>>>>>>>>>>>> calls in this regard


>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>> "This call is valid only when there is a single ordered context
>>>>>>>>>>>>>  lock active. Results are undefined if this call is made when 
>>>>>>>>>>>>> multiple ordered
>>>>>>>>>>>>>  context locks are acquired in nested fashion. "
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Why nested locks are banned? I think it should not make a 
>>>>>>>>>>>>> difference. Unlock_lock(C) is equivalent to unlock(B) + lock(C) 
>>>>>>>>>>>>> under.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> lock(A)
>>>>>>>>>>>>> lock(B)
>>>>>>>>>>>>> unlock(B)
>>>>>>>>>>>>> lock(C)
>>>>>>>>>>>>> ...


>>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>>> To match other function prototypes, should be **unsigned** 
>>>>>>>>>>>>>> instead of uint32_t.


>>>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>>>> It implements ordered lock API by handling all queues as atomic.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> It demonstrates a very simple implementation of the API, and 
>>>>>>>>>>>>>>> thus is an easy starting for new scheduler development. 


>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>> I added this change for scenario where 
>>>>>>>>>>>>>>>> odp_schedule_order_unlock_lock() is called after a lock has 
>>>>>>>>>>>>>>>> been released using odp_schedule_order_unlock() but since we 
>>>>>>>>>>>>>>>> are defining in the documentation this is an undefined 
>>>>>>>>>>>>>>>> behaviour I believe your suggestion makes sense.
>>>>>>>>>>>>>>>> I will update in the next version.


>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>> Done


>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>> I will be moving lock_index from rctx to 
>>>>>>>>>>>>>>>>>> sched_scalable_thread_state_t in the next version and thanks 
>>>>>>>>>>>>>>>>>> for pointing it out.


>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>> The initial draft of ordered lock considered API for 
>>>>>>>>>>>>>>>>>>> locking and unlocking ordered locks within a context. We 
>>>>>>>>>>>>>>>>>>> found an use-case from the customer where the application 
>>>>>>>>>>>>>>>>>>> was splitting a single ordered flow to two different flows, 
>>>>>>>>>>>>>>>>>>> which is possible with our current API architecture but the 
>>>>>>>>>>>>>>>>>>> drawback is that it requires the application to make two 
>>>>>>>>>>>>>>>>>>> different calls odp_schedule_unlock() and 
>>>>>>>>>>>>>>>>>>> odp_schedule_lock() which will have performance issues 
>>>>>>>>>>>>>>>>>>> since the implementation has to internally switch out of 
>>>>>>>>>>>>>>>>>>> the lock and then acquire the new lock. The main objective 
>>>>>>>>>>>>>>>>>>> of this new API is to optimize this use-case by using a 
>>>>>>>>>>>>>>>>>>> single API which switches the ordered context from one 
>>>>>>>>>>>>>>>>>>> ordered lock to another.


>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>> Not true. Linux-generic implementation is using an 
>>>>>>>>>>>>>>>>>>>> uint16_t but as explained before implementations are free 
>>>>>>>>>>>>>>>>>>>> to use any number of bits as required. The number of bits 
>>>>>>>>>>>>>>>>>>>> of lock_index also depends upon the application use-case.
>>>>>>>>>>>>>>>>>>>> Ordered locks is not related to number of threads in the 
>>>>>>>>>>>>>>>>>>>> system but to the total number of flows in the system. 
>>>>>>>>>>>>>>>>>>>> Depending upon the implementation it could support a huge 
>>>>>>>>>>>>>>>>>>>> number of flows ( 2^20 ) and not all flows will be active.


>>>>>>>>>>>>>>>>>>>>> Balasubramanian Manoharan(bala-manoharan) wrote:
>>>>>>>>>>>>>>>>>>>>> Just to reiterate, ordered locks are used to make sure 
>>>>>>>>>>>>>>>>>>>>> packet belonging to a particular flow acquire the lock in 
>>>>>>>>>>>>>>>>>>>>> order. There is no need to acquire the lock in ascending 
>>>>>>>>>>>>>>>>>>>>> order. Even though our linux-generic implementation is 
>>>>>>>>>>>>>>>>>>>>> using them as index number for performance reasons it 
>>>>>>>>>>>>>>>>>>>>> will usually be the last few bits of the flow id 
>>>>>>>>>>>>>>>>>>>>> calculated by RSS or any other mechanism decided by the 
>>>>>>>>>>>>>>>>>>>>> application.


>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>> As noted above, since `odp_schedule_order_unlock_lock()` 
>>>>>>>>>>>>>>>>>>>>>> only takes one parameter (the index of the new lock to 
>>>>>>>>>>>>>>>>>>>>>> be acquired), we need a place to store the index of the 
>>>>>>>>>>>>>>>>>>>>>> lock that the caller now holds to be used as an implied 
>>>>>>>>>>>>>>>>>>>>>> parameter to that API. So this is supposed to be a 
>>>>>>>>>>>>>>>>>>>>>> thread-local variable. If that's not what's happening 
>>>>>>>>>>>>>>>>>>>>>> here then that needs to be fixed, so thanks for pointing 
>>>>>>>>>>>>>>>>>>>>>> that out.


>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>> The lock_index is an implied parameter to 
>>>>>>>>>>>>>>>>>>>>>>> `odp_schedule_order_unlock_lock()`. It's the index of 
>>>>>>>>>>>>>>>>>>>>>>> the lock that the caller currently holds, so this is a 
>>>>>>>>>>>>>>>>>>>>>>> thread-local variable. It's an error to call this API 
>>>>>>>>>>>>>>>>>>>>>>> without already holding an ordered lock. 


>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>> ODP does not have any architectural requirement that 
>>>>>>>>>>>>>>>>>>>>>>>> ordered locks be acquired in any particular sequence, 
>>>>>>>>>>>>>>>>>>>>>>>> or that they be acquired at all. The only requirement 
>>>>>>>>>>>>>>>>>>>>>>>> is that they only can be acquired once per ordered 
>>>>>>>>>>>>>>>>>>>>>>>> context. So this wording is correct. It's entirely 
>>>>>>>>>>>>>>>>>>>>>>>> possible that a thread acquires lock 1 first and then 
>>>>>>>>>>>>>>>>>>>>>>>> switches to lock 0. It's entirely up to the 
>>>>>>>>>>>>>>>>>>>>>>>> application. 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> The beauty of ordered locks is that they are 
>>>>>>>>>>>>>>>>>>>>>>>> deadlock-free by design even in the face of random 
>>>>>>>>>>>>>>>>>>>>>>>> acquisition order among the various threads that use 
>>>>>>>>>>>>>>>>>>>>>>>> them.


>>>>>>>>>>>>>>>>>>>>>>>>> WonderfulVoid wrote
>>>>>>>>>>>>>>>>>>>>>>>>> @psavol The SP scheduler only exists to provide 
>>>>>>>>>>>>>>>>>>>>>>>>> strict priority scheduling? The scalable scheduler 
>>>>>>>>>>>>>>>>>>>>>>>>> does that as well (and doesn't the default scheduler 
>>>>>>>>>>>>>>>>>>>>>>>>> also do basic SP scheduling?). Are there any specific 
>>>>>>>>>>>>>>>>>>>>>>>>> characteristics of the SP scheduler (beyond the basic 
>>>>>>>>>>>>>>>>>>>>>>>>> SP scheduling) that are of interest? In benchmarking, 
>>>>>>>>>>>>>>>>>>>>>>>>> the SP scheduler seemed to be the slowest by far.


>>>>>>>>>>>>>>>>>>>>>>>>>> WonderfulVoid wrote
>>>>>>>>>>>>>>>>>>>>>>>>>> The reorder window (rwin) is shared by all threads, 
>>>>>>>>>>>>>>>>>>>>>>>>>> you can't store per-thread data in it, you would use 
>>>>>>>>>>>>>>>>>>>>>>>>>> the reorder context (rctx) for that.
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> But why are we saving the lock_index? Is it used for 
>>>>>>>>>>>>>>>>>>>>>>>>>> making any correctness checks (e.g. verifying that 
>>>>>>>>>>>>>>>>>>>>>>>>>> the application isn't unlocking some lock it hasn't 
>>>>>>>>>>>>>>>>>>>>>>>>>> acquired)?


>>>>>>>>>>>>>>>>>>>>>>>>>>> WonderfulVoid wrote
>>>>>>>>>>>>>>>>>>>>>>>>>>> Why is this uint32_t? The lock_count (defined 
>>>>>>>>>>>>>>>>>>>>>>>>>>> below) is only an uint16_t. We don't support more 
>>>>>>>>>>>>>>>>>>>>>>>>>>> than 65535 locks (per ordered queue). The ordered 
>>>>>>>>>>>>>>>>>>>>>>>>>>> locks themselves use uint32_t (for the "ticket") 
>>>>>>>>>>>>>>>>>>>>>>>>>>> but also that is overkill, there just won't be that 
>>>>>>>>>>>>>>>>>>>>>>>>>>> many threads.
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> Also this seems to be used for per-thread purposes 
>>>>>>>>>>>>>>>>>>>>>>>>>>> (schedule_order_lock() saves the passed lock_index 
>>>>>>>>>>>>>>>>>>>>>>>>>>> here) but the reorder_window is shared by all 
>>>>>>>>>>>>>>>>>>>>>>>>>>> threads and cannot be used for per-thread data. If 
>>>>>>>>>>>>>>>>>>>>>>>>>>> lock_index needs to be saved (is it actually used 
>>>>>>>>>>>>>>>>>>>>>>>>>>> for anything?), it should be saved in the 
>>>>>>>>>>>>>>>>>>>>>>>>>>> reorder_context.


>>>>>>>>>>>>>>>>>>>>>>>>>>>> WonderfulVoid wrote
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Shouldn't lock_index be in the range 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1..odp_queue_lock_count()-1? We are supposedly 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> already holding one lock (lock_index >=0), this 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> lock will be released and the next lock will be 
>>>>>>>>>>>>>>>>>>>>>>>>>>>> acquired.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Delete, as per previous explanation. The scalable 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> scheduler could be further optimized by changing 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> its runtime checks to ODP_ASSERT()s, but that's 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> beyond the scope of this PR.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This needs to go after the `if` statement, not 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> inside it, since the whole statement is skipped 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if the lock is immediately available--it's only 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> there to wait for the lock.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Delete, as per above explanation.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Again, this should have a doxygen comment for 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> consistency.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Nice way to avoid the extraneous checking in 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `schedule_order_unlock_lock()`, but actually 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> this isn't needed at all due to the prior 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `ODP_ASSERT()`. That assert requires that the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `lock_index` lock be held at entry to 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `schedule_order_unlock` so if 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_schedule_order_unlock_unlock()` is 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> called without an ordered lock being held, 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the previous `ODP_ASSERT()` will detect that 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> and abort. 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Interestingly, this also means that (in 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> odp-linux, at least) you can call 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_schedule_order_unlock_lock()` while 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> holding nested ordered locks. The semantics 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> is always to release the most recently 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> acquired ordered lock and replace that with a 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> new ordered lock regardless of how many other 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ordered locks the caller holds in this 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ordered context.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> So the net is you can delete this statement 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> without any loss of correctness.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This should have a doxygen description for 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> consistency with surrounding vars.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I didn't realize the schedule_sp didn't 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> implement ordered locks. @psavol is this a 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "to do" item?


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> A simple reference to the stored 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `lock_index` is sufficient here. No need 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> for atomics.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This can be optimized into an 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `ODP_ASSERT()` to be consistent with the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> other schedulers. Behavior is undefined 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if these routines are not called within 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> an ordered context, so no need to take a 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> runtime hit to do these type of checks.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Same comment here. A simple `lock_index` 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> tracker is all that's needed.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Again, no need for fancy atomics here 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> since you're already protected by the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ordered lock itself. You're just 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> remembering the `lock_index` you locked.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I suspect same comments for this patch 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> apply equally to all of the scheduler 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> variants. Not repeating individual 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> review comments here.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Replace above two lines with:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>         
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> schedule_order_unlock(sched_local.ordered.lock_index);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ```


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro) 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Add here:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>      ODP_ASSERT(queue_index != 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> NULL_INDEX &&
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                 lock_index <= 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sched->queue[queue_index].order_lock_count
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  &&
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> !sched_local.ordered.lock_called.u8[lock_index]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  &&
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                    
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sched_local.ordered.lock_called.u8[sched_local.ordered.lock_index]);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ```


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro) 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Unnecessary


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro) 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Unnecessary


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro) 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Unnecesssary


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro) 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> All that's needed here is a 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `sched_local.ordered.lock_index 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> = lock_index;`


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Not the best choice of name. 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> You're not tracking that a lock 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> has been acquired, but rather 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> the index value of the lock 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that has been acquired.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Unnecessary.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Unnecessary


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Why does this need to be an 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_atomic_u64_t`? All 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> you're doing is tracking the 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> index of the currently owned 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ordered lock so you can use 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> this as an implicit 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> parameter to 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> `odp_schedule_order_unlock_lock()`.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  As such a `uint16_t` (or 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> even a `uint8_t`) should be 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sufficient here. 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> But this information is part 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> of the `sched_local.ordered` 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> struct.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> You might wish to clarify 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that this call does not 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> release the ordered context 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> that contains the lock 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> being unlocked. This call 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> simply changes from one 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ordered lock to another 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> within the current ordered 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> context.


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Typo: acquire


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bill 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fischofer(Bill-Fischofer-Linaro)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Typo: acquire


https://github.com/Linaro/odp/pull/160#discussion_r138858756
updated_at 2017-09-14 10:48:26

Reply via email to