eventdev: fix Rx SW adapter stop
The Rx adapter stop call does not guarantee that the
SW service function will not execute after the
rte_event_eth_rx_adapter_stop() call.
Add a "started" flag to prevent the adapter from executing
if stop has been called.
Fixes: 9c38b704d2
("eventdev: add eth Rx adapter implementation")
Cc: stable@dpdk.org
Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
This commit is contained in:
parent
d411c4074f
commit
a66a837446
@ -91,6 +91,8 @@ struct rte_event_eth_rx_adapter {
|
|||||||
int socket_id;
|
int socket_id;
|
||||||
/* Per adapter EAL service */
|
/* Per adapter EAL service */
|
||||||
uint32_t service_id;
|
uint32_t service_id;
|
||||||
|
/* Adapter started flag */
|
||||||
|
uint8_t rxa_started;
|
||||||
} __rte_cache_aligned;
|
} __rte_cache_aligned;
|
||||||
|
|
||||||
/* Per eth device */
|
/* Per eth device */
|
||||||
@ -556,6 +558,10 @@ event_eth_rx_adapter_service_func(void *args)
|
|||||||
|
|
||||||
if (rte_spinlock_trylock(&rx_adapter->rx_lock) == 0)
|
if (rte_spinlock_trylock(&rx_adapter->rx_lock) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
if (!rx_adapter->rxa_started) {
|
||||||
|
return 0;
|
||||||
|
rte_spinlock_unlock(&rx_adapter->rx_lock);
|
||||||
|
}
|
||||||
eth_rx_poll(rx_adapter);
|
eth_rx_poll(rx_adapter);
|
||||||
rte_spinlock_unlock(&rx_adapter->rx_lock);
|
rte_spinlock_unlock(&rx_adapter->rx_lock);
|
||||||
return 0;
|
return 0;
|
||||||
@ -847,8 +853,12 @@ rx_adapter_ctrl(uint8_t id, int start)
|
|||||||
&rte_eth_devices[i]);
|
&rte_eth_devices[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (use_service)
|
if (use_service) {
|
||||||
|
rte_spinlock_lock(&rx_adapter->rx_lock);
|
||||||
|
rx_adapter->rxa_started = start;
|
||||||
rte_service_runstate_set(rx_adapter->service_id, start);
|
rte_service_runstate_set(rx_adapter->service_id, start);
|
||||||
|
rte_spinlock_unlock(&rx_adapter->rx_lock);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user