Commit:
 8fa64fb9fc4e43fbd9d3c226ed89229863bdb771
 linux-generic: scheduler: restructured queue and pktio integration
Implement race with schedule termination and polling input queue.
This patch locks pktio while doing poll to prevent destroy linked
queue in the middle of this poll.

Signed-off-by: Maxim Uvarov <[email protected]>
---
 .../linux-generic/include/odp_packet_io_internal.h |  2 ++
 platform/linux-generic/odp_packet_io.c             | 39 +++++++++++++++++-----
 2 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/platform/linux-generic/include/odp_packet_io_internal.h 
b/platform/linux-generic/include/odp_packet_io_internal.h
index 18b59ef..804ceda 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -88,6 +88,8 @@ static inline pktio_entry_t *get_pktio_entry(odp_pktio_t 
pktio)
 
 int pktin_poll(pktio_entry_t *entry);
 
+int __odp_pktio_recv(odp_pktio_t id, odp_packet_t pkt_table[], int len);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/platform/linux-generic/odp_packet_io.c 
b/platform/linux-generic/odp_packet_io.c
index e7d3c1b..391a8b3 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -382,7 +382,7 @@ static int deq_loopback(pktio_entry_t *pktio_entry, 
odp_packet_t pkts[],
        return nbr;
 }
 
-int odp_pktio_recv(odp_pktio_t id, odp_packet_t pkt_table[], int len)
+int __odp_pktio_recv(odp_pktio_t id, odp_packet_t pkt_table[], int len)
 {
        pktio_entry_t *pktio_entry = get_pktio_entry(id);
        int pkts;
@@ -391,7 +391,6 @@ int odp_pktio_recv(odp_pktio_t id, odp_packet_t 
pkt_table[], int len)
        if (pktio_entry == NULL)
                return -1;
 
-       lock_entry(pktio_entry);
        switch (pktio_entry->s.type) {
        case ODP_PKTIO_TYPE_SOCKET_BASIC:
                pkts = recv_pkt_sock_basic(&pktio_entry->s.pkt_sock,
@@ -413,7 +412,6 @@ int odp_pktio_recv(odp_pktio_t id, odp_packet_t 
pkt_table[], int len)
                break;
        }
 
-       unlock_entry(pktio_entry);
        if (pkts < 0)
                return pkts;
 
@@ -423,6 +421,20 @@ int odp_pktio_recv(odp_pktio_t id, odp_packet_t 
pkt_table[], int len)
        return pkts;
 }
 
+int odp_pktio_recv(odp_pktio_t id, odp_packet_t pkt_table[], int len)
+{
+       pktio_entry_t *pktio_entry = get_pktio_entry(id);
+       int ret = -1;
+
+       if (pktio_entry == NULL)
+               return -1;
+
+       lock_entry(pktio_entry);
+       ret = __odp_pktio_recv(id, pkt_table, len);
+       unlock_entry(pktio_entry);
+
+       return ret;
+}
 static int enq_loopback(pktio_entry_t *pktio_entry, odp_packet_t pkt_tbl[],
                        unsigned len)
 {
@@ -681,13 +693,26 @@ int pktin_poll(pktio_entry_t *entry)
        odp_packet_t pkt_tbl[QUEUE_MULTI_MAX];
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
        int num, num_enq, i;
+       queue_entry_t *qentry;
+       pktio_entry_t *pktio_entry;
 
        if (odp_unlikely(is_free(entry)))
                return -1;
 
-       num = odp_pktio_recv(entry->s.handle, pkt_tbl, QUEUE_MULTI_MAX);
+       pktio_entry = get_pktio_entry(entry->s.handle);
+
+       lock_entry(pktio_entry);
+       if (entry->s.inq_default == ODP_QUEUE_INVALID) {
+               unlock_entry(pktio_entry);
+               return -1;
+       }
+
+       qentry = queue_to_qentry(entry->s.inq_default);
+
+       num = __odp_pktio_recv(entry->s.handle, pkt_tbl, QUEUE_MULTI_MAX);
 
        if (num < 0) {
+               unlock_entry(pktio_entry);
                ODP_ERR("Packet recv error\n");
                return -1;
        }
@@ -707,12 +732,10 @@ int pktin_poll(pktio_entry_t *entry)
                }
        }
 
-       if (num_enq) {
-               queue_entry_t *qentry;
-               qentry = queue_to_qentry(entry->s.inq_default);
+       if (num_enq)
                queue_enq_multi(qentry, hdr_tbl, num_enq);
-       }
 
+       unlock_entry(pktio_entry);
        return 0;
 }
 
-- 
1.9.1

_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to