Reviewed-by: Nicolas Morey-Chaisemartin <nmo...@kalray.eu> On 11/05/2015 04:58 PM, Maxim Uvarov wrote: > According to API odp_pktio_close() can be called only for stopped > pktio. So in odp_pktio_term_global try to stop it first then > call close. Also check all returns codes. > https://bugs.linaro.org/show_bug.cgi?id=1854 > > Signed-off-by: Maxim Uvarov <maxim.uva...@linaro.org> > --- > v2: lock pktio for stop and close in odp_pktio_term_global() (Nicolases note) > > platform/linux-generic/odp_packet_io.c | 119 > ++++++++++++++++++++++----------- > 1 file changed, 79 insertions(+), 40 deletions(-) > > diff --git a/platform/linux-generic/odp_packet_io.c > b/platform/linux-generic/odp_packet_io.c > index 1246bff..c3bc6a0 100644 > --- a/platform/linux-generic/odp_packet_io.c > +++ b/platform/linux-generic/odp_packet_io.c > @@ -84,33 +84,6 @@ int odp_pktio_init_global(void) > return 0; > } > > -int odp_pktio_term_global(void) > -{ > - pktio_entry_t *pktio_entry; > - int ret = 0; > - int id; > - int pktio_if; > - > - for (id = 1; id <= ODP_CONFIG_PKTIO_ENTRIES; ++id) { > - pktio_entry = &pktio_tbl->entries[id - 1]; > - odp_pktio_close(pktio_entry->s.handle); > - odp_queue_destroy(pktio_entry->s.outq_default); > - } > - > - for (pktio_if = 0; pktio_if_ops[pktio_if]; ++pktio_if) { > - if (pktio_if_ops[pktio_if]->term) > - if (pktio_if_ops[pktio_if]->term()) > - ODP_ERR("failed to terminate pktio type %d", > - pktio_if); > - } > - > - ret = odp_shm_free(odp_shm_lookup("odp_pktio_entries")); > - if (ret < 0) > - ODP_ERR("shm free failed for odp_pktio_entries"); > - > - return ret; > -} > - > int odp_pktio_init_local(void) > { > return 0; > @@ -284,10 +257,22 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t > pool, > return id; > } > > +static int _pktio_close(pktio_entry_t *entry) > +{ > + int ret; > + > + ret = entry->s.ops->close(entry); > + if (ret) > + return -1; > + > + set_free(entry); > + return 0; > +} > + > int odp_pktio_close(odp_pktio_t id) > { > pktio_entry_t *entry; > - int res = -1; > + int res; > > entry = get_pktio_entry(id); > if (entry == NULL) > @@ -295,14 +280,12 @@ int odp_pktio_close(odp_pktio_t id) > > lock_entry(entry); > if (!is_free(entry)) { > - res = entry->s.ops->close(entry); > - res |= free_pktio_entry(id); > + res = _pktio_close(entry); > + if (res) > + ODP_ABORT("unable to close pktio\n"); > } > unlock_entry(entry); > > - if (res != 0) > - return -1; > - > return 0; > } > > @@ -325,20 +308,29 @@ int odp_pktio_start(odp_pktio_t id) > return res; > } > > -int odp_pktio_stop(odp_pktio_t id) > +static int _pktio_stop(pktio_entry_t *entry) > { > - pktio_entry_t *entry; > int res = 0; > > - entry = get_pktio_entry(id); > - if (!entry) > - return -1; > - > - lock_entry(entry); > if (entry->s.ops->stop) > res = entry->s.ops->stop(entry); > if (!res) > entry->s.state = STATE_STOP; > + > + return res; > +} > + > +int odp_pktio_stop(odp_pktio_t id) > +{ > + pktio_entry_t *entry; > + int res; > + > + entry = get_pktio_entry(id); > + if (!entry) > + return -1; > + > + lock_entry(entry); > + res = _pktio_stop(entry); > unlock_entry(entry); > > return res; > @@ -822,3 +814,50 @@ void odp_pktio_param_init(odp_pktio_param_t *params) > { > memset(params, 0, sizeof(odp_pktio_param_t)); > } > + > +int odp_pktio_term_global(void) > +{ > + int ret; > + int id; > + int pktio_if; > + > + for (id = 0; id < ODP_CONFIG_PKTIO_ENTRIES; ++id) { > + pktio_entry_t *pktio_entry; > + > + pktio_entry = &pktio_tbl->entries[id]; > + > + ret = odp_queue_destroy(pktio_entry->s.outq_default); > + if (ret) > + ODP_ABORT("unable to destroy outq %s\n", > + pktio_entry->s.name); > + > + if (is_free(pktio_entry)) > + continue; > + > + lock_entry(pktio_entry); > + if (pktio_entry->s.state != STATE_STOP) { > + ret = _pktio_stop(pktio_entry); > + if (ret) > + ODP_ABORT("unable to stop pktio %s\n", > + pktio_entry->s.name); > + } > + ret = _pktio_close(pktio_entry); > + if (ret) > + ODP_ABORT("unable to close pktio %s\n", > + pktio_entry->s.name); > + unlock_entry(pktio_entry); > + } > + > + for (pktio_if = 0; pktio_if_ops[pktio_if]; ++pktio_if) { > + if (pktio_if_ops[pktio_if]->term) > + if (pktio_if_ops[pktio_if]->term()) > + ODP_ABORT("failed to terminate pktio type %d", > + pktio_if); > + } > + > + ret = odp_shm_free(odp_shm_lookup("odp_pktio_entries")); > + if (ret != 0) > + ODP_ERR("shm free failed for odp_pktio_entries"); > + > + return ret; > +}
_______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp