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

Reply via email to