Date: Fri, 10 Dec 2010 13:40:11 GMT From: Andrew Kolchoogin <gadm@avalon-island.ru> To: freebsd-xen@FreeBSD.org Subject: Re: kern/143340: [xen] FreeBSD 8-RELEASE XEN pvm networking doesn't work on solaris dom0's Message-ID: <201012101340.oBADeBnn022489@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/143340; it has been noted by GNATS. From: Andrew Kolchoogin <gadm@avalon-island.ru> To: bug-followup@FreeBSD.org, wonslung@gmail.com Cc: Subject: Re: kern/143340: [xen] FreeBSD 8-RELEASE XEN pvm networking doesn't work on solaris dom0's Date: Fri, 10 Dec 2010 16:05:50 +0300 Dear colleagues, this is the correct patch resolving the problem: =3D=3D=3D --- sys/dev/xen/netfront/netfront.c.orig 2010-12-10 12:59:03.000000000 +000= 0 +++ sys/dev/xen/netfront/netfront.c 2010-12-10 12:31:01.000000000 +0000 @@ -258,6 +258,7 @@ u_int irq; u_int copying_receiver; u_int carrier; + u_int sg_allowed; =09 /* Receive-ring batched refills. */ #define RX_MIN_TARGET 32 @@ -1499,7 +1500,7 @@ * deal with nfrags > MAX_TX_REQ_FRAGS, which is a quirk of * the Linux network stack. */ - if (nfrags > MAX_TX_REQ_FRAGS) { + if (nfrags > (sc->sg_allowed? MAX_TX_REQ_FRAGS : 1)) { m =3D m_defrag(m_head, M_DONTWAIT); if (!m) { /* @@ -1878,6 +1879,37 @@ if_link_state_change(ifp, LINK_STATE_DOWN); } +static void +xennet_set_features(device_t dev, struct netfront_info *np) +{ + struct ifnet *ifp; + int val; + + device_printf(dev, "backend features:"); + + if (xs_scanf(XST_NIL, xenbus_get_otherend_path(np->xbdev), "feature-sg", NULL, "%d", &val) < 0) + val =3D 0; + + np->sg_allowed =3D val; + + if (val) + printf(" feature-sg"); + + if (xs_scanf(XST_NIL, xenbus_get_otherend_path(np->xbdev), "feature-gso-tcpv4", NULL, "%d", &val) < 0) + val =3D 0; + + if (val =3D=3D 0) { + ifp =3D np->xn_ifp; + ifp->if_capabilities &=3D ~(IFCAP_TSO4|IFCAP_LRO); + ifp->if_capenable &=3D ~(IFCAP_TSO4|IFCAP_LRO); + ifp->if_hwassist &=3D ~(CSUM_TSO); + xn_enable_lro =3D 0; + } else + printf(" feature-gso-tcp4"); + + printf("\n"); +} + /* START of Xenolinux helper functions adapted to FreeBSD */ int network_connect(struct netfront_info *np) @@ -1909,6 +1941,8 @@ if (error) return (error); =09 + xennet_set_features(np->xbdev, np); + /* Step 1: Reinitialise variables. */ netif_release_tx_bufs(np); =3D=3D=3D I've tested it on my system -- Solaris 11 Express 2010.11 + FreeBSD v8.2-BETA1 in paravirtualised mode. All is working as designed, I'm able at least to ssh into Guest and csup entire source tree. --=20 =C2=A0 =C2=A0 Yours =C2=A0 =C2=A0 =C2=A0 =C2=A0 Andrew Kolchoogin.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201012101340.oBADeBnn022489>