[PATCH]netfront: need release all resources after adding and removing NICs time and again
Liuyingdong
liuyingdong at huawei.com
Fri Nov 4 07:54:59 UTC 2016
On xen,freebsd 10.2 virtual machines hang after adding and removing NICs time and again(more than 30 times).
I found error log is as follows:
"netfront can't alloc tx grant refs"
Signed-off-by: Liudong Liu<Liuyingdong at huawei.com>
diff --git a/dev/xen/netfront/netfront.c b/dev/xen/netfront/netfront.c
index 5497139..e96bbba 100644
--- a/dev/xen/netfront/netfront.c
+++ b/dev/xen/netfront/netfront.c
@@ -790,6 +790,44 @@ netif_release_tx_bufs(struct netfront_info *np)
}
}
+static void netif_release_rx_bufs_copy(struct netfront_info *np)
+{
+ struct mbuf *m;
+ int i, ref;
+ int busy = 0, inuse = 0;
+
+ XN_RX_LOCK(np);
+
+ for (i = 0; i < NET_RX_RING_SIZE; i++) {
+ ref = np->grant_rx_ref[i];
+
+ if (ref == GRANT_REF_INVALID)
+ continue;
+
+ inuse++;
+
+ m = np->rx_mbufs[i];
+
+ if (!gnttab_end_foreign_access_ref(ref))
+ {
+ busy++;
+ continue;
+ }
+
+ gnttab_release_grant_reference(&np->gref_rx_head, ref);
+ np->grant_rx_ref[i] = GRANT_REF_INVALID;
+ add_id_to_freelist(np->rx_mbufs, i);
+
+ m_freem(m);
+ }
+
+ if (busy)
+ DPRINTK("%s: Unable to release %d of %d inuse grant references out of %ld total.\n",
+ __FUNCTION__, busy, inuse, NET_RX_RING_SIZE);
+
+ XN_RX_UNLOCK(np);
+}
+
static void
network_alloc_rx_buffers(struct netfront_info *sc)
{
@@ -2185,6 +2223,13 @@ netif_free(struct netfront_info *info)
info->xn_ifp = NULL;
}
ifmedia_removeall(&info->sc_media);
+
+ netif_release_tx_bufs(info);
+ if (info->copying_receiver)
+ netif_release_rx_bufs_copy(info);
+ gnttab_free_grant_references(info->gref_tx_head);
+ gnttab_free_grant_references(info->gref_rx_head);
+
}
static void
More information about the freebsd-xen
mailing list