svn commit: r296296 - in head/sys/dev/hyperv: include netvsc
Sepherosa Ziehau
sephe at FreeBSD.org
Wed Mar 2 03:07:33 UTC 2016
Author: sephe
Date: Wed Mar 2 03:07:31 2016
New Revision: 296296
URL: https://svnweb.freebsd.org/changeset/base/296296
Log:
hyperv/hn: Make read buffer per-channel
Submitted by: Hongjiang Zhang <honzhan microsoft com>
Reorganized by: sephe
MFC after: 1 week
Sponsored by: Microsoft OSTC
Modified:
head/sys/dev/hyperv/include/hyperv.h
head/sys/dev/hyperv/netvsc/hv_net_vsc.c
head/sys/dev/hyperv/netvsc/hv_net_vsc.h
Modified: head/sys/dev/hyperv/include/hyperv.h
==============================================================================
--- head/sys/dev/hyperv/include/hyperv.h Wed Mar 2 02:29:35 2016 (r296295)
+++ head/sys/dev/hyperv/include/hyperv.h Wed Mar 2 03:07:31 2016 (r296296)
@@ -828,6 +828,7 @@ typedef struct hv_vmbus_channel {
*/
void *hv_chan_priv1;
void *hv_chan_priv2;
+ void *hv_chan_priv3;
} hv_vmbus_channel;
#define HV_VMBUS_CHAN_ISPRIMARY(chan) ((chan)->primary_channel == NULL)
Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.c Wed Mar 2 02:29:35 2016 (r296295)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.c Wed Mar 2 03:07:31 2016 (r296296)
@@ -49,6 +49,9 @@
#include "hv_rndis.h"
#include "hv_rndis_filter.h"
+/* priv1 and priv1 are consumed by the main driver */
+#define hv_chan_rdbuf hv_chan_priv3
+
MALLOC_DEFINE(M_NETVSC, "netvsc", "Hyper-V netvsc driver");
/*
@@ -666,25 +669,30 @@ hv_nv_disconnect_from_vsp(netvsc_dev *ne
netvsc_dev *
hv_nv_on_device_add(struct hv_device *device, void *additional_info)
{
+ struct hv_vmbus_channel *chan = device->channel;
netvsc_dev *net_dev;
int ret = 0;
net_dev = hv_nv_alloc_net_device(device);
- if (!net_dev)
- goto cleanup;
+ if (net_dev == NULL)
+ return NULL;
/* Initialize the NetVSC channel extension */
sema_init(&net_dev->channel_init_sema, 0, "netdev_sema");
+ chan->hv_chan_rdbuf = malloc(NETVSC_PACKET_SIZE, M_NETVSC, M_WAITOK);
+
/*
* Open the channel
*/
- ret = hv_vmbus_channel_open(device->channel,
+ ret = hv_vmbus_channel_open(chan,
NETVSC_DEVICE_RING_BUFFER_SIZE, NETVSC_DEVICE_RING_BUFFER_SIZE,
- NULL, 0, hv_nv_on_channel_callback, device->channel);
- if (ret != 0)
+ NULL, 0, hv_nv_on_channel_callback, chan);
+ if (ret != 0) {
+ free(chan->hv_chan_rdbuf, M_NETVSC);
goto cleanup;
+ }
/*
* Connect with the NetVsp
@@ -697,8 +705,8 @@ hv_nv_on_device_add(struct hv_device *de
close:
/* Now, we can close the channel safely */
-
- hv_vmbus_channel_close(device->channel);
+ free(chan->hv_chan_rdbuf, M_NETVSC);
+ hv_vmbus_channel_close(chan);
cleanup:
/*
@@ -736,6 +744,7 @@ hv_nv_on_device_remove(struct hv_device
HV_CHANNEL_CLOSING_NONDESTRUCTIVE_STATE;
}
+ free(device->channel->hv_chan_rdbuf, M_NETVSC);
hv_vmbus_channel_close(device->channel);
sema_destroy(&net_dev->channel_init_sema);
@@ -975,7 +984,7 @@ hv_nv_on_channel_callback(void *xchan)
if (net_dev == NULL)
return;
- buffer = net_dev->callback_buf;
+ buffer = chan->hv_chan_rdbuf;
do {
ret = hv_vmbus_channel_recv_packet_raw(chan,
Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.h Wed Mar 2 02:29:35 2016 (r296295)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.h Wed Mar 2 03:07:31 2016 (r296296)
@@ -923,8 +923,6 @@ typedef struct netvsc_dev_ {
hv_bool_uint8_t destroy;
/* Negotiated NVSP version */
uint32_t nvsp_version;
-
- uint8_t callback_buf[NETVSC_PACKET_SIZE];
} netvsc_dev;
More information about the svn-src-all
mailing list