Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/hyperv hvn(4) can be added and deleted dynamically.
details: https://anonhg.NetBSD.org/src/rev/130b02fecb09
branches: trunk
changeset: 1005505:130b02fecb09
user: nonaka <nonaka%NetBSD.org@localhost>
date: Tue Dec 10 12:20:20 2019 +0000
description:
hvn(4) can be added and deleted dynamically.
diffstat:
sys/dev/hyperv/hyperv_common.c | 13 +-
sys/dev/hyperv/hypervvar.h | 6 +-
sys/dev/hyperv/if_hvn.c | 57 +++--
sys/dev/hyperv/vmbus.c | 378 ++++++++++++++++++++++------------------
sys/dev/hyperv/vmbusvar.h | 35 +--
5 files changed, 271 insertions(+), 218 deletions(-)
diffs (truncated from 948 to 300 lines):
diff -r 8682ef3755a4 -r 130b02fecb09 sys/dev/hyperv/hyperv_common.c
--- a/sys/dev/hyperv/hyperv_common.c Tue Dec 10 12:08:52 2019 +0000
+++ b/sys/dev/hyperv/hyperv_common.c Tue Dec 10 12:20:20 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: hyperv_common.c,v 1.4 2019/12/07 11:45:45 nonaka Exp $ */
+/* $NetBSD: hyperv_common.c,v 1.5 2019/12/10 12:20:20 nonaka Exp $ */
/*-
* Copyright (c) 2009-2012,2016-2017 Microsoft Corp.
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hyperv_common.c,v 1.4 2019/12/07 11:45:45 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hyperv_common.c,v 1.5 2019/12/10 12:20:20 nonaka Exp $");
#include "hyperv.h"
@@ -111,17 +111,18 @@
*/
void *
hyperv_dma_alloc(bus_dma_tag_t dmat, struct hyperv_dma *dma, bus_size_t size,
- bus_size_t alignment, bus_size_t boundary, int nsegs)
+ bus_size_t alignment, bus_size_t boundary, int nsegs, int flags)
{
- const int kmemflags = cold ? KM_NOSLEEP : KM_SLEEP;
- const int dmaflags = cold ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK;
+ const int waitok = (flags & HYPERV_DMA_NOSLEEP) != HYPERV_DMA_NOSLEEP;
+ const int kmemflags = waitok ? KM_SLEEP: KM_NOSLEEP;
+ const int dmaflags = waitok ? BUS_DMA_WAITOK : BUS_DMA_NOWAIT;
int rseg, error;
KASSERT(dma != NULL);
KASSERT(dma->segs == NULL);
KASSERT(nsegs > 0);
- dma->segs = kmem_zalloc(sizeof(*dma->segs) * nsegs, kmemflags);
+ dma->segs = kmem_intr_zalloc(sizeof(*dma->segs) * nsegs, kmemflags);
if (dma->segs == NULL)
return NULL;
diff -r 8682ef3755a4 -r 130b02fecb09 sys/dev/hyperv/hypervvar.h
--- a/sys/dev/hyperv/hypervvar.h Tue Dec 10 12:08:52 2019 +0000
+++ b/sys/dev/hyperv/hypervvar.h Tue Dec 10 12:20:20 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: hypervvar.h,v 1.3 2019/12/07 11:45:45 nonaka Exp $ */
+/* $NetBSD: hypervvar.h,v 1.4 2019/12/10 12:20:20 nonaka Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -108,8 +108,10 @@
return dma->map->dm_segs[0].ds_addr;
}
+#define HYPERV_DMA_SLEEPOK 0
+#define HYPERV_DMA_NOSLEEP __BIT(0)
void *hyperv_dma_alloc(bus_dma_tag_t, struct hyperv_dma *, bus_size_t,
- bus_size_t, bus_size_t, int);
+ bus_size_t, bus_size_t, int, int);
void hyperv_dma_free(bus_dma_tag_t, struct hyperv_dma *);
#endif /* _KERNEL */
diff -r 8682ef3755a4 -r 130b02fecb09 sys/dev/hyperv/if_hvn.c
--- a/sys/dev/hyperv/if_hvn.c Tue Dec 10 12:08:52 2019 +0000
+++ b/sys/dev/hyperv/if_hvn.c Tue Dec 10 12:20:20 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_hvn.c,v 1.12 2019/12/10 11:19:25 nonaka Exp $ */
+/* $NetBSD: if_hvn.c,v 1.13 2019/12/10 12:20:20 nonaka Exp $ */
/* $OpenBSD: if_hvn.c,v 1.39 2018/03/11 14:31:34 mikeb Exp $ */
/*-
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_hvn.c,v 1.12 2019/12/10 11:19:25 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_hvn.c,v 1.13 2019/12/10 12:20:20 nonaka Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -249,8 +249,6 @@
aprint_naive("\n");
aprint_normal(": Hyper-V NetVSC\n");
- strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
-
if (hvn_nvs_attach(sc)) {
aprint_error_dev(self, "failed to init NVSP\n");
return;
@@ -263,9 +261,10 @@
if (hvn_tx_ring_create(sc)) {
aprint_error_dev(self, "failed to create Tx ring\n");
- goto fail1;
+ goto fail2;
}
+ strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
ifp->if_softc = sc;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_ioctl = hvn_ioctl;
@@ -300,14 +299,14 @@
error = if_initialize(ifp);
if (error) {
aprint_error_dev(self, "if_initialize failed(%d)\n", error);
- goto fail2;
+ goto fail3;
}
sc->sc_ipq = if_percpuq_create(ifp);
if_deferred_start_init(ifp, NULL);
if (hvn_rndis_attach(sc)) {
aprint_error_dev(self, "failed to init RNDIS\n");
- goto fail1;
+ goto fail3;
}
aprint_normal_dev(self, "NVS %d.%d NDIS %d.%d\n",
@@ -316,13 +315,13 @@
if (hvn_set_capabilities(sc)) {
aprint_error_dev(self, "failed to setup offloading\n");
- goto fail2;
+ goto fail4;
}
if (hvn_get_lladdr(sc, enaddr)) {
aprint_error_dev(self,
"failed to obtain an ethernet address\n");
- goto fail2;
+ goto fail4;
}
aprint_normal_dev(self, "Ethernet address %s\n", ether_sprintf(enaddr));
@@ -337,10 +336,11 @@
SET(sc->sc_flags, HVN_SCF_ATTACHED);
return;
-fail2: hvn_rndis_detach(sc);
-fail1: hvn_rx_ring_destroy(sc);
- hvn_tx_ring_destroy(sc);
- hvn_nvs_detach(sc);
+fail4: hvn_rndis_detach(sc);
+ if_percpuq_destroy(sc->sc_ipq);
+fail3: hvn_tx_ring_destroy(sc);
+fail2: hvn_rx_ring_destroy(sc);
+fail1: hvn_nvs_detach(sc);
}
static int
@@ -352,7 +352,8 @@
if (!ISSET(sc->sc_flags, HVN_SCF_ATTACHED))
return 0;
- hvn_stop(ifp, 1);
+ if (ifp->if_flags & IFF_RUNNING)
+ hvn_stop(ifp, 1);
pmf_device_deregister(self);
@@ -693,7 +694,8 @@
else
sc->sc_rx_size = 16 * 1024 * 1024; /* 16MB */
sc->sc_rx_ring = hyperv_dma_alloc(sc->sc_dmat, &sc->sc_rx_dma,
- sc->sc_rx_size, PAGE_SIZE, PAGE_SIZE, sc->sc_rx_size / PAGE_SIZE);
+ sc->sc_rx_size, PAGE_SIZE, PAGE_SIZE, sc->sc_rx_size / PAGE_SIZE,
+ HYPERV_DMA_SLEEPOK);
if (sc->sc_rx_ring == NULL) {
DPRINTF("%s: failed to allocate Rx ring buffer\n",
device_xname(sc->sc_dev));
@@ -735,7 +737,7 @@
sc->sc_rx_hndl = 0;
}
if (sc->sc_rx_ring) {
- kmem_free(sc->sc_rx_ring, sc->sc_rx_size);
+ hyperv_dma_free(sc->sc_dmat, &sc->sc_rx_dma);
sc->sc_rx_ring = NULL;
}
return -1;
@@ -761,10 +763,9 @@
delay(100);
vmbus_handle_free(sc->sc_chan, sc->sc_rx_hndl);
-
sc->sc_rx_hndl = 0;
- kmem_free(sc->sc_rx_ring, sc->sc_rx_size);
+ hyperv_dma_free(sc->sc_dmat, &sc->sc_rx_dma);
sc->sc_rx_ring = NULL;
return 0;
@@ -854,25 +855,25 @@
txd->txd_dmap = NULL;
if (txd->txd_buf == NULL)
continue;
- m_free(txd->txd_buf);
+ m_freem(txd->txd_buf);
txd->txd_buf = NULL;
}
- if (sc->sc_tx_rmap) {
+ if (sc->sc_tx_rmap != NULL) {
bus_dmamap_sync(sc->sc_dmat, sc->sc_tx_rmap,
- 0, txd->txd_dmap->dm_mapsize,
+ 0, sc->sc_tx_rmap->dm_mapsize,
BUS_DMASYNC_POSTWRITE);
bus_dmamap_unload(sc->sc_dmat, sc->sc_tx_rmap);
bus_dmamap_destroy(sc->sc_dmat, sc->sc_tx_rmap);
+ sc->sc_tx_rmap = NULL;
}
- if (sc->sc_tx_msgs) {
+ if (sc->sc_tx_msgs != NULL) {
size_t msgsize = roundup(HVN_RNDIS_PKT_LEN, 128);
bus_dmamem_unmap(sc->sc_dmat, sc->sc_tx_msgs,
msgsize * HVN_TX_DESC);
bus_dmamem_free(sc->sc_dmat, &sc->sc_tx_mseg, 1);
+ sc->sc_tx_msgs = NULL;
}
- sc->sc_tx_rmap = NULL;
- sc->sc_tx_msgs = NULL;
}
static int
@@ -1414,6 +1415,10 @@
"RNDIS operation %u send error %d\n", hdr->rm_type, rv);
return rv;
}
+ if (vmbus_channel_is_revoked(sc->sc_chan)) {
+ /* No response */
+ return 0;
+ }
bus_dmamap_sync(sc->sc_dmat, rc->rc_dmap, 0, PAGE_SIZE,
BUS_DMASYNC_POSTWRITE);
@@ -1843,4 +1848,8 @@
device_xname(sc->sc_dev), rv);
}
hvn_free_cmd(sc, rc);
+
+ mutex_destroy(&sc->sc_cntl_sqlck);
+ mutex_destroy(&sc->sc_cntl_cqlck);
+ mutex_destroy(&sc->sc_cntl_fqlck);
}
diff -r 8682ef3755a4 -r 130b02fecb09 sys/dev/hyperv/vmbus.c
--- a/sys/dev/hyperv/vmbus.c Tue Dec 10 12:08:52 2019 +0000
+++ b/sys/dev/hyperv/vmbus.c Tue Dec 10 12:20:20 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vmbus.c,v 1.7 2019/12/07 11:45:45 nonaka Exp $ */
+/* $NetBSD: vmbus.c,v 1.8 2019/12/10 12:20:20 nonaka Exp $ */
/* $OpenBSD: hyperv.c,v 1.43 2017/06/27 13:56:15 mikeb Exp $ */
/*-
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vmbus.c,v 1.7 2019/12/07 11:45:45 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vmbus.c,v 1.8 2019/12/10 12:20:20 nonaka Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -46,6 +46,7 @@
#include <sys/cpu.h>
#include <sys/intr.h>
#include <sys/kmem.h>
+#include <sys/kthread.h>
#include <sys/module.h>
#include <sys/mutex.h>
#include <sys/xcall.h>
@@ -62,6 +63,7 @@
#define HCF_NOREPLY 0x0004
static void vmbus_attach_deferred(device_t);
+static int vmbus_attach_print(void *, const char *);
static int vmbus_alloc_dma(struct vmbus_softc *);
static void vmbus_free_dma(struct vmbus_softc *);
static int vmbus_init_interrupts(struct vmbus_softc *);
@@ -92,16 +94,22 @@
struct vmbus_chanmsg_hdr *);
static int vmbus_channel_scan(struct vmbus_softc *);
static void vmbus_channel_cpu_default(struct vmbus_channel *);
-static void vmbus_process_offer(struct vmbus_softc *, struct vmbus_offer *);
+static void vmbus_process_offer(struct vmbus_softc *,
+ struct vmbus_chanmsg_choffer *);
+static void vmbus_process_rescind(struct vmbus_softc *,
+ struct vmbus_chanmsg_chrescind *);
static struct vmbus_channel *
vmbus_channel_lookup(struct vmbus_softc *, uint32_t);
static int vmbus_channel_ring_create(struct vmbus_channel *, uint32_t);
static void vmbus_channel_ring_destroy(struct vmbus_channel *);
+static void vmbus_channel_detach(struct vmbus_channel *);
static void vmbus_channel_pause(struct vmbus_channel *);
static uint32_t vmbus_channel_unpause(struct vmbus_channel *);
static uint32_t vmbus_channel_ready(struct vmbus_channel *);
-static int vmbus_attach_icdevs(struct vmbus_softc *);
-static int vmbus_attach_devices(struct vmbus_softc *);
+static void vmbus_devq_enqueue(struct vmbus_softc *, int,
+ struct vmbus_channel *);
+static void vmbus_process_devq(void *);
+static void vmbus_devq_thread(void *);
Home |
Main Index |
Thread Index |
Old Index