Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F167240069
D5577.id14155.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D5577.id14155.diff
View Options
Index: sys/dev/hyperv/netvsc/hv_net_vsc.h
===================================================================
--- sys/dev/hyperv/netvsc/hv_net_vsc.h
+++ sys/dev/hyperv/netvsc/hv_net_vsc.h
@@ -1167,12 +1167,15 @@
/* Rarely used stuffs */
struct sysctl_oid *hn_rx_sysctl_tree;
+ int hn_rx_flags;
} __aligned(CACHE_LINE_SIZE);
#define HN_TRUST_HCSUM_IP 0x0001
#define HN_TRUST_HCSUM_TCP 0x0002
#define HN_TRUST_HCSUM_UDP 0x0004
+#define HN_RX_FLAG_ATTACHED 0x1
+
struct hn_tx_ring {
#ifndef HN_USE_TXDESC_BUFRING
struct mtx hn_txlist_spin;
@@ -1214,8 +1217,11 @@
struct hn_txdesc *hn_txdesc;
bus_dma_tag_t hn_tx_rndis_dtag;
struct sysctl_oid *hn_tx_sysctl_tree;
+ int hn_tx_flags;
} __aligned(CACHE_LINE_SIZE);
+#define HN_TX_FLAG_ATTACHED 0x1
+
/*
* Device-specific softc structure
*/
Index: sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
===================================================================
--- sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
+++ sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
@@ -323,6 +323,7 @@
static void hn_create_rx_data(struct hn_softc *sc, int);
static void hn_destroy_rx_data(struct hn_softc *sc);
static void hn_set_tx_chimney_size(struct hn_softc *, int);
+static void hn_channel_attach(struct hn_softc *, struct hv_vmbus_channel *);
static int hn_transmit(struct ifnet *, struct mbuf *);
static void hn_xmit_qflush(struct ifnet *);
@@ -462,10 +463,11 @@
* Associate the first TX/RX ring w/ the primary channel.
*/
chan = device_ctx->channel;
- chan->hv_chan_rxr = &sc->hn_rx_ring[0];
- chan->hv_chan_txr = &sc->hn_tx_ring[0];
- sc->hn_tx_ring[0].hn_chan = chan;
- vmbus_channel_cpu_set(chan, sc->hn_cpu);
+ KASSERT(HV_VMBUS_CHAN_ISPRIMARY(chan), ("not primary channel"));
+ KASSERT(chan->offer_msg.offer.sub_channel_index == 0,
+ ("primary channel subidx %u",
+ chan->offer_msg.offer.sub_channel_index));
+ hn_channel_attach(sc, chan);
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_ioctl = hn_ioctl;
@@ -2766,30 +2768,53 @@
mtx_unlock(&txr->hn_tx_lock);
}
-void
-netvsc_subchan_callback(struct hn_softc *sc, struct hv_vmbus_channel *chan)
+static void
+hn_channel_attach(struct hn_softc *sc, struct hv_vmbus_channel *chan)
{
+ struct hn_rx_ring *rxr;
int idx;
- KASSERT(!HV_VMBUS_CHAN_ISPRIMARY(chan),
- ("subchannel callback on primary channel"));
-
idx = chan->offer_msg.offer.sub_channel_index;
- KASSERT(idx > 0 && idx < sc->hn_rx_ring_inuse,
+
+ KASSERT(idx >= 0 && idx < sc->hn_rx_ring_inuse,
("invalid channel index %d, should > 0 && < %d",
idx, sc->hn_rx_ring_inuse));
- vmbus_channel_cpu_set(chan, (sc->hn_cpu + idx) % mp_ncpus);
+ rxr = &sc->hn_rx_ring[idx];
+ KASSERT((rxr->hn_rx_flags & HN_RX_FLAG_ATTACHED) == 0,
+ ("RX ring %d already attached", idx));
+ rxr->hn_rx_flags |= HN_RX_FLAG_ATTACHED;
- chan->hv_chan_rxr = &sc->hn_rx_ring[idx];
+ chan->hv_chan_rxr = rxr;
if_printf(sc->hn_ifp, "link RX ring %d to channel%u\n",
idx, chan->offer_msg.child_rel_id);
if (idx < sc->hn_tx_ring_inuse) {
- chan->hv_chan_txr = &sc->hn_tx_ring[idx];
- sc->hn_tx_ring[idx].hn_chan = chan;
+ struct hn_tx_ring *txr = &sc->hn_tx_ring[idx];
+
+ KASSERT((txr->hn_tx_flags & HN_TX_FLAG_ATTACHED) == 0,
+ ("TX ring %d already attached", idx));
+ txr->hn_tx_flags |= HN_TX_FLAG_ATTACHED;
+
+ chan->hv_chan_txr = txr;
+ txr->hn_chan = chan;
if_printf(sc->hn_ifp, "link TX ring %d to channel%u\n",
idx, chan->offer_msg.child_rel_id);
}
+
+ /* Bind channel to a proper CPU */
+ vmbus_channel_cpu_set(chan, (sc->hn_cpu + idx) % mp_ncpus);
+}
+
+void
+netvsc_subchan_callback(struct hn_softc *sc, struct hv_vmbus_channel *chan)
+{
+
+ KASSERT(!HV_VMBUS_CHAN_ISPRIMARY(chan),
+ ("subchannel callback on primary channel"));
+ KASSERT(chan->offer_msg.offer.sub_channel_index > 0,
+ ("invalid channel subidx %u",
+ chan->offer_msg.offer.sub_channel_index));
+ hn_channel_attach(sc, chan);
}
static void
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Aug 21, 6:30 AM (28 s ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37023730
Default Alt Text
D5577.id14155.diff (3 KB)
Attached To
Mode
D5577: hyperv/hn: Factor out hn_channel_attach
Attached
Detach File
Event Timeline
Log In to Comment