Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Nov 2016 10:04:28 +0800
From:      liuyingdong <liuyingdong@huawei.com>
To:        freebsd xen <roger.pau@citrix.com>
Cc:        <freebsd-xen@freebsd.org>, <zhao.zhaojun@huawei.com>, <suoben@huawei.com>,  <ouyangzhaowei@huawei.com>
Subject:   Re: [PATCH]netfront: need release all resources after adding and removing NICs time and again
Message-ID:  <5825272C.3010704@huawei.com>

next in thread | raw e-mail | index | archive | help
Hello Roger,
	Sorry, I am a freshman. I ran the following command to git kernel source of freebsd 10.2.0:
		git clone https://github.com/freebsd/freebsd.git
		git checkout origin/release/10.2.0
	On the base of the above, I make a patch file as fellows:

diff --git a/sys/dev/xen/netfront/netfront.c b/sys/dev/xen/netfront/netfront.c
index d89c0e0..903eb98 100644
--- a/sys/dev/xen/netfront/netfront.c
+++ b/sys/dev/xen/netfront/netfront.c
@@ -2172,6 +2172,46 @@ netfront_detach(device_t dev)
 }

 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)
+		device_printf(np->xbdev, "Unable to release %d of %d "
+			"inuse grant references out of %ld total.\n",
+			busy, inuse, NET_RX_RING_SIZE);
+	
+	XN_RX_UNLOCK(np);
+}
+
+static void
 netif_free(struct netfront_info *info)
 {
 	XN_LOCK(info);
@@ -2185,6 +2225,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


Yours Yingdong Liu


-----邮件原件-----
发件人: roger.pau@citrix.com [mailto:roger.pau@citrix.com]
发送时间: 2016年11月8日 21:05
收件人: Liuyingdong
抄送: freebsd-xen@freebsd.org; Zhaojun (Euler); Suoben
主题: Re: [PATCH]netfront: need release all resources after adding and removing NICs time and again

On Fri, Nov 04, 2016 at 07:43:41AM +0000, Liuyingdong wrote:
> 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"

Hello,

Thanks for the patch, although I'm not able to import it, git complain with:

patch: **** malformed patch at line 7: }

Could you please resend it using git send-email?

I also have a couple of comments below regarding style.

>
> Signed-off-by: Yingdong Liu<liuyingdong@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)
>        }
> }

Missing new line.

> +static void
netif_release_rx_bufs_copy(struct netfront_info *np)

This needs to be on a new line.

> +{
> +       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);

Please use device_printf for this instead of the function name. Also, could you align the string so it doesn't extend past 80 characters?

Roger.





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5825272C.3010704>