Skip to content

Commit 92553ac

Browse files
Merge branch 'master' into github-master
2 parents 47bb1eb + 458bb0d commit 92553ac

3 files changed

Lines changed: 41 additions & 10 deletions

File tree

sys/dev/netmap/netmap_kern.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,7 @@ struct netmap_vp_adapter { /* VALE software port */
872872
int bdg_port;
873873
struct nm_bridge *na_bdg;
874874
int retry;
875+
int autodelete; /* remove the ifp on last reference */
875876

876877
/* Maximum Frame Size, used in bdg_mismatch_datapath() */
877878
u_int mfs;
@@ -995,7 +996,10 @@ struct netmap_bwrap_adapter {
995996
struct nm_bdg_polling_state *na_polling_state;
996997
};
997998
int netmap_bwrap_attach(const char *name, struct netmap_adapter *);
999+
int netmap_vi_create(struct nmreq *, int);
9981000

1001+
#else /* !WITH_VALE */
1002+
#define netmap_vi_create(nmr, a) (EOPNOTSUPP)
9991003
#endif /* WITH_VALE */
10001004

10011005
#ifdef WITH_PIPES

sys/dev/netmap/netmap_pipe.c

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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");

sys/dev/netmap/netmap_vale.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,13 @@ netmap_vp_dtor(struct netmap_adapter *na)
538538
if (b) {
539539
netmap_bdg_detach_common(b, vpna->bdg_port, -1);
540540
}
541+
542+
if (vpna->autodelete && na->ifp != NULL) {
543+
ND("releasing %s", na->ifp->if_xname);
544+
NMG_UNLOCK();
545+
nm_os_vi_detach(na->ifp);
546+
NMG_LOCK();
547+
}
541548
}
542549

543550
/* remove a persistent VALE port from the system */
@@ -592,8 +599,8 @@ nm_update_info(struct nmreq *nmr, struct netmap_adapter *na)
592599
* Create a virtual interface registered to the system.
593600
* The interface will be attached to a bridge later.
594601
*/
595-
static int
596-
nm_vi_create(struct nmreq *nmr)
602+
int
603+
netmap_vi_create(struct nmreq *nmr, int autodelete)
597604
{
598605
struct ifnet *ifp;
599606
struct netmap_vp_adapter *vpna;
@@ -628,7 +635,11 @@ nm_vi_create(struct nmreq *nmr)
628635
}
629636
/* persist-specific routines */
630637
vpna->up.nm_bdg_ctl = netmap_vp_bdg_ctl;
631-
netmap_adapter_get(&vpna->up);
638+
if (!autodelete) {
639+
netmap_adapter_get(&vpna->up);
640+
} else {
641+
vpna->autodelete = 1;
642+
}
632643
NM_ATTACH_NA(ifp, &vpna->up);
633644
/* return the updated info */
634645
error = nm_update_info(nmr, &vpna->up);
@@ -1160,7 +1171,7 @@ netmap_bdg_ctl(struct nmreq *nmr, struct netmap_bdg_ops *bdg_ops)
11601171

11611172
switch (cmd) {
11621173
case NETMAP_BDG_NEWIF:
1163-
error = nm_vi_create(nmr);
1174+
error = netmap_vi_create(nmr, 0 /* no autodelete */);
11641175
break;
11651176

11661177
case NETMAP_BDG_DELIF:

0 commit comments

Comments
 (0)