On 06/15/16 13:44, Petri Savolainen wrote:
Pktio calls the scheduler interface function pktio_start
once per odp_pktio_start(). Scheduler handles internally
creation of multiple poll commands.
Signed-off-by: Petri Savolainen <[email protected]>
---
platform/linux-generic/odp_packet_io.c | 10 +++++----
platform/linux-generic/odp_schedule.c | 41 +++++++++++++++++-----------------
2 files changed, 27 insertions(+), 24 deletions(-)
diff --git a/platform/linux-generic/odp_packet_io.c
b/platform/linux-generic/odp_packet_io.c
index 0e47533..9dff9f6 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -444,17 +444,19 @@ int odp_pktio_start(odp_pktio_t hdl)
if (mode == ODP_PKTIN_MODE_SCHED) {
unsigned i;
+ unsigned num = entry->s.num_in_queue;
+ int index[num];
- for (i = 0; i < entry->s.num_in_queue; i++) {
- int index = i;
+ for (i = 0; i < num; i++) {
+ index[i] = i;
if (entry->s.in_queue[i].queue == ODP_QUEUE_INVALID) {
ODP_ERR("No input queue\n");
return -1;
}
-
- sched_fn->pktio_start(hdl, 1, &index);
}
+
+ sched_fn->pktio_start(hdl, num, index);
}
return res;
diff --git a/platform/linux-generic/odp_schedule.c
b/platform/linux-generic/odp_schedule.c
index 3b97909..f572468 100644
--- a/platform/linux-generic/odp_schedule.c
+++ b/platform/linux-generic/odp_schedule.c
@@ -417,33 +417,34 @@ static void schedule_pktio_start(odp_pktio_t pktio, int
num_in_queue,
odp_queue_t queue;
int i, idx;
- buf = odp_buffer_alloc(sched->pool);
-
- if (buf == ODP_BUFFER_INVALID)
- ODP_ABORT("Sched pool empty\n");
-
- sched_cmd = odp_buffer_addr(buf);
- sched_cmd->cmd = SCHED_CMD_POLL_PKTIN;
- sched_cmd->pktio = pktio;
- sched_cmd->pktio_index = odp_pktio_index(pktio);
- sched_cmd->num = num_in_queue;
-
if (num_in_queue > MAX_PKTIN)
ODP_ABORT("Too many input queues for scheduler\n");
- for (i = 0; i < num_in_queue; i++)
- sched_cmd->index[i] = in_queue_idx[i];
+ /* Create a pktio poll command per queue */
+ for (i = 0; i < num_in_queue; i++) {
+ buf = odp_buffer_alloc(sched->pool);
- idx = poll_cmd_queue_idx(pktio, in_queue_idx[0]);
+ if (buf == ODP_BUFFER_INVALID)
+ ODP_ABORT("Sched pool empty\n");
- odp_spinlock_lock(&sched->poll_cmd_lock);
- sched->poll_cmd[idx].num++;
- odp_spinlock_unlock(&sched->poll_cmd_lock);
+ sched_cmd = odp_buffer_addr(buf);
+ sched_cmd->cmd = SCHED_CMD_POLL_PKTIN;
+ sched_cmd->pktio = pktio;
+ sched_cmd->pktio_index = odp_pktio_index(pktio);
+ sched_cmd->num = 1;
+ sched_cmd->index[0] = in_queue_idx[i];
+
+ idx = poll_cmd_queue_idx(pktio, in_queue_idx[i]);
- queue = sched->poll_cmd[idx].queue;
+ odp_spinlock_lock(&sched->poll_cmd_lock);
+ sched->poll_cmd[idx].num++;
+ odp_spinlock_unlock(&sched->poll_cmd_lock);
Petri, why you don't use atomic here? If some platform has lock free
atomic increments it has to
be faster then lock/unlock.
Maxim.
- if (odp_queue_enq(queue, odp_buffer_to_event(buf)))
- ODP_ABORT("schedule_pktio_start failed\n");
+ queue = sched->poll_cmd[idx].queue;
+
+ if (odp_queue_enq(queue, odp_buffer_to_event(buf)))
+ ODP_ABORT("schedule_pktio_start failed\n");
+ }
}
static void schedule_pktio_stop(sched_cmd_t *sched_cmd)
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp