From 5f82fbca88963f2a87ef0cff1d889e09ae79b99d Mon Sep 17 00:00:00 2001 From: Hasso Tepper Date: Sat, 4 Oct 2008 09:57:14 +0000 Subject: [PATCH 01/16] How buggy this little piece of code could be? Repair strnvis() buffersize of 4*n+1, with termination gauranteed by the function. Obtained-from: OpenBSD --- crypto/openssh-5/sshconnect2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/openssh-5/sshconnect2.c b/crypto/openssh-5/sshconnect2.c index 868f26931a..f6405922f0 100644 --- a/crypto/openssh-5/sshconnect2.c +++ b/crypto/openssh-5/sshconnect2.c @@ -386,8 +386,8 @@ input_userauth_banner(int type, u_int32_t seq, void *ctxt) if (len > 0 && options.log_level >= SYSLOG_LEVEL_INFO) { if (len > 65536) len = 65536; - msg = xmalloc(len * 4); /* max expansion from strnvis() */ - strnvis(msg, raw, len * 4, VIS_SAFE|VIS_OCTAL); + msg = xmalloc(len * 4 + 1); /* max expansion from strnvis() */ + strnvis(msg, raw, len * 4 + 1, VIS_SAFE|VIS_OCTAL); fprintf(stderr, "%s", msg); xfree(msg); } -- 2.41.0 From 089dc1b72138e0e2b92e1433079b5fb09e6711e9 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sat, 4 Oct 2008 10:36:21 +0000 Subject: [PATCH 02/16] - For relative newer parts (8168B), setting MTPS (max transmit packet size) according to MTU makes jumbo frame + TX csum offloading work. However, for old ones (8169), setting MTPS does not have much effect. - Reduce max jumbo frame size from 9018 to 7440 (according to DS) - Fix MTU setting in re_ioctl --- sys/dev/netif/re/if_re.c | 85 ++++++++++++++++++++++++++----------- sys/dev/netif/re/if_rereg.h | 6 ++- sys/dev/netif/re/if_revar.h | 8 ++-- 3 files changed, 68 insertions(+), 31 deletions(-) diff --git a/sys/dev/netif/re/if_re.c b/sys/dev/netif/re/if_re.c index f5b953822c..b05c8fa980 100644 --- a/sys/dev/netif/re/if_re.c +++ b/sys/dev/netif/re/if_re.c @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/re/if_re.c,v 1.25 2004/06/09 14:34:01 naddy Exp $ - * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.60 2008/10/03 14:14:10 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.61 2008/10/04 10:36:21 sephe Exp $ */ /* @@ -202,22 +202,46 @@ static const struct re_type re_devs[] = { }; static const struct re_hwrev re_hwrevs[] = { - { RE_HWREV_8139CPLUS, RE_8139CPLUS, RE_F_HASMPC, 0, "C+" }, - { RE_HWREV_8168_SPIN1, RE_8169, RE_F_PCIE, 0, "8168" }, - { RE_HWREV_8168_SPIN2, RE_8169, - RE_F_PCIE | RE_F_JUMBO_SWCSUM, RE_SWCSUM_LIM_8168B, "8168" }, - { RE_HWREV_8168_SPIN3, RE_8169, RE_F_PCIE, 0, "8168" }, - { RE_HWREV_8168C, RE_8169, RE_F_PCIE, 0, "8168C" }, - { RE_HWREV_8169, RE_8169, - RE_F_HASMPC | RE_F_JUMBO_SWCSUM, RE_SWCSUM_LIM_8169, "8169" }, - { RE_HWREV_8169S, RE_8169, RE_F_HASMPC, 0, "8169S" }, - { RE_HWREV_8110S, RE_8169, RE_F_HASMPC, 0, "8110S" }, - { RE_HWREV_8169_8110SB, RE_8169, RE_F_HASMPC, 0, "8169SB" }, - { RE_HWREV_8169_8110SC, RE_8169, 0, 0, "8169SC" }, - { RE_HWREV_8100E, RE_8169, RE_F_HASMPC, 0, "8100E" }, - { RE_HWREV_8101E, RE_8169, RE_F_PCIE, 0, "8101E" }, - { RE_HWREV_8102EL, RE_8169, RE_F_PCIE, 0, "8102EL" }, - { 0, 0, 0, 0, NULL } + { RE_HWREV_8139CPLUS, RE_8139CPLUS, RE_F_HASMPC, + ETHERMTU, ETHERMTU }, + + { RE_HWREV_8168_SPIN1, RE_8169, RE_F_PCIE, + RE_JUMBO_MTU, RE_JUMBO_MTU }, + + { RE_HWREV_8168_SPIN2, RE_8169, RE_F_PCIE, + RE_JUMBO_MTU, RE_JUMBO_MTU }, + + { RE_HWREV_8168_SPIN3, RE_8169, RE_F_PCIE, + RE_JUMBO_MTU, RE_JUMBO_MTU }, + + { RE_HWREV_8168C, RE_8169, RE_F_PCIE, + RE_JUMBO_MTU, RE_JUMBO_MTU }, + + { RE_HWREV_8169, RE_8169, RE_F_HASMPC, + RE_SWCSUM_LIM_8169, RE_JUMBO_MTU }, + + { RE_HWREV_8169S, RE_8169, RE_F_HASMPC, + RE_JUMBO_MTU, RE_JUMBO_MTU }, + + { RE_HWREV_8110S, RE_8169, RE_F_HASMPC, + RE_JUMBO_MTU, RE_JUMBO_MTU }, + + { RE_HWREV_8169_8110SB, RE_8169, RE_F_HASMPC, + RE_JUMBO_MTU, RE_JUMBO_MTU }, + + { RE_HWREV_8169_8110SC, RE_8169, 0, + RE_JUMBO_MTU, RE_JUMBO_MTU }, + + { RE_HWREV_8100E, RE_8169, RE_F_HASMPC, + ETHERMTU, ETHERMTU }, + + { RE_HWREV_8101E, RE_8169, RE_F_PCIE, + ETHERMTU, ETHERMTU }, + + { RE_HWREV_8102EL, RE_8169, RE_F_PCIE, + ETHERMTU, ETHERMTU }, + + { 0, 0, 0, 0, 0 } }; static int re_probe(device_t); @@ -1234,11 +1258,13 @@ re_attach(device_t dev) re_reset(sc); hwrev = CSR_READ_4(sc, RE_TXCFG) & RE_TXCFG_HWREV; - for (hw_rev = re_hwrevs; hw_rev->re_desc != NULL; hw_rev++) { + for (hw_rev = re_hwrevs; hw_rev->re_type != 0; hw_rev++) { if (hw_rev->re_rev == hwrev) { + sc->re_hwrev = hwrev; sc->re_type = hw_rev->re_type; sc->re_flags = hw_rev->re_flags; sc->re_swcsum_lim = hw_rev->re_swcsum_lim; + sc->re_maxmtu = hw_rev->re_maxmtu; break; } } @@ -1283,7 +1309,6 @@ re_attach(device_t dev) ifp = &sc->arpcom.ac_if; ifp->if_softc = sc; if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - ifp->if_mtu = ETHERMTU; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = re_ioctl; ifp->if_start = re_start; @@ -1942,8 +1967,7 @@ re_encap(struct re_softc *sc, struct mbuf **m_head, int *idx0) csum_flags |= RE_TDESC_CMD_UDPCSUM; if (m->m_pkthdr.len > sc->re_swcsum_lim && - (m->m_pkthdr.csum_flags & (CSUM_DELAY_IP | CSUM_DELAY_DATA)) && - (sc->re_flags & RE_F_JUMBO_SWCSUM)) { + (m->m_pkthdr.csum_flags & (CSUM_DELAY_IP | CSUM_DELAY_DATA))) { struct ether_header *eh; struct ip *ip; u_short offset; @@ -2228,7 +2252,7 @@ re_init(void *xsc) struct ifnet *ifp = &sc->arpcom.ac_if; struct mii_data *mii; uint32_t rxcfg = 0; - int error; + int error, framelen; ASSERT_SERIALIZED(ifp->if_serializer); @@ -2306,7 +2330,13 @@ re_init(void *xsc) } else CSR_WRITE_4(sc, RE_TXCFG, RE_TXCFG_CONFIG); - CSR_WRITE_1(sc, RE_EARLY_TX_THRESH, 16); + framelen = RE_FRAMELEN(ifp->if_mtu); + if (framelen < RE_FRAMELEN_2K) { + CSR_WRITE_1(sc, RE_EARLY_TX_THRESH, + howmany(RE_FRAMELEN_2K, 128)); + } else { + CSR_WRITE_1(sc, RE_EARLY_TX_THRESH, howmany(framelen, 128)); + } CSR_WRITE_4(sc, RE_RXCFG, RE_RXCFG_CONFIG); @@ -2450,10 +2480,15 @@ re_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr) switch(command) { case SIOCSIFMTU: - if (ifr->ifr_mtu > RE_JUMBO_MTU) + if (ifr->ifr_mtu > sc->re_maxmtu) { error = EINVAL; - ifp->if_mtu = ifr->ifr_mtu; + } else if (ifp->if_mtu != ifr->ifr_mtu) { + ifp->if_mtu = ifr->ifr_mtu; + if (ifp->if_flags & IFF_RUNNING) + ifp->if_init(sc); + } break; + case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) re_init(sc); diff --git a/sys/dev/netif/re/if_rereg.h b/sys/dev/netif/re/if_rereg.h index 5cc1abe357..a132999bee 100644 --- a/sys/dev/netif/re/if_rereg.h +++ b/sys/dev/netif/re/if_rereg.h @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ - * $DragonFly: src/sys/dev/netif/re/if_rereg.h,v 1.10 2008/09/29 20:27:38 dillon Exp $ + * $DragonFly: src/sys/dev/netif/re/if_rereg.h,v 1.11 2008/10/04 10:36:21 sephe Exp $ */ /* @@ -563,8 +563,10 @@ struct re_stats { #define RE_ADDR_LO(y) ((uint64_t) (y) & 0xFFFFFFFF) #define RE_ADDR_HI(y) ((uint64_t) (y) >> 32) -#define RE_JUMBO_FRAMELEN 9018 +#define RE_JUMBO_FRAMELEN 7440 #define RE_JUMBO_MTU (RE_JUMBO_FRAMELEN-ETHER_HDR_LEN-ETHER_CRC_LEN) +#define RE_FRAMELEN_2K 2048 +#define RE_FRAMELEN(mtu) (mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) #define RE_TIMEOUT 1000 diff --git a/sys/dev/netif/re/if_revar.h b/sys/dev/netif/re/if_revar.h index d5dbe61190..101097abcc 100644 --- a/sys/dev/netif/re/if_revar.h +++ b/sys/dev/netif/re/if_revar.h @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ - * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.7 2008/10/03 14:07:02 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.8 2008/10/04 10:36:21 sephe Exp $ */ struct re_chain_data { @@ -70,7 +70,7 @@ struct re_hwrev { int re_type; /* RE_{8139CPLUS,8169} */ uint32_t re_flags; /* see RE_F_ */ int re_swcsum_lim; - const char *re_desc; + int re_maxmtu; }; #define RE_8139CPLUS 3 @@ -128,6 +128,7 @@ struct re_softc { int re_eecmd_read; uint8_t re_stats_no_timeout; int re_txthresh; + uint32_t re_hwrev; struct re_chain_data re_cdata; struct re_list_data re_ldata; struct callout re_timer; @@ -142,6 +143,7 @@ struct re_softc { int re_link; int re_eewidth; int re_swcsum_lim; + int re_maxmtu; #ifdef DEVICE_POLLING int rxcycles; #endif @@ -162,10 +164,8 @@ struct re_softc { #define RE_F_HASMPC 0x1 #define RE_F_PCIE 0x2 -#define RE_F_JUMBO_SWCSUM 0x4 #define RE_SWCSUM_LIM_8169 2038 -#define RE_SWCSUM_LIM_8168B 2082 #define RE_TX_MODERATION_IS_ENABLED(sc) \ ((sc)->re_tx_ack == RE_ISR_TIMEOUT_EXPIRED) -- 2.41.0 From 82c6f048340d9efd4c6d7a56eb3ded220982e7cc Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sat, 4 Oct 2008 11:21:10 +0000 Subject: [PATCH 03/16] Recheck ifnet.if_bpf after we hold the BGL --- sys/net/if_loop.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c index 0bf18d2451..6136d91d58 100644 --- a/sys/net/if_loop.c +++ b/sys/net/if_loop.c @@ -32,7 +32,7 @@ * * @(#)if_loop.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/net/if_loop.c,v 1.47.2.9 2004/02/08 08:40:24 silby Exp $ - * $DragonFly: src/sys/net/if_loop.c,v 1.25 2008/09/06 06:09:42 sephe Exp $ + * $DragonFly: src/sys/net/if_loop.c,v 1.26 2008/10/04 11:21:10 sephe Exp $ */ /* @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -209,13 +210,20 @@ if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen) } if (ifp->if_bpf) { + get_mplock(); + + /* Re-check */ + if (ifp->if_bpf == NULL) + goto rel; + if (ifp->if_bpf->bif_dlt == DLT_NULL) { uint32_t bpf_af = (uint32_t)af; bpf_ptap(ifp->if_bpf, m, &bpf_af, 4); - } - else { + } else { bpf_mtap(ifp->if_bpf, m); } +rel: + rel_mplock(); } /* Strip away media header */ -- 2.41.0 From ff54734ef3198ff41d779a6c3ef622610dc21156 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sat, 4 Oct 2008 11:24:37 +0000 Subject: [PATCH 04/16] On ethernet output path: Hold BGL on IPX, ATALK, CARP and netgraph --- sys/net/if_ethersubr.c | 71 ++++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index 00279a6af9..d13b0f8c45 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -32,7 +32,7 @@ * * @(#)if_ethersubr.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/net/if_ethersubr.c,v 1.70.2.33 2003/04/28 15:45:53 archie Exp $ - * $DragonFly: src/sys/net/if_ethersubr.c,v 1.93 2008/09/24 11:14:43 sephe Exp $ + * $DragonFly: src/sys/net/if_ethersubr.c,v 1.94 2008/10/04 11:24:37 sephe Exp $ */ #include "opt_atalk.h" @@ -236,23 +236,38 @@ ether_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, #ifdef IPX case AF_IPX: if (ef_outputp != NULL) { - error = ef_outputp(ifp, &m, dst, &eh->ether_type, - &hlen); - if (error) - goto bad; - } else { - eh->ether_type = htons(ETHERTYPE_IPX); - bcopy(&(((struct sockaddr_ipx *)dst)->sipx_addr.x_host), - edst, ETHER_ADDR_LEN); + /* + * Hold BGL and recheck ef_outputp + */ + get_mplock(); + if (ef_outputp != NULL) { + error = ef_outputp(ifp, &m, dst, + &eh->ether_type, &hlen); + rel_mplock(); + if (error) + goto bad; + else + break; + } + rel_mplock(); } + eh->ether_type = htons(ETHERTYPE_IPX); + bcopy(&(((struct sockaddr_ipx *)dst)->sipx_addr.x_host), + edst, ETHER_ADDR_LEN); break; #endif #ifdef NETATALK case AF_APPLETALK: { struct at_ifaddr *aa; + /* + * Hold BGL + */ + get_mplock(); + if ((aa = at_ifawithnet((struct sockaddr_at *)dst)) == NULL) { error = 0; /* XXX */ + rel_mplock(); goto bad; } /* @@ -280,8 +295,12 @@ ether_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, } else { eh->ether_type = htons(ETHERTYPE_AT); } - if (!aarpresolve(ac, m, (struct sockaddr_at *)dst, edst)) + if (!aarpresolve(ac, m, (struct sockaddr_at *)dst, edst)) { + rel_mplock(); return (0); + } + + rel_mplock(); break; } #endif @@ -389,17 +408,37 @@ ether_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, } #ifdef CARP - if (ifp->if_carp && (error = carp_output(ifp, m, dst, NULL))) - goto bad; + if (ifp->if_carp) { + /* + * Hold BGL and recheck ifp->if_carp + */ + get_mplock(); + if (ifp->if_carp && (error = carp_output(ifp, m, dst, NULL))) { + rel_mplock(); + goto bad; + } + rel_mplock(); + } #endif /* Handle ng_ether(4) processing, if any */ if (ng_ether_output_p != NULL) { - if ((error = (*ng_ether_output_p)(ifp, &m)) != 0) - goto bad; - if (m == NULL) - return (0); + /* + * Hold BGL and recheck ng_ether_output_p + */ + get_mplock(); + if (ng_ether_output_p != NULL) { + if ((error = ng_ether_output_p(ifp, &m)) != 0) { + rel_mplock(); + goto bad; + } + if (m == NULL) { + rel_mplock(); + return (0); + } + } + rel_mplock(); } /* Continue with link-layer output */ -- 2.41.0 From ed2327fe3c9b9278f878a98f25e2008ece365167 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sat, 4 Oct 2008 11:26:09 +0000 Subject: [PATCH 05/16] - Add tunable (net.link.ether.inet.arp_mpsafe) to register ARP as MPSAFE netisr. - Hold BGL on CARP in arp input path. --- sys/netinet/if_ether.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index d30f2bf875..f009bb157c 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -64,7 +64,7 @@ * * @(#)if_ether.c 8.1 (Berkeley) 6/10/93 * $FreeBSD: src/sys/netinet/if_ether.c,v 1.64.2.23 2003/04/11 07:23:15 fjoe Exp $ - * $DragonFly: src/sys/netinet/if_ether.c,v 1.55 2008/10/01 09:16:18 sephe Exp $ + * $DragonFly: src/sys/netinet/if_ether.c,v 1.56 2008/10/04 11:26:09 sephe Exp $ */ /* @@ -146,6 +146,9 @@ SYSCTL_INT(_net_link_ether_inet, OID_AUTO, useloopback, CTLFLAG_RW, SYSCTL_INT(_net_link_ether_inet, OID_AUTO, proxyall, CTLFLAG_RW, &arp_proxyall, 0, ""); +static int arp_mpsafe = 0; +TUNABLE_INT("net.link.ether.inet.arp_mpsafe", &arp_mpsafe); + static void arp_rtrequest(int, struct rtentry *, struct rt_addrinfo *); static void arprequest(struct ifnet *, struct in_addr *, struct in_addr *, const u_char *); @@ -770,10 +773,15 @@ in_arpinput(struct mbuf *m) * request for the virtual host ip. * XXX: This is really ugly! */ - if (ifp->if_carp != NULL && - carp_iamatch(ifp->if_carp, ia, &isaddr, &enaddr) && - itaddr.s_addr == ia->ia_addr.sin_addr.s_addr) - goto match; + if (ifp->if_carp != NULL) { + get_mplock(); + if (ifp->if_carp != NULL && + carp_iamatch(ifp->if_carp, ia, &isaddr, &enaddr)) { + rel_mplock(); + goto match; + } + rel_mplock(); + } #endif } LIST_FOREACH(iac, INADDR_HASH(isaddr.s_addr), ia_hash) { @@ -1036,12 +1044,19 @@ arp_ifinit2(struct ifnet *ifp, struct ifaddr *ifa, u_char *enaddr) static void arp_init(void) { + uint32_t flags; int cpu; for (cpu = 0; cpu < ncpus2; cpu++) LIST_INIT(&llinfo_arp_list[cpu]); - netisr_register(NETISR_ARP, cpu0_portfn, arpintr, - NETISR_FLAG_NOTMPSAFE); + + if (arp_mpsafe) { + flags = NETISR_FLAG_MPSAFE; + kprintf("arp: MPSAFE\n"); + } else { + flags = NETISR_FLAG_NOTMPSAFE; + } + netisr_register(NETISR_ARP, cpu0_portfn, arpintr, flags); } SYSINIT(arp, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY, arp_init, 0); -- 2.41.0 From 7e0d629cc6758419ff02992a47c62a639c71c56b Mon Sep 17 00:00:00 2001 From: Sascha Wildner Date: Sat, 4 Oct 2008 14:22:44 +0000 Subject: [PATCH 06/16] Silence warning on UP build with KTR. --- sys/kern/lwkt_serialize.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sys/kern/lwkt_serialize.c b/sys/kern/lwkt_serialize.c index e4df821a9f..f63e1bb77d 100644 --- a/sys/kern/lwkt_serialize.c +++ b/sys/kern/lwkt_serialize.c @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/kern/lwkt_serialize.c,v 1.17 2008/05/24 12:52:49 sephe Exp $ + * $DragonFly: src/sys/kern/lwkt_serialize.c,v 1.18 2008/10/04 14:22:44 swildner Exp $ */ /* * This API provides a fast locked-bus-cycle-based serializer. It's @@ -86,13 +86,17 @@ KTR_INFO(KTR_SERIALIZER, slz, wakeup_end, 5, SLZ_KTR_STRING, SLZ_KTR_ARG_SIZE); KTR_INFO(KTR_SERIALIZER, slz, try, 6, SLZ_KTR_STRING, SLZ_KTR_ARG_SIZE); KTR_INFO(KTR_SERIALIZER, slz, tryfail, 7, SLZ_KTR_STRING, SLZ_KTR_ARG_SIZE); KTR_INFO(KTR_SERIALIZER, slz, tryok, 8, SLZ_KTR_STRING, SLZ_KTR_ARG_SIZE); +#ifdef SMP KTR_INFO(KTR_SERIALIZER, slz, spinbo, 9, "slz=%p bo1=%d bo=%d", (sizeof(void *) + (2 * sizeof(int)))); +#endif KTR_INFO(KTR_SERIALIZER, slz, enter_end, 10, SLZ_KTR_STRING, SLZ_KTR_ARG_SIZE); KTR_INFO(KTR_SERIALIZER, slz, exit_beg, 11, SLZ_KTR_STRING, SLZ_KTR_ARG_SIZE); #define logslz(name, slz) KTR_LOG(slz_ ## name, slz) +#ifdef SMP #define logslz_spinbo(slz, bo1, bo) KTR_LOG(slz_spinbo, slz, bo1, bo) +#endif static void lwkt_serialize_sleep(void *info); static void lwkt_serialize_wakeup(void *info); -- 2.41.0 From 3876068d806e26b7246510ae872151cf7683bb20 Mon Sep 17 00:00:00 2001 From: Sascha Wildner Date: Sat, 4 Oct 2008 22:09:17 +0000 Subject: [PATCH 07/16] * Constify return type of gai_strerror() as per bwg2001-009 (see http://www.opengroup.org/platform/resolutions/bwg2001-many.html). * Return EAI_OVERFLOW instead of EAI_MEMORY when the supplied buffer is too short. This conforms to RFC 3493, POSIX and XPG6. * Add a gai_strerror(3) manual page. Taken-from: FreeBSD --- include/netdb.h | 11 ++-- lib/libc/net/Makefile.inc | 6 +-- lib/libc/net/gai_strerror.3 | 100 ++++++++++++++++++++++++++++++++++++ lib/libc/net/getaddrinfo.c | 7 +-- lib/libc/net/getnameinfo.c | 8 +-- 5 files changed, 117 insertions(+), 15 deletions(-) create mode 100644 lib/libc/net/gai_strerror.3 diff --git a/include/netdb.h b/include/netdb.h index 0010b7ad3f..7124aff739 100644 --- a/include/netdb.h +++ b/include/netdb.h @@ -56,7 +56,7 @@ * @(#)netdb.h 8.1 (Berkeley) 6/2/93 * From: Id: netdb.h,v 8.9 1996/11/19 08:39:29 vixie Exp $ * $FreeBSD: src/include/netdb.h,v 1.14.2.5 2001/08/29 08:46:51 alfred Exp $ - * $DragonFly: src/include/netdb.h,v 1.6 2008/05/22 06:50:14 hasso Exp $ + * $DragonFly: src/include/netdb.h,v 1.7 2008/10/04 22:09:16 swildner Exp $ */ #ifndef _NETDB_H_ @@ -163,9 +163,10 @@ struct addrinfo { #define EAI_SERVICE 9 /* servname not supported for ai_socktype */ #define EAI_SOCKTYPE 10 /* ai_socktype not supported */ #define EAI_SYSTEM 11 /* system error returned in errno */ -#define EAI_BADHINTS 12 -#define EAI_PROTOCOL 13 -#define EAI_MAX 14 +#define EAI_BADHINTS 12 /* invalid value for hints */ +#define EAI_PROTOCOL 13 /* resolved protocol is unknown */ +#define EAI_OVERFLOW 14 /* argument buffer overflow */ +#define EAI_MAX 15 /* * Flag values for getaddrinfo() @@ -247,7 +248,7 @@ int getaddrinfo (const char *, const char *, int getnameinfo (const struct sockaddr *, socklen_t, char *, size_t, char *, size_t, int); void freeaddrinfo (struct addrinfo *); -char *gai_strerror (int); +const char *gai_strerror (int); void setnetgrent (const char *); void setservent (int); diff --git a/lib/libc/net/Makefile.inc b/lib/libc/net/Makefile.inc index 1a0edd8e8d..8c575fc17d 100644 --- a/lib/libc/net/Makefile.inc +++ b/lib/libc/net/Makefile.inc @@ -1,6 +1,6 @@ # from @(#)Makefile.inc 8.2 (Berkeley) 9/5/93 # $FreeBSD: src/lib/libc/net/Makefile.inc,v 1.36.2.5 2002/07/29 18:33:18 ume Exp $ -# $DragonFly: src/lib/libc/net/Makefile.inc,v 1.5 2008/09/04 09:08:21 hasso Exp $ +# $DragonFly: src/lib/libc/net/Makefile.inc,v 1.6 2008/10/04 22:09:17 swildner Exp $ # machine-independent net sources .PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/net ${.CURDIR}/../libc/net @@ -29,7 +29,7 @@ CFLAGS+=-DINET6 .if ${LIB} == "c" MAN+= addr2ascii.3 byteorder.3 ethers.3 eui64.3 \ - getaddrinfo.3 gethostbyname.3 \ + gai_strerror.3 getaddrinfo.3 gethostbyname.3 \ getifaddrs.3 getipnodebyname.3 \ getnameinfo.3 getnetent.3 getprotoent.3 getservent.3 if_indextoname.3 \ inet.3 inet_net.3 \ @@ -45,7 +45,7 @@ MLINKS+=ethers.3 ether_aton.3 ethers.3 ether_hostton.3 ethers.3 ether_line.3 \ ethers.3 ether_ntoa.3 ethers.3 ether_ntohost.3 MLINKS+=eui64.3 eui64_aton.3 eui64.3 eui64_hostton.3 eui64.3 eui64_ntoa.3 \ eui64.3 eui64_ntohost.3 -MLINKS+=getaddrinfo.3 freeaddrinfo.3 getaddrinfo.3 gai_strerror.3 +MLINKS+=getaddrinfo.3 freeaddrinfo.3 MLINKS+=gethostbyname.3 endhostent.3 gethostbyname.3 gethostbyaddr.3 \ gethostbyname.3 gethostbyname2.3 gethostbyname.3 gethostent.3 \ gethostbyname.3 herror.3 gethostbyname.3 hstrerror.3 \ diff --git a/lib/libc/net/gai_strerror.3 b/lib/libc/net/gai_strerror.3 new file mode 100644 index 0000000000..a557af5761 --- /dev/null +++ b/lib/libc/net/gai_strerror.3 @@ -0,0 +1,100 @@ +.\" $KAME: gai_strerror.3,v 1.1 2005/01/05 03:04:47 itojun Exp $ +.\" $OpenBSD: gai_strerror.3,v 1.4 2004/12/20 23:04:53 millert Exp $ +.\" +.\" Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") +.\" Copyright (C) 2000, 2001 Internet Software Consortium. +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +.\" AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +.\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +.\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +.\" PERFORMANCE OF THIS SOFTWARE. +.\" +.\" $FreeBSD: src/lib/libc/net/gai_strerror.3,v 1.5 2006/09/17 21:27:33 ru Exp $ +.\" $DragonFly: src/lib/libc/net/gai_strerror.3,v 1.1 2008/10/04 22:09:17 swildner Exp $ +.\" +.Dd October 4, 2008 +.Dt GAI_STRERROR 3 +.Os +.Sh NAME +.Nm gai_strerror +.Nd get error message string from EAI_xxx error code +.Sh SYNOPSIS +.In sys/types.h +.In sys/socket.h +.In netdb.h +.Ft "const char *" +.Fn gai_strerror "int ecode" +.Sh DESCRIPTION +The +.Fn gai_strerror +function returns an error message string corresponding to the error code +returned by +.Xr getaddrinfo 3 +or +.Xr getnameinfo 3 . +.Pp +The following error codes and their meaning are defined in +.In netdb.h : +.Pp +.Bl -tag -width ".Dv EAI_ADDRFAMILY" -offset indent -compact +.It Dv EAI_ADDRFAMILY +address family for +.Fa hostname +not supported +.It Dv EAI_AGAIN +temporary failure in name resolution +.It Dv EAI_BADFLAGS +invalid value for +.Fa ai_flags +.It Dv EAI_BADHINTS +invalid value for +.Fa hints +.It Dv EAI_FAIL +non-recoverable failure in name resolution +.It Dv EAI_FAMILY +.Fa ai_family +not supported +.It Dv EAI_MEMORY +memory allocation failure +.It Dv EAI_NODATA +no address associated with +.Fa hostname +.It Dv EAI_NONAME +.Fa hostname +or +.Fa servname +not provided, or not known +.It Dv EAI_OVERFLOW +argument buffer overflow +.It Dv EAI_PROTOCOL +resolved protocol is unknown +.It Dv EAI_SERVICE +.Fa servname +not supported for +.Fa ai_socktype +.It Dv EAI_SOCKTYPE +.Fa ai_socktype +not supported +.It Dv EAI_SYSTEM +system error returned in +.Va errno +.El +.Sh RETURN VALUES +The +.Fn gai_strerror +function +returns a pointer to the error message string corresponding to +.Fa ecode . +If +.Fa ecode +is out of range, an implementation-specific error message string is returned. +.Sh SEE ALSO +.Xr getaddrinfo 3 , +.Xr getnameinfo 3 diff --git a/lib/libc/net/getaddrinfo.c b/lib/libc/net/getaddrinfo.c index 1dd833fb66..341aac7674 100644 --- a/lib/libc/net/getaddrinfo.c +++ b/lib/libc/net/getaddrinfo.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/lib/libc/net/getaddrinfo.c,v 1.9.2.14 2002/11/08 17:49:31 ume Exp $ */ -/* $DragonFly: src/lib/libc/net/getaddrinfo.c,v 1.7 2008/05/22 06:50:14 hasso Exp $ */ +/* $DragonFly: src/lib/libc/net/getaddrinfo.c,v 1.8 2008/10/04 22:09:17 swildner Exp $ */ /* $KAME: getaddrinfo.c,v 1.15 2000/07/09 04:37:24 itojun Exp $ */ /* @@ -225,7 +225,7 @@ static int res_searchN (const char *, struct res_target *); static int res_querydomainN (const char *, const char *, struct res_target *); -static char *ai_errlist[] = { +static const char *ai_errlist[] = { "Success", "Address family for hostname not supported", /* EAI_ADDRFAMILY */ "Temporary failure in name resolution", /* EAI_AGAIN */ @@ -240,6 +240,7 @@ static char *ai_errlist[] = { "System error returned in errno", /* EAI_SYSTEM */ "Invalid value for hints", /* EAI_BADHINTS */ "Resolved protocol is unknown", /* EAI_PROTOCOL */ + "Argument buffer overflow", /* EAI_OVERFLOW */ "Unknown error", /* EAI_MAX */ }; @@ -325,7 +326,7 @@ do { \ #define MATCH(x, y, w) \ ((x) == (y) || (/*CONSTCOND*/(w) && ((x) == ANY || (y) == ANY))) -char * +const char * gai_strerror(int ecode) { if (ecode < 0 || ecode > EAI_MAX) diff --git a/lib/libc/net/getnameinfo.c b/lib/libc/net/getnameinfo.c index 19fed7385c..f4b2c47d3d 100644 --- a/lib/libc/net/getnameinfo.c +++ b/lib/libc/net/getnameinfo.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/lib/libc/net/getnameinfo.c,v 1.4.2.5 2002/07/31 10:11:09 ume Exp $ */ -/* $DragonFly: src/lib/libc/net/getnameinfo.c,v 1.4 2005/11/13 02:04:47 swildner Exp $ */ +/* $DragonFly: src/lib/libc/net/getnameinfo.c,v 1.5 2008/10/04 22:09:17 swildner Exp $ */ /* $KAME: getnameinfo.c,v 1.61 2002/06/27 09:25:47 itojun Exp $ */ /* @@ -281,7 +281,7 @@ ip6_parsenumeric(const struct sockaddr *sa, const char *addr, char *host, numaddrlen = strlen(numaddr); if (numaddrlen + 1 > hostlen) /* don't forget terminator */ - return EAI_MEMORY; + return EAI_OVERFLOW; strlcpy(host, numaddr, hostlen); if (((const struct sockaddr_in6 *)sa)->sin6_scope_id) { @@ -292,9 +292,9 @@ ip6_parsenumeric(const struct sockaddr *sa, const char *addr, char *host, (const struct sockaddr_in6 *)(const void *)sa, zonebuf, sizeof(zonebuf), flags); if (zonelen < 0) - return EAI_MEMORY; + return EAI_OVERFLOW; if (zonelen + 1 + numaddrlen + 1 > hostlen) - return EAI_MEMORY; + return EAI_OVERFLOW; /* construct */ memcpy(host + numaddrlen + 1, zonebuf, -- 2.41.0 From 8b184d097eaf17f2b9b9536da6e12562dffaea8d Mon Sep 17 00:00:00 2001 From: Sascha Wildner Date: Sat, 4 Oct 2008 22:36:25 +0000 Subject: [PATCH 08/16] Remove unnecessary .Pp --- sbin/devd/devd.conf.5 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sbin/devd/devd.conf.5 b/sbin/devd/devd.conf.5 index 25d3718d7e..76144bda91 100644 --- a/sbin/devd/devd.conf.5 +++ b/sbin/devd/devd.conf.5 @@ -23,7 +23,7 @@ .\" SUCH DAMAGE. .\" .\" $FreeBSD: src/sbin/devd/devd.conf.5,v 1.11 2006/10/24 20:20:41 ru Exp $ -.\" $DragonFly: src/sbin/devd/devd.conf.5,v 1.2 2008/10/03 10:30:43 swildner Exp $ +.\" $DragonFly: src/sbin/devd/devd.conf.5,v 1.3 2008/10/04 22:36:25 swildner Exp $ .\" .\" The section on comments was taken from named.conf.5, which has the .\" following copyright: @@ -95,7 +95,6 @@ In this way generic statements can be overridden for devices or notifications that require special attention. .Pp The general syntax of a statement is: -.Pp .Bd -literal -offset indent statement priority { substatement "value"; -- 2.41.0 From c8494fe307da3a213afef7f06b3f1ec6f64903a4 Mon Sep 17 00:00:00 2001 From: Sascha Wildner Date: Sat, 4 Oct 2008 22:38:42 +0000 Subject: [PATCH 09/16] Whitespace adjustment. --- lib/libc/net/getaddrinfo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/libc/net/getaddrinfo.c b/lib/libc/net/getaddrinfo.c index 341aac7674..a389aa176e 100644 --- a/lib/libc/net/getaddrinfo.c +++ b/lib/libc/net/getaddrinfo.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/lib/libc/net/getaddrinfo.c,v 1.9.2.14 2002/11/08 17:49:31 ume Exp $ */ -/* $DragonFly: src/lib/libc/net/getaddrinfo.c,v 1.8 2008/10/04 22:09:17 swildner Exp $ */ +/* $DragonFly: src/lib/libc/net/getaddrinfo.c,v 1.9 2008/10/04 22:38:42 swildner Exp $ */ /* $KAME: getaddrinfo.c,v 1.15 2000/07/09 04:37:24 itojun Exp $ */ /* @@ -240,7 +240,7 @@ static const char *ai_errlist[] = { "System error returned in errno", /* EAI_SYSTEM */ "Invalid value for hints", /* EAI_BADHINTS */ "Resolved protocol is unknown", /* EAI_PROTOCOL */ - "Argument buffer overflow", /* EAI_OVERFLOW */ + "Argument buffer overflow", /* EAI_OVERFLOW */ "Unknown error", /* EAI_MAX */ }; -- 2.41.0 From 687a3514c67ff7b7b95a5a82c5ba7ba2f763aeb2 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sun, 5 Oct 2008 01:43:09 +0000 Subject: [PATCH 10/16] re_chain_data is never used --- sys/dev/netif/re/if_revar.h | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/sys/dev/netif/re/if_revar.h b/sys/dev/netif/re/if_revar.h index 101097abcc..82fa52196c 100644 --- a/sys/dev/netif/re/if_revar.h +++ b/sys/dev/netif/re/if_revar.h @@ -33,31 +33,9 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ - * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.8 2008/10/04 10:36:21 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.9 2008/10/05 01:43:09 sephe Exp $ */ -struct re_chain_data { - uint16_t cur_rx; - caddr_t re_rx_buf; - caddr_t re_rx_buf_ptr; - bus_dmamap_t re_rx_dmamap; - - struct mbuf *re_tx_chain[RE_TX_LIST_CNT]; - bus_dmamap_t re_tx_dmamap[RE_TX_LIST_CNT]; - uint8_t last_tx; - uint8_t cur_tx; -}; - -#define RE_INC(x) (x = (x + 1) % RE_TX_LIST_CNT) -#define RE_CUR_TXADDR(x) ((x->re_cdata.cur_tx * 4) + RE_TXADDR0) -#define RE_CUR_TXSTAT(x) ((x->re_cdata.cur_tx * 4) + RE_TXSTAT0) -#define RE_CUR_TXMBUF(x) (x->re_cdata.re_tx_chain[x->re_cdata.cur_tx]) -#define RE_CUR_DMAMAP(x) (x->re_cdata.re_tx_dmamap[x->re_cdata.cur_tx]) -#define RE_LAST_TXADDR(x) ((x->re_cdata.last_tx * 4) + RE_TXADDR0) -#define RE_LAST_TXSTAT(x) ((x->re_cdata.last_tx * 4) + RE_TXSTAT0) -#define RE_LAST_TXMBUF(x) (x->re_cdata.re_tx_chain[x->re_cdata.last_tx]) -#define RE_LAST_DMAMAP(x) (x->re_cdata.re_tx_dmamap[x->re_cdata.last_tx]) - struct re_type { uint16_t re_vid; uint16_t re_did; @@ -129,7 +107,6 @@ struct re_softc { uint8_t re_stats_no_timeout; int re_txthresh; uint32_t re_hwrev; - struct re_chain_data re_cdata; struct re_list_data re_ldata; struct callout re_timer; struct mbuf *re_head; -- 2.41.0 From 998e707909b87a8e0986a01da5ea15da8778e864 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sun, 5 Oct 2008 01:53:41 +0000 Subject: [PATCH 11/16] Move some macros from if_rereg.h to if_revar.h; regroup them --- sys/dev/netif/re/if_rereg.h | 23 +---------------------- sys/dev/netif/re/if_revar.h | 35 ++++++++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/sys/dev/netif/re/if_rereg.h b/sys/dev/netif/re/if_rereg.h index a132999bee..ef7d799e7c 100644 --- a/sys/dev/netif/re/if_rereg.h +++ b/sys/dev/netif/re/if_rereg.h @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ - * $DragonFly: src/sys/dev/netif/re/if_rereg.h,v 1.11 2008/10/04 10:36:21 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_rereg.h,v 1.12 2008/10/05 01:53:41 sephe Exp $ */ /* @@ -549,27 +549,6 @@ struct re_stats { uint16_t re_rx_underruns; }; -#define RE_RX_DESC_CNT 64 -#define RE_TX_DESC_CNT 64 -#define RE_RX_LIST_SZ (RE_RX_DESC_CNT * sizeof(struct re_desc)) -#define RE_TX_LIST_SZ (RE_TX_DESC_CNT * sizeof(struct re_desc)) -#define RE_RING_ALIGN 256 -#define RE_IFQ_MAXLEN 512 -#define RE_DESC_INC(x) (x = (x + 1) % RE_TX_DESC_CNT) -#define RE_OWN(x) (le32toh((x)->re_cmdstat) & RE_RDESC_STAT_OWN) -#define RE_RXBYTES(x) (le32toh((x)->re_cmdstat) & sc->re_rxlenmask) -#define RE_PKTSZ(x) ((x)/* >> 3*/) - -#define RE_ADDR_LO(y) ((uint64_t) (y) & 0xFFFFFFFF) -#define RE_ADDR_HI(y) ((uint64_t) (y) >> 32) - -#define RE_JUMBO_FRAMELEN 7440 -#define RE_JUMBO_MTU (RE_JUMBO_FRAMELEN-ETHER_HDR_LEN-ETHER_CRC_LEN) -#define RE_FRAMELEN_2K 2048 -#define RE_FRAMELEN(mtu) (mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) - -#define RE_TIMEOUT 1000 - /* * General constants that are fun to know. * diff --git a/sys/dev/netif/re/if_revar.h b/sys/dev/netif/re/if_revar.h index 82fa52196c..28d5e4e08e 100644 --- a/sys/dev/netif/re/if_revar.h +++ b/sys/dev/netif/re/if_revar.h @@ -33,9 +33,34 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ - * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.9 2008/10/05 01:43:09 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.10 2008/10/05 01:53:41 sephe Exp $ */ +#define RE_RX_DESC_CNT 64 +#define RE_TX_DESC_CNT 64 +#define RE_RX_LIST_SZ (RE_RX_DESC_CNT * sizeof(struct re_desc)) +#define RE_TX_LIST_SZ (RE_TX_DESC_CNT * sizeof(struct re_desc)) +#define RE_RING_ALIGN 256 +#define RE_IFQ_MAXLEN 512 +#define RE_MAXSEGS 16 +#define RE_TXDESC_SPARE 4 + +#define RE_DESC_INC(x) (x = (x + 1) % RE_TX_DESC_CNT) +#define RE_OWN(x) (le32toh((x)->re_cmdstat) & RE_RDESC_STAT_OWN) +#define RE_RXBYTES(x) (le32toh((x)->re_cmdstat) & sc->re_rxlenmask) +#define RE_PKTSZ(x) ((x)/* >> 3*/) + +#define RE_ADDR_LO(y) ((uint64_t) (y) & 0xFFFFFFFF) +#define RE_ADDR_HI(y) ((uint64_t) (y) >> 32) + +#define RE_JUMBO_FRAMELEN 7440 +#define RE_JUMBO_MTU (RE_JUMBO_FRAMELEN-ETHER_HDR_LEN-ETHER_CRC_LEN) +#define RE_FRAMELEN_2K 2048 +#define RE_FRAMELEN(mtu) (mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) +#define RE_SWCSUM_LIM_8169 2038 + +#define RE_TIMEOUT 1000 + struct re_type { uint16_t re_vid; uint16_t re_did; @@ -54,10 +79,6 @@ struct re_hwrev { #define RE_8139CPLUS 3 #define RE_8169 4 -struct re_softc; - -#define RE_MAXSEGS 16 - struct re_dmaload_arg { int re_nsegs; bus_dma_segment_t *re_segs; @@ -142,8 +163,6 @@ struct re_softc { #define RE_F_HASMPC 0x1 #define RE_F_PCIE 0x2 -#define RE_SWCSUM_LIM_8169 2038 - #define RE_TX_MODERATION_IS_ENABLED(sc) \ ((sc)->re_tx_ack == RE_ISR_TIMEOUT_EXPIRED) @@ -180,5 +199,3 @@ struct re_softc { CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) | (val)) #define CSR_CLRBIT_1(sc, reg, val) \ CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) & ~(val)) - -#define RE_TXDESC_SPARE 4 -- 2.41.0 From 09d6afe5127d34eea15ff3527a7cdfdb873b272a Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sun, 5 Oct 2008 02:13:06 +0000 Subject: [PATCH 12/16] Don't assume that RE_RX_DESC_CNT and RE_TX_DESC_CNT are always same --- sys/dev/netif/re/if_re.c | 10 +++++----- sys/dev/netif/re/if_revar.h | 5 +++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/sys/dev/netif/re/if_re.c b/sys/dev/netif/re/if_re.c index b05c8fa980..0d0b2046ea 100644 --- a/sys/dev/netif/re/if_re.c +++ b/sys/dev/netif/re/if_re.c @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/re/if_re.c,v 1.25 2004/06/09 14:34:01 naddy Exp $ - * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.61 2008/10/04 10:36:21 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.62 2008/10/05 02:13:06 sephe Exp $ */ /* @@ -1586,7 +1586,7 @@ re_rxeof(struct re_softc *sc) ether_input_chain_init(chain); for (i = sc->re_ldata.re_rx_prodidx; - RE_OWN(&sc->re_ldata.re_rx_list[i]) == 0; RE_DESC_INC(i)) { + RE_OWN(&sc->re_ldata.re_rx_list[i]) == 0; RE_RXDESC_INC(i)) { cur_rx = &sc->re_ldata.re_rx_list[i]; m = sc->re_ldata.re_rx_mbuf[i]; total_len = RE_RXBYTES(cur_rx); @@ -1746,7 +1746,7 @@ re_txeof(struct re_softc *sc) sc->re_ldata.re_tx_list_map, BUS_DMASYNC_POSTREAD); for (idx = sc->re_ldata.re_tx_considx; - sc->re_ldata.re_tx_free < RE_TX_DESC_CNT; RE_DESC_INC(idx)) { + sc->re_ldata.re_tx_free < RE_TX_DESC_CNT; RE_TXDESC_INC(idx)) { txstat = le32toh(sc->re_ldata.re_tx_list[idx].re_cmdstat); if (txstat & RE_TDESC_CMD_OWN) break; @@ -2117,7 +2117,7 @@ re_encap(struct re_softc *sc, struct mbuf **m_head, int *idx0) i++; if (i == arg.re_nsegs) break; - RE_DESC_INC(idx); + RE_TXDESC_INC(idx); } d->re_cmdstat |= htole32(RE_TDESC_CMD_EOF); @@ -2148,7 +2148,7 @@ re_encap(struct re_softc *sc, struct mbuf **m_head, int *idx0) sc->re_ldata.re_tx_mbuf[idx] = m; sc->re_ldata.re_tx_free -= arg.re_nsegs; - RE_DESC_INC(idx); + RE_TXDESC_INC(idx); *idx0 = idx; back: if (error) { diff --git a/sys/dev/netif/re/if_revar.h b/sys/dev/netif/re/if_revar.h index 28d5e4e08e..589be973c5 100644 --- a/sys/dev/netif/re/if_revar.h +++ b/sys/dev/netif/re/if_revar.h @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ - * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.10 2008/10/05 01:53:41 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.11 2008/10/05 02:13:06 sephe Exp $ */ #define RE_RX_DESC_CNT 64 @@ -45,7 +45,8 @@ #define RE_MAXSEGS 16 #define RE_TXDESC_SPARE 4 -#define RE_DESC_INC(x) (x = (x + 1) % RE_TX_DESC_CNT) +#define RE_RXDESC_INC(x) (x = (x + 1) % RE_RX_DESC_CNT) +#define RE_TXDESC_INC(x) (x = (x + 1) % RE_TX_DESC_CNT) #define RE_OWN(x) (le32toh((x)->re_cmdstat) & RE_RDESC_STAT_OWN) #define RE_RXBYTES(x) (le32toh((x)->re_cmdstat) & sc->re_rxlenmask) #define RE_PKTSZ(x) ((x)/* >> 3*/) -- 2.41.0 From 53d4588ae4cbf20133b47c44842a8736834913cc Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sun, 5 Oct 2008 04:54:51 +0000 Subject: [PATCH 13/16] Add tunable for RX/TX descriptor count --- sys/dev/netif/re/if_re.c | 110 +++++++++++++++++++++++++++--------- sys/dev/netif/re/if_revar.h | 29 ++++++---- 2 files changed, 100 insertions(+), 39 deletions(-) diff --git a/sys/dev/netif/re/if_re.c b/sys/dev/netif/re/if_re.c index 0d0b2046ea..706b708116 100644 --- a/sys/dev/netif/re/if_re.c +++ b/sys/dev/netif/re/if_re.c @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/re/if_re.c,v 1.25 2004/06/09 14:34:01 naddy Exp $ - * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.62 2008/10/05 02:13:06 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.63 2008/10/05 04:54:51 sephe Exp $ */ /* @@ -334,6 +334,12 @@ DRIVER_MODULE(if_re, pci, re_driver, re_devclass, 0, 0); DRIVER_MODULE(if_re, cardbus, re_driver, re_devclass, 0, 0); DRIVER_MODULE(miibus, re, miibus_driver, miibus_devclass, 0, 0); +static int re_rx_desc_count = RE_RX_DESC_CNT_DEF; +static int re_tx_desc_count = RE_TX_DESC_CNT_DEF; + +TUNABLE_INT("hw.re.rx_desc_count", &re_rx_desc_count); +TUNABLE_INT("hw.re.tx_desc_count", &re_tx_desc_count); + #define EE_SET(x) \ CSR_WRITE_1(sc, RE_EECMD, CSR_READ_1(sc, RE_EECMD) | (x)) @@ -952,6 +958,29 @@ re_allocmem(device_t dev) struct re_softc *sc = device_get_softc(dev); int error, i; + /* + * Allocate list data + */ + sc->re_ldata.re_tx_mbuf = + kmalloc(sc->re_tx_desc_cnt * sizeof(struct mbuf *), + M_DEVBUF, M_ZERO | M_WAITOK); + + sc->re_ldata.re_rx_mbuf = + kmalloc(sc->re_rx_desc_cnt * sizeof(struct mbuf *), + M_DEVBUF, M_ZERO | M_WAITOK); + + sc->re_ldata.re_rx_paddr = + kmalloc(sc->re_rx_desc_cnt * sizeof(bus_addr_t), + M_DEVBUF, M_ZERO | M_WAITOK); + + sc->re_ldata.re_tx_dmamap = + kmalloc(sc->re_tx_desc_cnt * sizeof(bus_dmamap_t), + M_DEVBUF, M_ZERO | M_WAITOK); + + sc->re_ldata.re_rx_dmamap = + kmalloc(sc->re_rx_desc_cnt * sizeof(bus_dmamap_t), + M_DEVBUF, M_ZERO | M_WAITOK); + /* * Allocate the parent bus DMA tag appropriate for PCI. */ @@ -974,7 +1003,7 @@ re_allocmem(device_t dev) RE_RING_ALIGN, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, - RE_TX_LIST_SZ, 1, RE_TX_LIST_SZ, + RE_TX_LIST_SZ(sc), 1, RE_TX_LIST_SZ(sc), BUS_DMA_ALLOCNOW, &sc->re_ldata.re_tx_list_tag); if (error) { @@ -997,7 +1026,7 @@ re_allocmem(device_t dev) /* Load the map for the TX ring. */ error = bus_dmamap_load(sc->re_ldata.re_tx_list_tag, sc->re_ldata.re_tx_list_map, - sc->re_ldata.re_tx_list, RE_TX_LIST_SZ, + sc->re_ldata.re_tx_list, RE_TX_LIST_SZ(sc), re_dma_map_addr, &sc->re_ldata.re_tx_list_addr, BUS_DMA_NOWAIT); if (error) { @@ -1015,7 +1044,7 @@ re_allocmem(device_t dev) RE_RING_ALIGN, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, - RE_RX_LIST_SZ, 1, RE_RX_LIST_SZ, + RE_RX_LIST_SZ(sc), 1, RE_RX_LIST_SZ(sc), BUS_DMA_ALLOCNOW, &sc->re_ldata.re_rx_list_tag); if (error) { @@ -1038,7 +1067,7 @@ re_allocmem(device_t dev) /* Load the map for the RX ring. */ error = bus_dmamap_load(sc->re_ldata.re_rx_list_tag, sc->re_ldata.re_rx_list_map, - sc->re_ldata.re_rx_list, RE_RX_LIST_SZ, + sc->re_ldata.re_rx_list, RE_RX_LIST_SZ(sc), re_dma_map_addr, &sc->re_ldata.re_rx_list_addr, BUS_DMA_NOWAIT); if (error) { @@ -1075,7 +1104,7 @@ re_allocmem(device_t dev) } /* Create DMA maps for TX buffers */ - for (i = 0; i < RE_TX_DESC_CNT; i++) { + for (i = 0; i < sc->re_tx_desc_cnt; i++) { error = bus_dmamap_create(sc->re_ldata.re_mtag, 0, &sc->re_ldata.re_tx_dmamap[i]); if (error) { @@ -1086,12 +1115,12 @@ re_allocmem(device_t dev) } /* Create DMA maps for RX buffers */ - for (i = 0; i < RE_RX_DESC_CNT; i++) { + for (i = 0; i < sc->re_rx_desc_cnt; i++) { error = bus_dmamap_create(sc->re_ldata.re_mtag, 0, &sc->re_ldata.re_rx_dmamap[i]); if (error) { device_printf(dev, "can't create DMA map for RX buf\n"); - re_freebufmem(sc, RE_TX_DESC_CNT, i); + re_freebufmem(sc, sc->re_tx_desc_cnt, i); return(error); } } @@ -1145,7 +1174,7 @@ re_freemem(device_t dev) } /* Free RX/TX buf DMA stuffs */ - re_freebufmem(sc, RE_TX_DESC_CNT, RE_RX_DESC_CNT); + re_freebufmem(sc, sc->re_tx_desc_cnt, sc->re_rx_desc_cnt); /* Unload and free the stats buffer and map */ if (sc->re_ldata.re_stag) { @@ -1159,6 +1188,17 @@ re_freemem(device_t dev) if (sc->re_parent_tag) bus_dma_tag_destroy(sc->re_parent_tag); + + if (sc->re_ldata.re_tx_mbuf != NULL) + kfree(sc->re_ldata.re_tx_mbuf, M_DEVBUF); + if (sc->re_ldata.re_rx_mbuf != NULL) + kfree(sc->re_ldata.re_rx_mbuf, M_DEVBUF); + if (sc->re_ldata.re_rx_paddr != NULL) + kfree(sc->re_ldata.re_rx_paddr, M_DEVBUF); + if (sc->re_ldata.re_tx_dmamap != NULL) + kfree(sc->re_ldata.re_tx_dmamap, M_DEVBUF); + if (sc->re_ldata.re_rx_dmamap != NULL) + kfree(sc->re_ldata.re_rx_dmamap, M_DEVBUF); } /* @@ -1182,6 +1222,14 @@ re_attach(device_t dev) sc->re_dev = dev; #endif + sc->re_rx_desc_cnt = re_rx_desc_count; + if (sc->re_rx_desc_cnt > RE_RX_DESC_CNT_MAX) + sc->re_rx_desc_cnt = RE_RX_DESC_CNT_MAX; + + sc->re_tx_desc_cnt = re_tx_desc_count; + if (sc->re_tx_desc_cnt > RE_TX_DESC_CNT_MAX) + sc->re_tx_desc_cnt = RE_TX_DESC_CNT_MAX; + RE_ENABLE_TX_MODERATION(sc); sysctl_ctx_init(&sc->re_sysctl_ctx); @@ -1201,6 +1249,14 @@ re_attach(device_t dev) CTLTYPE_INT | CTLFLAG_RW, sc, 0, re_sysctl_tx_moderation, "I", "Enable/Disable TX moderation"); + SYSCTL_ADD_INT(&sc->re_sysctl_ctx, + SYSCTL_CHILDREN(sc->re_sysctl_tree), OID_AUTO, + "rx_desc_count", CTLFLAG_RD, &sc->re_rx_desc_cnt, + 0, "RX desc count"); + SYSCTL_ADD_INT(&sc->re_sysctl_ctx, + SYSCTL_CHILDREN(sc->re_sysctl_tree), OID_AUTO, + "tx_desc_count", CTLFLAG_RD, &sc->re_tx_desc_cnt, + 0, "TX desc count"); #ifndef BURN_BRIDGES /* @@ -1450,7 +1506,7 @@ re_setup_rxdesc(struct re_softc *sc, int idx) d->re_bufaddr_hi = htole32(RE_ADDR_HI(paddr)); cmdstat = MCLBYTES | RE_RDESC_CMD_OWN; - if (idx == (RE_RX_DESC_CNT - 1)) + if (idx == (sc->re_rx_desc_cnt - 1)) cmdstat |= RE_TDESC_CMD_EOR; d->re_cmdstat = htole32(cmdstat); } @@ -1526,14 +1582,15 @@ back: static int re_tx_list_init(struct re_softc *sc) { - bzero(sc->re_ldata.re_tx_list, RE_TX_LIST_SZ); - bzero(&sc->re_ldata.re_tx_mbuf, RE_TX_DESC_CNT * sizeof(struct mbuf *)); + bzero(sc->re_ldata.re_tx_list, RE_TX_LIST_SZ(sc)); + /* Flush the TX descriptors */ bus_dmamap_sync(sc->re_ldata.re_tx_list_tag, sc->re_ldata.re_tx_list_map, BUS_DMASYNC_PREWRITE); + sc->re_ldata.re_tx_prodidx = 0; sc->re_ldata.re_tx_considx = 0; - sc->re_ldata.re_tx_free = RE_TX_DESC_CNT; + sc->re_ldata.re_tx_free = sc->re_tx_desc_cnt; return(0); } @@ -1543,17 +1600,15 @@ re_rx_list_init(struct re_softc *sc) { int i, error; - bzero(sc->re_ldata.re_rx_list, RE_RX_LIST_SZ); - bzero(&sc->re_ldata.re_rx_mbuf, RE_RX_DESC_CNT * sizeof(struct mbuf *)); + bzero(sc->re_ldata.re_rx_list, RE_RX_LIST_SZ(sc)); - for (i = 0; i < RE_RX_DESC_CNT; i++) { + for (i = 0; i < sc->re_rx_desc_cnt; i++) { error = re_newbuf(sc, i, 1); if (error) return(error); } /* Flush the RX descriptors */ - bus_dmamap_sync(sc->re_ldata.re_rx_list_tag, sc->re_ldata.re_rx_list_map, BUS_DMASYNC_PREWRITE); @@ -1586,7 +1641,7 @@ re_rxeof(struct re_softc *sc) ether_input_chain_init(chain); for (i = sc->re_ldata.re_rx_prodidx; - RE_OWN(&sc->re_ldata.re_rx_list[i]) == 0; RE_RXDESC_INC(i)) { + RE_OWN(&sc->re_ldata.re_rx_list[i]) == 0; RE_RXDESC_INC(sc, i)) { cur_rx = &sc->re_ldata.re_rx_list[i]; m = sc->re_ldata.re_rx_mbuf[i]; total_len = RE_RXBYTES(cur_rx); @@ -1746,7 +1801,8 @@ re_txeof(struct re_softc *sc) sc->re_ldata.re_tx_list_map, BUS_DMASYNC_POSTREAD); for (idx = sc->re_ldata.re_tx_considx; - sc->re_ldata.re_tx_free < RE_TX_DESC_CNT; RE_TXDESC_INC(idx)) { + sc->re_ldata.re_tx_free < sc->re_tx_desc_cnt; + RE_TXDESC_INC(sc, idx)) { txstat = le32toh(sc->re_ldata.re_tx_list[idx].re_cmdstat); if (txstat & RE_TDESC_CMD_OWN) break; @@ -1787,7 +1843,7 @@ re_txeof(struct re_softc *sc) * to restart the channel here to flush them out. This only seems * to be required with the PCIe devices. */ - if (sc->re_ldata.re_tx_free < RE_TX_DESC_CNT) + if (sc->re_ldata.re_tx_free < sc->re_tx_desc_cnt) CSR_WRITE_1(sc, sc->re_txstart, RE_TXSTART_START); else ifp->if_timer = 0; @@ -1799,7 +1855,7 @@ re_txeof(struct re_softc *sc) * This is done in case the transmitter has gone idle. */ if (RE_TX_MODERATION_IS_ENABLED(sc) && - sc->re_ldata.re_tx_free < RE_TX_DESC_CNT) + sc->re_ldata.re_tx_free < sc->re_tx_desc_cnt) CSR_WRITE_4(sc, RE_TIMERCNT, 1); } @@ -2110,14 +2166,14 @@ re_encap(struct re_softc *sc, struct mbuf **m_head, int *idx0) cmdstat |= RE_TDESC_CMD_SOF; else cmdstat |= RE_TDESC_CMD_OWN; - if (idx == (RE_TX_DESC_CNT - 1)) + if (idx == (sc->re_tx_desc_cnt - 1)) cmdstat |= RE_TDESC_CMD_EOR; d->re_cmdstat = htole32(cmdstat | csum_flags); i++; if (i == arg.re_nsegs) break; - RE_TXDESC_INC(idx); + RE_TXDESC_INC(sc, idx); } d->re_cmdstat |= htole32(RE_TDESC_CMD_EOF); @@ -2148,7 +2204,7 @@ re_encap(struct re_softc *sc, struct mbuf **m_head, int *idx0) sc->re_ldata.re_tx_mbuf[idx] = m; sc->re_ldata.re_tx_free -= arg.re_nsegs; - RE_TXDESC_INC(idx); + RE_TXDESC_INC(sc, idx); *idx0 = idx; back: if (error) { @@ -2210,7 +2266,7 @@ re_start(struct ifnet *ifp) if (!need_trans) { if (RE_TX_MODERATION_IS_ENABLED(sc) && - sc->re_ldata.re_tx_free != RE_TX_DESC_CNT) + sc->re_ldata.re_tx_free != sc->re_tx_desc_cnt) CSR_WRITE_4(sc, RE_TIMERCNT, 1); return; } @@ -2568,7 +2624,7 @@ re_stop(struct re_softc *sc) sc->re_drop_rxfrag = 0; /* Free the TX list buffers. */ - for (i = 0; i < RE_TX_DESC_CNT; i++) { + for (i = 0; i < sc->re_tx_desc_cnt; i++) { if (sc->re_ldata.re_tx_mbuf[i] != NULL) { bus_dmamap_unload(sc->re_ldata.re_mtag, sc->re_ldata.re_tx_dmamap[i]); @@ -2578,7 +2634,7 @@ re_stop(struct re_softc *sc) } /* Free the RX list buffers. */ - for (i = 0; i < RE_RX_DESC_CNT; i++) { + for (i = 0; i < sc->re_rx_desc_cnt; i++) { if (sc->re_ldata.re_rx_mbuf[i] != NULL) { bus_dmamap_unload(sc->re_ldata.re_mtag, sc->re_ldata.re_rx_dmamap[i]); diff --git a/sys/dev/netif/re/if_revar.h b/sys/dev/netif/re/if_revar.h index 589be973c5..c2e20c755d 100644 --- a/sys/dev/netif/re/if_revar.h +++ b/sys/dev/netif/re/if_revar.h @@ -33,20 +33,23 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ - * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.11 2008/10/05 02:13:06 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.12 2008/10/05 04:54:51 sephe Exp $ */ -#define RE_RX_DESC_CNT 64 -#define RE_TX_DESC_CNT 64 -#define RE_RX_LIST_SZ (RE_RX_DESC_CNT * sizeof(struct re_desc)) -#define RE_TX_LIST_SZ (RE_TX_DESC_CNT * sizeof(struct re_desc)) +#define RE_RX_DESC_CNT_DEF 64 +#define RE_TX_DESC_CNT_DEF 64 +#define RE_RX_DESC_CNT_MAX 1024 +#define RE_TX_DESC_CNT_MAX 1024 + +#define RE_RX_LIST_SZ(sc) ((sc)->re_rx_desc_cnt * sizeof(struct re_desc)) +#define RE_TX_LIST_SZ(sc) ((sc)->re_tx_desc_cnt * sizeof(struct re_desc)) #define RE_RING_ALIGN 256 #define RE_IFQ_MAXLEN 512 #define RE_MAXSEGS 16 #define RE_TXDESC_SPARE 4 -#define RE_RXDESC_INC(x) (x = (x + 1) % RE_RX_DESC_CNT) -#define RE_TXDESC_INC(x) (x = (x + 1) % RE_TX_DESC_CNT) +#define RE_RXDESC_INC(sc, x) (x = (x + 1) % (sc)->re_rx_desc_cnt) +#define RE_TXDESC_INC(sc, x) (x = (x + 1) % (sc)->re_tx_desc_cnt) #define RE_OWN(x) (le32toh((x)->re_cmdstat) & RE_RDESC_STAT_OWN) #define RE_RXBYTES(x) (le32toh((x)->re_cmdstat) & sc->re_rxlenmask) #define RE_PKTSZ(x) ((x)/* >> 3*/) @@ -86,15 +89,15 @@ struct re_dmaload_arg { }; struct re_list_data { - struct mbuf *re_tx_mbuf[RE_TX_DESC_CNT]; - struct mbuf *re_rx_mbuf[RE_RX_DESC_CNT]; - bus_addr_t re_rx_paddr[RE_RX_DESC_CNT]; + struct mbuf **re_tx_mbuf; + struct mbuf **re_rx_mbuf; + bus_addr_t *re_rx_paddr; int re_tx_prodidx; int re_rx_prodidx; int re_tx_considx; int re_tx_free; - bus_dmamap_t re_tx_dmamap[RE_TX_DESC_CNT]; - bus_dmamap_t re_rx_dmamap[RE_RX_DESC_CNT]; + bus_dmamap_t *re_tx_dmamap; + bus_dmamap_t *re_rx_dmamap; bus_dmamap_t re_rx_spare; bus_dma_tag_t re_mtag; /* mbuf mapping tag */ bus_dma_tag_t re_stag; /* stats mapping tag */ @@ -143,6 +146,8 @@ struct re_softc { int re_eewidth; int re_swcsum_lim; int re_maxmtu; + int re_rx_desc_cnt; + int re_tx_desc_cnt; #ifdef DEVICE_POLLING int rxcycles; #endif -- 2.41.0 From 7928006132a012a569b9773c7799d559a24cba85 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sun, 5 Oct 2008 05:00:58 +0000 Subject: [PATCH 14/16] Set ifq maxlen according to number of TX descriptors --- sys/dev/netif/re/if_re.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sys/dev/netif/re/if_re.c b/sys/dev/netif/re/if_re.c index 706b708116..8b67ad9862 100644 --- a/sys/dev/netif/re/if_re.c +++ b/sys/dev/netif/re/if_re.c @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/re/if_re.c,v 1.25 2004/06/09 14:34:01 naddy Exp $ - * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.63 2008/10/05 04:54:51 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.64 2008/10/05 05:00:58 sephe Exp $ */ /* @@ -1215,7 +1215,7 @@ re_attach(device_t dev) uint16_t as[ETHER_ADDR_LEN / 2]; uint16_t re_did = 0; uint32_t hwrev; - int error = 0, rid, i; + int error = 0, rid, i, qlen; callout_init(&sc->re_timer); #ifdef RE_DIAG @@ -1230,6 +1230,10 @@ re_attach(device_t dev) if (sc->re_tx_desc_cnt > RE_TX_DESC_CNT_MAX) sc->re_tx_desc_cnt = RE_TX_DESC_CNT_MAX; + qlen = RE_IFQ_MAXLEN; + if (sc->re_tx_desc_cnt > RE_IFQ_MAXLEN) + qlen = sc->re_tx_desc_cnt; + RE_ENABLE_TX_MODERATION(sc); sysctl_ctx_init(&sc->re_sysctl_ctx); @@ -1392,7 +1396,7 @@ re_attach(device_t dev) ifp->if_baudrate = 1000000000; else ifp->if_baudrate = 100000000; - ifq_set_maxlen(&ifp->if_snd, RE_IFQ_MAXLEN); + ifq_set_maxlen(&ifp->if_snd, qlen); ifq_set_ready(&ifp->if_snd); #ifdef RE_DISABLE_HWCSUM -- 2.41.0 From 957a8760be7a8e1e6e9a8c33a8fffdaee5f1aed8 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sun, 5 Oct 2008 06:15:36 +0000 Subject: [PATCH 15/16] Get bus clock, which will be used to fix broken TCTR setting (hardware timer, interrupt moderation related) --- sys/dev/netif/re/if_re.c | 32 ++++++++++++++++++++++++++++++-- sys/dev/netif/re/if_rereg.h | 13 +++++++++++-- sys/dev/netif/re/if_revar.h | 4 +++- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/sys/dev/netif/re/if_re.c b/sys/dev/netif/re/if_re.c index 8b67ad9862..17908f94b4 100644 --- a/sys/dev/netif/re/if_re.c +++ b/sys/dev/netif/re/if_re.c @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/re/if_re.c,v 1.25 2004/06/09 14:34:01 naddy Exp $ - * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.64 2008/10/05 05:00:58 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.65 2008/10/05 06:15:36 sephe Exp $ */ /* @@ -1328,7 +1328,35 @@ re_attach(device_t dev) break; } } - device_printf(dev, "hardware rev. 0x%08x\n", hwrev); + + if (sc->re_type == RE_8139CPLUS) { + sc->re_bus_speed = 33; /* XXX */ + } else if (sc->re_flags & RE_F_PCIE) { + sc->re_bus_speed = 125; + } else { + uint8_t cfg2; + + cfg2 = CSR_READ_1(sc, RE_CFG2); + switch (cfg2 & RE_CFG2_PCICLK_MASK) { + case RE_CFG2_PCICLK_33MHZ: + sc->re_bus_speed = 33; + break; + case RE_CFG2_PCICLK_66MHZ: + sc->re_bus_speed = 66; + break; + default: + device_printf(dev, "unknown bus speed, assume 33MHz\n"); + sc->re_bus_speed = 33; + break; + } + if (cfg2 & RE_CFG2_PCI64) + sc->re_flags |= RE_F_PCI64; + } + device_printf(dev, "Hardware rev. 0x%08x; PCI%s %dMHz\n", + sc->re_hwrev, + (sc->re_flags & RE_F_PCIE) ? + "-E" : ((sc->re_flags & RE_F_PCI64) ? "64" : "32"), + sc->re_bus_speed); sc->re_eewidth = 6; re_read_eeprom(sc, (caddr_t)&re_did, 0, 1); diff --git a/sys/dev/netif/re/if_rereg.h b/sys/dev/netif/re/if_rereg.h index ef7d799e7c..c76689193a 100644 --- a/sys/dev/netif/re/if_rereg.h +++ b/sys/dev/netif/re/if_rereg.h @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ - * $DragonFly: src/sys/dev/netif/re/if_rereg.h,v 1.12 2008/10/05 01:53:41 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_rereg.h,v 1.13 2008/10/05 06:15:36 sephe Exp $ */ /* @@ -70,7 +70,8 @@ #define RE_EECMD 0x0050 /* EEPROM command register */ #define RE_CFG0 0x0051 /* config register #0 */ #define RE_CFG1 0x0052 /* config register #1 */ - /* 0053-0057 reserved */ +#define RE_CFG2 0x0053 /* config register #2 */ + /* 0054-0057 reserved */ #define RE_MEDIASTAT 0x0058 /* media status register (8139) */ /* 0059-005A reserved */ #define RE_MII 0x005A /* 8129 chip only */ @@ -135,6 +136,14 @@ #define RE_TXCFG_IFG 0x03000000 /* interframe gap */ #define RE_TXCFG_HWREV 0x7CC00000 +/* + * Config 2 register bits + */ +#define RE_CFG2_PCICLK_MASK 0x07 +#define RE_CFG2_PCICLK_33MHZ 0x00 +#define RE_CFG2_PCICLK_66MHZ 0x01 +#define RE_CFG2_PCI64 0x08 + #define RE_LOOPTEST_OFF 0x00000000 #define RE_LOOPTEST_ON 0x00020000 #define RE_LOOPTEST_ON_CPLUS 0x00060000 diff --git a/sys/dev/netif/re/if_revar.h b/sys/dev/netif/re/if_revar.h index c2e20c755d..7b982e318b 100644 --- a/sys/dev/netif/re/if_revar.h +++ b/sys/dev/netif/re/if_revar.h @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.42 2004/05/24 19:39:23 jhb Exp $ - * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.12 2008/10/05 04:54:51 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_revar.h,v 1.13 2008/10/05 06:15:36 sephe Exp $ */ #define RE_RX_DESC_CNT_DEF 64 @@ -148,6 +148,7 @@ struct re_softc { int re_maxmtu; int re_rx_desc_cnt; int re_tx_desc_cnt; + int re_bus_speed; #ifdef DEVICE_POLLING int rxcycles; #endif @@ -168,6 +169,7 @@ struct re_softc { #define RE_F_HASMPC 0x1 #define RE_F_PCIE 0x2 +#define RE_F_PCI64 0x4 #define RE_TX_MODERATION_IS_ENABLED(sc) \ ((sc)->re_tx_ack == RE_ISR_TIMEOUT_EXPIRED) -- 2.41.0 From aa555c89f8cffbccefb5b749625cef0b7384d340 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sun, 5 Oct 2008 07:57:45 +0000 Subject: [PATCH 16/16] - Set hardware timer according to bus clock. Adjust hardware timer to 8000HZ - For PCI-E device, increase "max read request size" from default value (512) to 4096. With 512 TX descriptors, this change gives me additional +80-90Mbps during netperf stream tests on an 8168C. --- sys/dev/netif/re/if_re.c | 44 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/sys/dev/netif/re/if_re.c b/sys/dev/netif/re/if_re.c index 17908f94b4..6cf48fea69 100644 --- a/sys/dev/netif/re/if_re.c +++ b/sys/dev/netif/re/if_re.c @@ -33,7 +33,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/re/if_re.c,v 1.25 2004/06/09 14:34:01 naddy Exp $ - * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.65 2008/10/05 06:15:36 sephe Exp $ + * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.66 2008/10/05 07:57:45 sephe Exp $ */ /* @@ -1332,6 +1332,33 @@ re_attach(device_t dev) if (sc->re_type == RE_8139CPLUS) { sc->re_bus_speed = 33; /* XXX */ } else if (sc->re_flags & RE_F_PCIE) { + uint16_t val; + uint8_t expr_ptr; + + expr_ptr = pci_get_pciecap_ptr(dev); + if (expr_ptr != 0) { + /* + * We will set TX DMA burst to "unlimited" in + * re_init(), so push "max read request size" + * to the limit. + */ + val = pci_read_config(dev, expr_ptr + PCIER_DEVCTRL, 2); + if ((val & PCIEM_DEVCTL_MAX_READRQ_MASK) != + PCIEM_DEVCTL_MAX_READRQ_4096) { + device_printf(dev, "adjust device control " + "0x%04x ", val); + + val &= ~PCIEM_DEVCTL_MAX_READRQ_MASK; + val |= PCIEM_DEVCTL_MAX_READRQ_4096; + pci_write_config(dev, expr_ptr + PCIER_DEVCTRL, + val, 2); + + kprintf("-> 0x%04x\n", val); + } + } else { + device_printf(dev, "not PCI-E device\n"); + /* XXX clear RE_F_PCIE and read RE_CFG2? */ + } sc->re_bus_speed = 125; } else { uint8_t cfg2; @@ -2493,10 +2520,19 @@ re_init(void *xsc) * reloaded on each transmit. This gives us TX interrupt * moderation, which dramatically improves TX frame rate. */ - if (sc->re_type == RE_8169) - CSR_WRITE_4(sc, RE_TIMERINT_8169, 0x800); - else + if (sc->re_type == RE_8169) { + /* + * Set hardare timer to 125us + * XXX measurement showed me the actual value is ~76us, + * which is ~2/3 of the desired value + * + * TODO: sysctl variable. + */ + CSR_WRITE_4(sc, RE_TIMERINT_8169, + 125 * sc->re_bus_speed); + } else { CSR_WRITE_4(sc, RE_TIMERINT, 0x400); + } } /* -- 2.41.0