@@ -231,6 +231,7 @@ static struct mur_queue* urq_get(struct mudp_rxq_mgr* mgr,
231231 if (q ) {
232232 if (!q -> reuse_port || !create -> reuse_port ) {
233233 err ("%s(%d,%u), already used\n" , __func__ , port , dst_port );
234+ q = NULL ;
234235 goto out_unlock_fail ;
235236 }
236237
@@ -257,6 +258,7 @@ static struct mur_queue* urq_get(struct mudp_rxq_mgr* mgr,
257258 q -> rx_burst_pkts = 128 ;
258259 MT_TAILQ_INIT (& q -> client_head );
259260 mt_pthread_mutex_init (& q -> mutex , NULL );
261+ rte_atomic32_inc (& q -> refcnt );
260262
261263 /* create flow */
262264 struct mt_rxq_flow flow ;
@@ -265,28 +267,37 @@ static struct mur_queue* urq_get(struct mudp_rxq_mgr* mgr,
265267 flow .dst_port = dst_port ;
266268 q -> rxq = mt_rxq_get (impl , port , & flow );
267269 if (!q -> rxq ) {
268- err ("%s(%d,%u), get rxq fail\n" , __func__ , port , dst_port );
269- urq_put (q );
270- goto out_unlock_fail ;
270+ /* wa for e810 pf mode since it doesn't support MT_RXQ_FLOW_F_NO_IP */
271+ warn ("%s(%d,%u), get rxq fail with no ip flow, try cni queue\n" , __func__ , port ,
272+ dst_port );
273+ flow .flags |= MT_RXQ_FLOW_F_FORCE_CNI ;
274+ q -> rxq = mt_rxq_get (impl , port , & flow );
275+ if (!q -> rxq ) {
276+ err ("%s(%d,%u), get rxq fail with CNI also\n" , __func__ , port , dst_port );
277+ goto out_unlock_fail ;
278+ }
279+ /* start mtl sch with CNI tasklet mode */
280+ if (!mt_started (impl )) {
281+ mtl_start (impl );
282+ }
271283 }
272284 q -> rxq_id = mt_rxq_queue_id (q -> rxq );
273285
274286 ret = urq_mgr_add (mgr , q );
275287 if (ret < 0 ) {
276288 err ("%s(%d,%u), urq mgr add fail %d\n" , __func__ , port , dst_port , ret );
277- urq_put (q );
278289 goto out_unlock_fail ;
279290 }
280291
281292 * idx = 0 ;
282- rte_atomic32_inc (& q -> refcnt );
283293 urq_mgr_unlock (mgr );
284294
285295 info ("%s(%d,%u), new q %p\n" , __func__ , port , dst_port , q );
286296 return q ;
287297
288298out_unlock_fail :
289299 urq_mgr_unlock (mgr );
300+ if (q ) urq_put (q );
290301 return NULL ;
291302}
292303
0 commit comments