Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F149873530
D5457.id13785.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D5457.id13785.diff
View Options
Index: head/sys/dev/hyperv/netvsc/hv_net_vsc.h
===================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.h
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.h
@@ -1017,6 +1017,8 @@
#define HN_TRUST_HCSUM_TCP 0x0002
#define HN_TRUST_HCSUM_UDP 0x0004
+struct hv_vmbus_channel;
+
struct hn_tx_ring {
#ifndef HN_USE_TXDESC_BUFRING
struct mtx hn_txlist_spin;
@@ -1039,6 +1041,7 @@
struct mtx hn_tx_lock;
struct hn_softc *hn_sc;
+ struct hv_vmbus_channel *hn_chan;
int hn_direct_tx_size;
int hn_tx_chimney_size;
@@ -1096,7 +1099,7 @@
void *additional_info);
int hv_nv_on_device_remove(struct hv_device *device,
boolean_t destroy_channel);
-int hv_nv_on_send(struct hv_device *device, netvsc_packet *pkt);
+int hv_nv_on_send(struct hv_vmbus_channel *chan, netvsc_packet *pkt);
int hv_nv_get_next_send_section(netvsc_dev *net_dev);
#endif /* __HV_NET_VSC_H__ */
Index: head/sys/dev/hyperv/netvsc/hv_net_vsc.c
===================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.c
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.c
@@ -809,7 +809,7 @@
* Returns 0 on success, non-zero on failure.
*/
int
-hv_nv_on_send(struct hv_device *device, netvsc_packet *pkt)
+hv_nv_on_send(struct hv_vmbus_channel *chan, netvsc_packet *pkt)
{
nvsp_msg send_msg;
int ret;
@@ -829,11 +829,11 @@
pkt->send_buf_section_size;
if (pkt->page_buf_count) {
- ret = hv_vmbus_channel_send_packet_pagebuffer(device->channel,
+ ret = hv_vmbus_channel_send_packet_pagebuffer(chan,
pkt->page_buffers, pkt->page_buf_count,
&send_msg, sizeof(nvsp_msg), (uint64_t)(uintptr_t)pkt);
} else {
- ret = hv_vmbus_channel_send_packet(device->channel,
+ ret = hv_vmbus_channel_send_packet(chan,
&send_msg, sizeof(nvsp_msg), (uint64_t)(uintptr_t)pkt,
HV_VMBUS_PACKET_TYPE_DATA_IN_BAND,
HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
Index: head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
===================================================================
--- head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
+++ head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
@@ -436,6 +436,7 @@
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;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
ifp->if_dunit = unit;
@@ -854,6 +855,8 @@
/*
* Chimney send, if the packet could fit into one chimney buffer.
+ *
+ * TODO: vRSS, chimney buffer should be per-channel.
*/
if (packet->tot_data_buf_len < txr->hn_tx_chimney_size) {
netvsc_dev *net_dev = txr->hn_sc->net_dev;
@@ -940,8 +943,7 @@
* associated w/ the txd will _not_ be freed.
*/
static int
-hn_send_pkt(struct ifnet *ifp, struct hv_device *device_ctx,
- struct hn_tx_ring *txr, struct hn_txdesc *txd)
+hn_send_pkt(struct ifnet *ifp, struct hn_tx_ring *txr, struct hn_txdesc *txd)
{
int error, send_failed = 0;
@@ -950,7 +952,7 @@
* Make sure that txd is not freed before ETHER_BPF_MTAP.
*/
hn_txdesc_hold(txd);
- error = hv_nv_on_send(device_ctx, &txd->netvsc_pkt);
+ error = hv_nv_on_send(txr->hn_chan, &txd->netvsc_pkt);
if (!error) {
ETHER_BPF_MTAP(ifp, txd->m);
if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
@@ -1010,7 +1012,6 @@
{
struct hn_softc *sc = txr->hn_sc;
struct ifnet *ifp = sc->hn_ifp;
- struct hv_device *device_ctx = vmbus_get_devctx(sc->hn_dev);
KASSERT(hn_use_if_start,
("hn_start_locked is called, when if_start is disabled"));
@@ -1054,7 +1055,7 @@
continue;
}
- error = hn_send_pkt(ifp, device_ctx, txr, txd);
+ error = hn_send_pkt(ifp, txr, txd);
if (__predict_false(error)) {
/* txd is freed, but m_head is not */
IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
@@ -2497,7 +2498,6 @@
{
struct hn_softc *sc = txr->hn_sc;
struct ifnet *ifp = sc->hn_ifp;
- struct hv_device *device_ctx = vmbus_get_devctx(sc->hn_dev);
struct mbuf *m_head;
mtx_assert(&txr->hn_tx_lock, MA_OWNED);
@@ -2536,7 +2536,7 @@
continue;
}
- error = hn_send_pkt(ifp, device_ctx, txr, txd);
+ error = hn_send_pkt(ifp, txr, txd);
if (__predict_false(error)) {
/* txd is freed, but m_head is not */
drbr_putback(ifp, txr->hn_mbuf_br, m_head);
Index: head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
===================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
+++ head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
@@ -250,7 +250,7 @@
NVSP_1_CHIMNEY_SEND_INVALID_SECTION_INDEX;
packet->send_buf_section_size = 0;
- ret = hv_nv_on_send(device->net_dev->dev, packet);
+ ret = hv_nv_on_send(device->net_dev->dev->channel, packet);
return (ret);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 28, 6:38 PM (1 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30488365
Default Alt Text
D5457.id13785.diff (4 KB)
Attached To
Mode
D5457: hyperv/hn: Make transmission path channel aware
Attached
Detach File
Event Timeline
Log In to Comment