From owner-svn-soc-all@freebsd.org Thu Aug 13 14:30:58 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 9E07C9B7F36 for ; Thu, 13 Aug 2015 14:30:58 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 8DB6CAB6 for ; Thu, 13 Aug 2015 14:30:58 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t7DEUwuK052894 for ; Thu, 13 Aug 2015 14:30:58 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t7DEUvWo052833 for svn-soc-all@FreeBSD.org; Thu, 13 Aug 2015 14:30:57 GMT (envelope-from stefano@FreeBSD.org) Date: Thu, 13 Aug 2015 14:30:57 GMT Message-Id: <201508131430.t7DEUvWo052833@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r289689 - in soc2015/stefano/ptnetmap: head/sys/dev/virtio/network stable/10/sys/dev/virtio/network MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 13 Aug 2015 14:30:58 -0000 Author: stefano Date: Thu Aug 13 14:30:57 2015 New Revision: 289689 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=289689 Log: [ptnetmap] fix virtio-net ptnetmap patch Modified: soc2015/stefano/ptnetmap/head/sys/dev/virtio/network/if_vtnet.c soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnet.c Modified: soc2015/stefano/ptnetmap/head/sys/dev/virtio/network/if_vtnet.c ============================================================================== --- soc2015/stefano/ptnetmap/head/sys/dev/virtio/network/if_vtnet.c Thu Aug 13 13:38:09 2015 (r289688) +++ soc2015/stefano/ptnetmap/head/sys/dev/virtio/network/if_vtnet.c Thu Aug 13 14:30:57 2015 (r289689) @@ -291,7 +291,7 @@ #ifdef DEV_NETMAP #include #else -#define VTNET_PTNETMAP_ON(_na) 0 +#define VTNET_PTNETMAP_ON(_na) 0 #endif /* DEV_NETMAP */ static driver_t vtnet_driver = { @@ -1859,7 +1859,8 @@ } more = vtnet_rxq_eof(rxq); - if (!VTNET_PTNETMAP_ON(NA(ifp)) && (more || vtnet_rxq_enable_intr(rxq) != 0)) { + if (!VTNET_PTNETMAP_ON(NA(ifp)) && + (more || vtnet_rxq_enable_intr(rxq) != 0)) { if (!more) vtnet_rxq_disable_intr(rxq); /* @@ -1896,7 +1897,8 @@ } more = vtnet_rxq_eof(rxq); - if (!VTNET_PTNETMAP_ON(NA(ifp)) && (more || vtnet_rxq_enable_intr(rxq) != 0)) { + if (!VTNET_PTNETMAP_ON(NA(ifp)) && + (more || vtnet_rxq_enable_intr(rxq) != 0)) { if (!more) vtnet_rxq_disable_intr(rxq); rxq->vtnrx_stats.vrxs_rescheduled++; Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnet.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnet.c Thu Aug 13 13:38:09 2015 (r289688) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnet.c Thu Aug 13 14:30:57 2015 (r289689) @@ -30,7 +30,6 @@ __FBSDID("$FreeBSD$"); #include -#include #include #include #include @@ -51,7 +50,6 @@ #include #include -#include #include #include #include @@ -107,7 +105,6 @@ static int vtnet_setup_interface(struct vtnet_softc *); static int vtnet_change_mtu(struct vtnet_softc *, int); static int vtnet_ioctl(struct ifnet *, u_long, caddr_t); -static uint64_t vtnet_get_counter(struct ifnet *, ift_counter); static int vtnet_rxq_populate(struct vtnet_rxq *); static void vtnet_rxq_free_mbufs(struct vtnet_rxq *); @@ -161,8 +158,11 @@ #endif static int vtnet_watchdog(struct vtnet_txq *); -static void vtnet_accum_stats(struct vtnet_softc *, - struct vtnet_rxq_stats *, struct vtnet_txq_stats *); +static void vtnet_rxq_accum_stats(struct vtnet_rxq *, + struct vtnet_rxq_stats *); +static void vtnet_txq_accum_stats(struct vtnet_txq *, + struct vtnet_txq_stats *); +static void vtnet_accumulate_stats(struct vtnet_softc *); static void vtnet_tick(void *); static void vtnet_start_taskqueues(struct vtnet_softc *); @@ -267,7 +267,7 @@ { VIRTIO_NET_F_GUEST_ANNOUNCE, "GuestAnnounce" }, { VIRTIO_NET_F_MQ, "Multiqueue" }, { VIRTIO_NET_F_CTRL_MAC_ADDR, "SetMacAddress" }, - { VIRTIO_NET_F_PTNETMAP, "PTNetmap" }, + { VIRTIO_NET_F_PTNETMAP,i "PTNetmap" }, { 0, NULL } }; @@ -291,7 +291,7 @@ #ifdef DEV_NETMAP #include #else -#define VTNET_PTNETMAP_ON(_na) 0 +#define VTNET_PTNETMAP_ON(_na) 0 #endif /* DEV_NETMAP */ static driver_t vtnet_driver = { @@ -301,8 +301,6 @@ }; static devclass_t vtnet_devclass; -DRIVER_MODULE(vtnet, virtio_mmio, vtnet_driver, vtnet_devclass, - vtnet_modevent, 0); DRIVER_MODULE(vtnet, virtio_pci, vtnet_driver, vtnet_devclass, vtnet_modevent, 0); MODULE_VERSION(vtnet, 1); @@ -921,12 +919,12 @@ } if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - ifp->if_baudrate = IF_Gbps(10); /* Approx. */ + if_initbaudrate(ifp, IF_Gbps(10)); /* Approx. */ ifp->if_softc = sc; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_init = vtnet_init; ifp->if_ioctl = vtnet_ioctl; - ifp->if_get_counter = vtnet_get_counter; + #ifndef VTNET_LEGACY_TX ifp->if_transmit = vtnet_txq_mq_start; ifp->if_qflush = vtnet_qflush; @@ -952,7 +950,7 @@ ifp->if_capabilities |= IFCAP_LINKSTATE; /* Tell the upper layer(s) we support long frames. */ - ifp->if_hdrlen = sizeof(struct ether_vlan_header); + ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); ifp->if_capabilities |= IFCAP_JUMBO_MTU | IFCAP_VLAN_MTU; if (virtio_with_feature(dev, VIRTIO_NET_F_CSUM)) { @@ -1859,7 +1857,8 @@ } more = vtnet_rxq_eof(rxq); - if (!VTNET_PTNETMAP_ON(NA(ifp)) && (more || vtnet_rxq_enable_intr(rxq) != 0)) { + if (!VTNET_PTNETMAP_ON(NA(ifp)) && + (more || vtnet_rxq_enable_intr(rxq) != 0)) { if (!more) vtnet_rxq_disable_intr(rxq); /* @@ -1896,7 +1895,8 @@ } more = vtnet_rxq_eof(rxq); - if (!VTNET_PTNETMAP_ON(NA(ifp)) && (more || vtnet_rxq_enable_intr(rxq) != 0)) { + if (!VTNET_PTNETMAP_ON(NA(ifp)) && + (more || vtnet_rxq_enable_intr(rxq) != 0)) { if (!more) vtnet_rxq_disable_intr(rxq); rxq->vtnrx_stats.vrxs_rescheduled++; @@ -2578,62 +2578,74 @@ } static void -vtnet_accum_stats(struct vtnet_softc *sc, struct vtnet_rxq_stats *rxacc, - struct vtnet_txq_stats *txacc) +vtnet_rxq_accum_stats(struct vtnet_rxq *rxq, struct vtnet_rxq_stats *accum) { + struct vtnet_rxq_stats *st; - bzero(rxacc, sizeof(struct vtnet_rxq_stats)); - bzero(txacc, sizeof(struct vtnet_txq_stats)); + st = &rxq->vtnrx_stats; - for (int i = 0; i < sc->vtnet_max_vq_pairs; i++) { - struct vtnet_rxq_stats *rxst; - struct vtnet_txq_stats *txst; + accum->vrxs_ipackets += st->vrxs_ipackets; + accum->vrxs_ibytes += st->vrxs_ibytes; + accum->vrxs_iqdrops += st->vrxs_iqdrops; + accum->vrxs_csum += st->vrxs_csum; + accum->vrxs_csum_failed += st->vrxs_csum_failed; + accum->vrxs_rescheduled += st->vrxs_rescheduled; +} + +static void +vtnet_txq_accum_stats(struct vtnet_txq *txq, struct vtnet_txq_stats *accum) +{ + struct vtnet_txq_stats *st; - rxst = &sc->vtnet_rxqs[i].vtnrx_stats; - rxacc->vrxs_ipackets += rxst->vrxs_ipackets; - rxacc->vrxs_ibytes += rxst->vrxs_ibytes; - rxacc->vrxs_iqdrops += rxst->vrxs_iqdrops; - rxacc->vrxs_csum += rxst->vrxs_csum; - rxacc->vrxs_csum_failed += rxst->vrxs_csum_failed; - rxacc->vrxs_rescheduled += rxst->vrxs_rescheduled; + st = &txq->vtntx_stats; - txst = &sc->vtnet_txqs[i].vtntx_stats; - txacc->vtxs_opackets += txst->vtxs_opackets; - txacc->vtxs_obytes += txst->vtxs_obytes; - txacc->vtxs_csum += txst->vtxs_csum; - txacc->vtxs_tso += txst->vtxs_tso; - txacc->vtxs_rescheduled += txst->vtxs_rescheduled; - } + accum->vtxs_opackets += st->vtxs_opackets; + accum->vtxs_obytes += st->vtxs_obytes; + accum->vtxs_csum += st->vtxs_csum; + accum->vtxs_tso += st->vtxs_tso; + accum->vtxs_rescheduled += st->vtxs_rescheduled; } -static uint64_t -vtnet_get_counter(if_t ifp, ift_counter cnt) +static void +vtnet_accumulate_stats(struct vtnet_softc *sc) { - struct vtnet_softc *sc; + struct ifnet *ifp; + struct vtnet_statistics *st; struct vtnet_rxq_stats rxaccum; struct vtnet_txq_stats txaccum; + int i; + + ifp = sc->vtnet_ifp; + st = &sc->vtnet_stats; + bzero(&rxaccum, sizeof(struct vtnet_rxq_stats)); + bzero(&txaccum, sizeof(struct vtnet_txq_stats)); - sc = if_getsoftc(ifp); - vtnet_accum_stats(sc, &rxaccum, &txaccum); + for (i = 0; i < sc->vtnet_max_vq_pairs; i++) { + vtnet_rxq_accum_stats(&sc->vtnet_rxqs[i], &rxaccum); + vtnet_txq_accum_stats(&sc->vtnet_txqs[i], &txaccum); + } - switch (cnt) { - case IFCOUNTER_IPACKETS: - return (rxaccum.vrxs_ipackets); - case IFCOUNTER_IQDROPS: - return (rxaccum.vrxs_iqdrops); - case IFCOUNTER_IERRORS: - return (rxaccum.vrxs_ierrors); - case IFCOUNTER_OPACKETS: - return (txaccum.vtxs_opackets); + st->rx_csum_offloaded = rxaccum.vrxs_csum; + st->rx_csum_failed = rxaccum.vrxs_csum_failed; + st->rx_task_rescheduled = rxaccum.vrxs_rescheduled; + st->tx_csum_offloaded = txaccum.vtxs_csum; + st->tx_tso_offloaded = txaccum.vtxs_tso; + st->tx_task_rescheduled = txaccum.vtxs_rescheduled; + + /* + * With the exception of if_ierrors, these ifnet statistics are + * only updated in the driver, so just set them to our accumulated + * values. if_ierrors is updated in ether_input() for malformed + * frames that we should have already discarded. + */ + ifp->if_ipackets = rxaccum.vrxs_ipackets; + ifp->if_iqdrops = rxaccum.vrxs_iqdrops; + ifp->if_ierrors = rxaccum.vrxs_ierrors; + ifp->if_opackets = txaccum.vtxs_opackets; #ifndef VTNET_LEGACY_TX - case IFCOUNTER_OBYTES: - return (txaccum.vtxs_obytes); - case IFCOUNTER_OMCASTS: - return (txaccum.vtxs_omcasts); + ifp->if_obytes = txaccum.vtxs_obytes; + ifp->if_omcasts = txaccum.vtxs_omcasts; #endif - default: - return (if_get_counter_default(ifp, cnt)); - } } static void @@ -2648,6 +2660,7 @@ timedout = 0; VTNET_CORE_LOCK_ASSERT(sc); + vtnet_accumulate_stats(sc); for (i = 0; i < sc->vtnet_act_vq_pairs; i++) timedout |= vtnet_watchdog(&sc->vtnet_txqs[i]); @@ -3759,18 +3772,8 @@ struct sysctl_oid_list *child, struct vtnet_softc *sc) { struct vtnet_statistics *stats; - struct vtnet_rxq_stats rxaccum; - struct vtnet_txq_stats txaccum; - - vtnet_accum_stats(sc, &rxaccum, &txaccum); stats = &sc->vtnet_stats; - stats->rx_csum_offloaded = rxaccum.vrxs_csum; - stats->rx_csum_failed = rxaccum.vrxs_csum_failed; - stats->rx_task_rescheduled = rxaccum.vrxs_rescheduled; - stats->tx_csum_offloaded = txaccum.vtxs_csum; - stats->tx_tso_offloaded = txaccum.vtxs_tso; - stats->tx_task_rescheduled = txaccum.vtxs_rescheduled; SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "mbuf_alloc_failed", CTLFLAG_RD, &stats->mbuf_alloc_failed,