Merged,
Maxim.
On 02/24/2015 07:32 PM, Stuart Haslam wrote:
PKTIN queue was not handled correctly. Check queue status instead of
queue type in odp_queue_destroy(). In schedule() check for FREE status
rather than DESTROYED as the preceeding dequeue will have caused a
DESTROYED->FREE transition.
Signed-off-by: Taras Kondratiuk <[email protected]>
Signed-off-by: Stuart Haslam <[email protected]>
---
This is a slightly modified version of a patch Taras sent a while
back, but slipped through the cracks and was never merged;
http://lists.linaro.org/pipermail/lng-odp/2014-December/006702.html
The changes I've made are to resolve an issue I found while testing
that patch;
http://lists.linaro.org/pipermail/lng-odp/2015-January/007507.html
.../linux-generic/include/odp_queue_internal.h | 4 +--
platform/linux-generic/odp_queue.c | 39 ++++++++++++----------
platform/linux-generic/odp_schedule.c | 2 +-
3 files changed, 24 insertions(+), 21 deletions(-)
diff --git a/platform/linux-generic/include/odp_queue_internal.h
b/platform/linux-generic/include/odp_queue_internal.h
index bfa36df..65aae14 100644
--- a/platform/linux-generic/include/odp_queue_internal.h
+++ b/platform/linux-generic/include/odp_queue_internal.h
@@ -121,13 +121,13 @@ static inline queue_entry_t *queue_to_qentry(odp_queue_t
handle)
return get_qentry(queue_id);
}
-static inline int queue_is_destroyed(odp_queue_t handle)
+static inline int queue_is_free(odp_queue_t handle)
{
queue_entry_t *queue;
queue = queue_to_qentry(handle);
- return queue->s.status == QUEUE_STATUS_DESTROYED;
+ return queue->s.status == QUEUE_STATUS_FREE;
}
static inline int queue_is_sched(odp_queue_t handle)
diff --git a/platform/linux-generic/odp_queue.c
b/platform/linux-generic/odp_queue.c
index b945e03..477b5e3 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -259,27 +259,30 @@ int odp_queue_destroy(odp_queue_t handle)
queue->s.enqueue = queue_enq_dummy;
queue->s.enqueue_multi = queue_enq_multi_dummy;
- if (queue->s.type == ODP_QUEUE_TYPE_POLL ||
- queue->s.type == ODP_QUEUE_TYPE_PKTOUT) {
+ switch (queue->s.status) {
+ case QUEUE_STATUS_READY:
queue->s.status = QUEUE_STATUS_FREE;
queue->s.head = NULL;
queue->s.tail = NULL;
- } else if (queue->s.type == ODP_QUEUE_TYPE_SCHED) {
- if (queue->s.status == QUEUE_STATUS_SCHED) {
- /*
- * Override dequeue_multi to destroy queue when it will
- * be scheduled next time.
- */
- queue->s.status = QUEUE_STATUS_DESTROYED;
- queue->s.dequeue_multi = queue_deq_multi_destroy;
- } else {
- /* Queue won't be scheduled anymore */
- odp_buffer_free(queue->s.sched_buf);
- queue->s.sched_buf = ODP_BUFFER_INVALID;
- queue->s.status = QUEUE_STATUS_FREE;
- queue->s.head = NULL;
- queue->s.tail = NULL;
- }
+ break;
+ case QUEUE_STATUS_SCHED:
+ /*
+ * Override dequeue_multi to destroy queue when it will
+ * be scheduled next time.
+ */
+ queue->s.status = QUEUE_STATUS_DESTROYED;
+ queue->s.dequeue_multi = queue_deq_multi_destroy;
+ break;
+ case QUEUE_STATUS_NOTSCHED:
+ /* Queue won't be scheduled anymore */
+ odp_buffer_free(queue->s.sched_buf);
+ queue->s.sched_buf = ODP_BUFFER_INVALID;
+ queue->s.status = QUEUE_STATUS_FREE;
+ queue->s.head = NULL;
+ queue->s.tail = NULL;
+ break;
+ default:
+ ODP_ABORT("Unexpected queue status\n");
}
UNLOCK(&queue->s.lock);
diff --git a/platform/linux-generic/odp_schedule.c b/platform/linux-generic/odp_schedule.c
index 1a96cd9..dd65168 100644
--- a/platform/linux-generic/odp_schedule.c
+++ b/platform/linux-generic/odp_schedule.c
@@ -336,7 +336,7 @@ static int schedule(odp_queue_t *out_queue, odp_event_t
out_ev[],
*/
if (odp_queue_type(queue) ==
ODP_QUEUE_TYPE_PKTIN &&
- !queue_is_destroyed(queue))
+ !queue_is_free(queue))
odp_queue_enq(pri_q, ev);
continue;
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp