Module Name: src Committed By: yamaguchi Date: Mon May 25 08:41:13 UTC 2020
Modified Files: src/sys/dev/pci: if_vioif.c Log Message: Replace macros with static functions for refactoring To generate a diff of this commit: cvs rdiff -u -r1.57 -r1.58 src/sys/dev/pci/if_vioif.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_vioif.c diff -u src/sys/dev/pci/if_vioif.c:1.57 src/sys/dev/pci/if_vioif.c:1.58 --- src/sys/dev/pci/if_vioif.c:1.57 Mon May 25 08:25:28 2020 +++ src/sys/dev/pci/if_vioif.c Mon May 25 08:41:13 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_vioif.c,v 1.57 2020/05/25 08:25:28 yamaguchi Exp $ */ +/* $NetBSD: if_vioif.c,v 1.58 2020/05/25 08:41:13 yamaguchi Exp $ */ /* * Copyright (c) 2010 Minoura Makoto. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.57 2020/05/25 08:25:28 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.58 2020/05/25 08:41:13 yamaguchi Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -404,6 +404,65 @@ vioif_match(device_t parent, cfdata_t ma return 0; } +static int +vioif_dmamap_create(struct vioif_softc *sc, bus_dmamap_t *map, + bus_size_t size, int nsegs, const char *usage) +{ + int r; + + r = bus_dmamap_create(virtio_dmat(sc->sc_virtio), size, + nsegs, size, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, map); + + if (r != 0) { + aprint_error_dev(sc->sc_dev, "%s dmamap creation failed, " + "error code %d\n", usage, r); + } + + return r; +} + +static void +vioif_dmamap_destroy(struct vioif_softc *sc, bus_dmamap_t *map) +{ + + if (*map) { + bus_dmamap_destroy(virtio_dmat(sc->sc_virtio), *map); + *map = NULL; + } +} + +static int +vioif_dmamap_create_load(struct vioif_softc *sc, bus_dmamap_t *map, + void *buf, bus_size_t size, int nsegs, int rw, const char *usage) +{ + int r; + + r = vioif_dmamap_create(sc, map, size, nsegs, usage); + if (r != 0) + return 1; + + r = bus_dmamap_load(virtio_dmat(sc->sc_virtio), *map, buf, + size, NULL, rw | BUS_DMA_NOWAIT); + if (r != 0) { + vioif_dmamap_destroy(sc, map); + aprint_error_dev(sc->sc_dev, "%s dmamap load failed. " + "error code %d\n", usage, r); + } + + return r; +} + +static void * +vioif_assign_mem(intptr_t *p, size_t size) +{ + intptr_t rv; + + rv = *p; + *p += size; + + return (void *)rv; +} + static void vioif_alloc_queues(struct vioif_softc *sc) { @@ -528,8 +587,6 @@ vioif_alloc_mems(struct vioif_softc *sc) goto err_dmamem_alloc; } -#define P(p, p0, p0size) do { p0 = (void *) p; \ - p += p0size; } while (0) memset(vaddr, 0, allocsize); sc->sc_dmamem = vaddr; p = (intptr_t) vaddr; @@ -538,19 +595,24 @@ vioif_alloc_mems(struct vioif_softc *sc) rxq = &sc->sc_rxq[qid]; txq = &sc->sc_txq[qid]; - P(p, rxq->rxq_hdrs, + rxq->rxq_hdrs = vioif_assign_mem(&p, sizeof(rxq->rxq_hdrs[0]) * rxq->rxq_vq->vq_num); - P(p, txq->txq_hdrs, + txq->txq_hdrs = vioif_assign_mem(&p, sizeof(txq->txq_hdrs[0]) * txq->txq_vq->vq_num); } if (sc->sc_has_ctrl) { - P(p, ctrlq->ctrlq_cmd, sizeof(*ctrlq->ctrlq_cmd)); - P(p, ctrlq->ctrlq_status, sizeof(*ctrlq->ctrlq_status)); - P(p, ctrlq->ctrlq_rx, sizeof(*ctrlq->ctrlq_rx)); - P(p, ctrlq->ctrlq_mac_tbl_uc, sizeof(*ctrlq->ctrlq_mac_tbl_uc)); - P(p, ctrlq->ctrlq_mac_tbl_mc, sizeof(*ctrlq->ctrlq_mac_tbl_mc) + ctrlq->ctrlq_cmd = vioif_assign_mem(&p, + sizeof(*ctrlq->ctrlq_cmd)); + ctrlq->ctrlq_status = vioif_assign_mem(&p, + sizeof(*ctrlq->ctrlq_status)); + ctrlq->ctrlq_rx = vioif_assign_mem(&p, + sizeof(*ctrlq->ctrlq_rx)); + ctrlq->ctrlq_mac_tbl_uc = vioif_assign_mem(&p, + sizeof(*ctrlq->ctrlq_mac_tbl_uc)); + ctrlq->ctrlq_mac_tbl_mc = vioif_assign_mem(&p, + sizeof(*ctrlq->ctrlq_mac_tbl_mc) + ETHER_ADDR_LEN * VIRTIO_NET_CTRL_MAC_MAXENTRIES); - P(p, ctrlq->ctrlq_mq, sizeof(*ctrlq->ctrlq_mq)); + ctrlq->ctrlq_mq = vioif_assign_mem(&p, sizeof(*ctrlq->ctrlq_mq)); } allocsize2 = 0; @@ -581,126 +643,115 @@ vioif_alloc_mems(struct vioif_softc *sc) rxqsize = rxq->rxq_vq->vq_num; txqsize = txq->txq_vq->vq_num; - P(p, rxq->rxq_hdr_dmamaps, + rxq->rxq_hdr_dmamaps = vioif_assign_mem(&p, sizeof(rxq->rxq_hdr_dmamaps[0]) * rxqsize); - P(p, txq->txq_hdr_dmamaps, + txq->txq_hdr_dmamaps = vioif_assign_mem(&p, sizeof(txq->txq_hdr_dmamaps[0]) * txqsize); - P(p, rxq->rxq_dmamaps, sizeof(rxq->rxq_dmamaps[0]) * rxqsize); - P(p, txq->txq_dmamaps, sizeof(txq->txq_dmamaps[0]) * txqsize); - P(p, rxq->rxq_mbufs, sizeof(rxq->rxq_mbufs[0]) * rxqsize); - P(p, txq->txq_mbufs, sizeof(txq->txq_mbufs[0]) * txqsize); - } -#undef P - -#define C(map, size, nsegs, usage) \ - do { \ - r = bus_dmamap_create(virtio_dmat(vsc), size, nsegs, size, 0, \ - BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, \ - &map); \ - if (r != 0) { \ - aprint_error_dev(sc->sc_dev, \ - usage " dmamap creation failed, " \ - "error code %d\n", r); \ - goto err_reqs; \ - } \ - } while (0) -#define C_L(map, buf, size, nsegs, rw, usage) \ - C(map, size, nsegs, usage); \ - do { \ - r = bus_dmamap_load(virtio_dmat(vsc), map, \ - buf, size, NULL, \ - rw | BUS_DMA_NOWAIT); \ - if (r != 0) { \ - aprint_error_dev(sc->sc_dev, \ - usage " dmamap load failed, " \ - "error code %d\n", r); \ - goto err_reqs; \ - } \ - } while (0) + rxq->rxq_dmamaps = vioif_assign_mem(&p, + sizeof(rxq->rxq_dmamaps[0]) * rxqsize); + txq->txq_dmamaps = vioif_assign_mem(&p, + sizeof(txq->txq_dmamaps[0]) * txqsize); + rxq->rxq_mbufs = vioif_assign_mem(&p, + sizeof(rxq->rxq_mbufs[0]) * rxqsize); + txq->txq_mbufs = vioif_assign_mem(&p, + sizeof(txq->txq_mbufs[0]) * txqsize); + } for (qid = 0; qid < sc->sc_max_nvq_pairs; qid++) { rxq = &sc->sc_rxq[qid]; txq = &sc->sc_txq[qid]; for (i = 0; i < rxq->rxq_vq->vq_num; i++) { - C_L(rxq->rxq_hdr_dmamaps[i], &rxq->rxq_hdrs[i], - sizeof(rxq->rxq_hdrs[0]), 1, + r = vioif_dmamap_create_load(sc, &rxq->rxq_hdr_dmamaps[i], + &rxq->rxq_hdrs[i], sizeof(rxq->rxq_hdrs[0]), 1, BUS_DMA_READ, "rx header"); - C(rxq->rxq_dmamaps[i], MCLBYTES, 1, "rx payload"); + if (r != 0) + goto err_reqs; + + r = vioif_dmamap_create(sc, &rxq->rxq_dmamaps[i], + MCLBYTES, 1, "rx payload"); + if (r != 0) + goto err_reqs; } for (i = 0; i < txq->txq_vq->vq_num; i++) { - C_L(txq->txq_hdr_dmamaps[i], &txq->txq_hdrs[i], - sizeof(txq->txq_hdrs[0]), 1, + r = vioif_dmamap_create_load(sc, &txq->txq_hdr_dmamaps[i], + &txq->txq_hdrs[i], sizeof(txq->txq_hdrs[0]), 1, BUS_DMA_READ, "tx header"); - C(txq->txq_dmamaps[i], ETHER_MAX_LEN, + if (r != 0) + goto err_reqs; + + r = vioif_dmamap_create(sc, &txq->txq_dmamaps[i], ETHER_MAX_LEN, VIRTIO_NET_TX_MAXNSEGS, "tx payload"); + if (r != 0) + goto err_reqs; } } if (sc->sc_has_ctrl) { /* control vq class & command */ - C_L(ctrlq->ctrlq_cmd_dmamap, + r = vioif_dmamap_create_load(sc, &ctrlq->ctrlq_cmd_dmamap, ctrlq->ctrlq_cmd, sizeof(*ctrlq->ctrlq_cmd), 1, BUS_DMA_WRITE, "control command"); - C_L(ctrlq->ctrlq_status_dmamap, + if (r != 0) + goto err_reqs; + + r = vioif_dmamap_create_load(sc, &ctrlq->ctrlq_status_dmamap, ctrlq->ctrlq_status, sizeof(*ctrlq->ctrlq_status), 1, BUS_DMA_READ, "control status"); + if (r != 0) + goto err_reqs; /* control vq rx mode command parameter */ - C_L(ctrlq->ctrlq_rx_dmamap, + r = vioif_dmamap_create_load(sc, &ctrlq->ctrlq_rx_dmamap, ctrlq->ctrlq_rx, sizeof(*ctrlq->ctrlq_rx), 1, BUS_DMA_WRITE, "rx mode control command"); + if (r != 0) + goto err_reqs; /* multiqueue set command */ - C_L(ctrlq->ctrlq_mq_dmamap, + r = vioif_dmamap_create_load(sc, &ctrlq->ctrlq_mq_dmamap, ctrlq->ctrlq_mq, sizeof(*ctrlq->ctrlq_mq), 1, BUS_DMA_WRITE, "multiqueue set command"); + if (r != 0) + goto err_reqs; /* control vq MAC filter table for unicast */ /* do not load now since its length is variable */ - C(ctrlq->ctrlq_tbl_uc_dmamap, + r = vioif_dmamap_create(sc, &ctrlq->ctrlq_tbl_uc_dmamap, sizeof(*ctrlq->ctrlq_mac_tbl_uc) + 0, 1, "unicast MAC address filter command"); + if (r != 0) + goto err_reqs; /* control vq MAC filter table for multicast */ - C(ctrlq->ctrlq_tbl_mc_dmamap, + r = vioif_dmamap_create(sc, &ctrlq->ctrlq_tbl_mc_dmamap, sizeof(*ctrlq->ctrlq_mac_tbl_mc) + ETHER_ADDR_LEN * VIRTIO_NET_CTRL_MAC_MAXENTRIES, 1, "multicast MAC address filter command"); } -#undef C_L -#undef C return 0; err_reqs: -#define D(map) \ - do { \ - if (map) { \ - bus_dmamap_destroy(virtio_dmat(vsc), map); \ - map = NULL; \ - } \ - } while (0) - D(ctrlq->ctrlq_tbl_mc_dmamap); - D(ctrlq->ctrlq_tbl_uc_dmamap); - D(ctrlq->ctrlq_rx_dmamap); - D(ctrlq->ctrlq_status_dmamap); - D(ctrlq->ctrlq_cmd_dmamap); + vioif_dmamap_destroy(sc, &ctrlq->ctrlq_tbl_mc_dmamap); + vioif_dmamap_destroy(sc, &ctrlq->ctrlq_tbl_uc_dmamap); + vioif_dmamap_destroy(sc, &ctrlq->ctrlq_rx_dmamap); + vioif_dmamap_destroy(sc, &ctrlq->ctrlq_status_dmamap); + vioif_dmamap_destroy(sc, &ctrlq->ctrlq_cmd_dmamap); for (qid = 0; qid < sc->sc_max_nvq_pairs; qid++) { rxq = &sc->sc_rxq[qid]; txq = &sc->sc_txq[qid]; for (i = 0; i < txq->txq_vq->vq_num; i++) { - D(txq->txq_dmamaps[i]); - D(txq->txq_hdr_dmamaps[i]); + vioif_dmamap_destroy(sc, &txq->txq_dmamaps[i]); + vioif_dmamap_destroy(sc, &txq->txq_hdr_dmamaps[i]); } for (i = 0; i < rxq->rxq_vq->vq_num; i++) { - D(rxq->rxq_dmamaps[i]); - D(rxq->rxq_hdr_dmamaps[i]); + vioif_dmamap_destroy(sc, &rxq->rxq_dmamaps[i]); + vioif_dmamap_destroy(sc, &rxq->rxq_hdr_dmamaps[i]); } } -#undef D if (sc->sc_kmem) { kmem_free(sc->sc_kmem, allocsize2); sc->sc_kmem = NULL;