@@ -529,7 +529,7 @@ netmap_get_pipe_na(struct nmreq *nmr, struct netmap_adapter **na, int create)
529529 struct ifnet * ifp = NULL ;
530530 u_int pipe_id ;
531531 int role = nmr -> nr_flags & NR_REG_MASK ;
532- int error ;
532+ int error , retries = 0 ;
533533
534534 ND ("flags %x" , nmr -> nr_flags );
535535
@@ -544,12 +544,28 @@ netmap_get_pipe_na(struct nmreq *nmr, struct netmap_adapter **na, int create)
544544 memcpy (& pnmr .nr_name , nmr -> nr_name , IFNAMSIZ );
545545 /* pass to parent the requested number of pipes */
546546 pnmr .nr_arg1 = nmr -> nr_arg1 ;
547- error = netmap_get_na (& pnmr , & pna , & ifp , create );
548- if (error ) {
549- ND ("parent lookup failed: %d" , error );
550- return error ;
547+ for (;;) {
548+ int create_error ;
549+
550+ error = netmap_get_na (& pnmr , & pna , & ifp , create );
551+ if (!error )
552+ break ;
553+ if (error != ENXIO || retries ++ ) {
554+ D ("parent lookup failed: %d" , error );
555+ return error ;
556+ }
557+ D ("try to create a persistent vale port" );
558+ /* create a persistent vale port and try again */
559+ NMG_UNLOCK ();
560+ create_error = netmap_vi_create (& pnmr , 1 /* autodelete */ );
561+ NMG_LOCK ();
562+ if (create_error ) {
563+ if (create_error != EOPNOTSUPP ) {
564+ D ("failed to create a persistent vale port: %d" , create_error );
565+ }
566+ return error ;
567+ }
551568 }
552- ND ("found parent: %s" , na -> name );
553569
554570 if (NETMAP_OWNED_BY_KERN (pna )) {
555571 ND ("parent busy" );
0 commit comments