Page MenuHomeFreeBSD

D7038.id18044.diff
No OneTemporary

D7038.id18044.diff

Index: sys/dev/hyperv/include/hyperv.h
===================================================================
--- sys/dev/hyperv/include/hyperv.h
+++ sys/dev/hyperv/include/hyperv.h
@@ -551,17 +551,6 @@
hv_vmbus_pfn_channel_callback on_channel_callback;
void* channel_callback_context;
- /*
- * If batched_reading is set to "true", mask the interrupt
- * and read until the channel is empty.
- * If batched_reading is set to "false", the channel is not
- * going to perform batched reading.
- *
- * Batched reading is enabled by default; specific
- * drivers that don't want this behavior can turn it off.
- */
- boolean_t batched_reading;
-
struct hypercall_sigevt_in *ch_sigevt;
struct hyperv_dma ch_sigevt_dma;
@@ -622,11 +611,23 @@
#define HV_VMBUS_CHAN_ISPRIMARY(chan) ((chan)->primary_channel == NULL)
#define VMBUS_CHAN_FLAG_HASMNF 0x0001
+/*
+ * If this flag is set, this channel's interrupt will be masked in ISR,
+ * and the RX bufring will be drained before this channel's interrupt is
+ * unmasked.
+ *
+ * This flag is turned on by default. Drivers can turn it off according
+ * to their own requirement.
+ */
+#define VMBUS_CHAN_FLAG_BATCHREAD 0x0002
static inline void
-hv_set_channel_read_state(hv_vmbus_channel* channel, boolean_t state)
+hv_set_channel_read_state(hv_vmbus_channel* channel, boolean_t on)
{
- channel->batched_reading = state;
+ if (!on)
+ channel->ch_flags &= ~VMBUS_CHAN_FLAG_BATCHREAD;
+ else
+ channel->ch_flags |= VMBUS_CHAN_FLAG_BATCHREAD;
}
int hv_vmbus_channel_recv_packet(
Index: sys/dev/hyperv/vmbus/hv_channel.c
===================================================================
--- sys/dev/hyperv/vmbus/hv_channel.c
+++ sys/dev/hyperv/vmbus/hv_channel.c
@@ -856,11 +856,13 @@
void* arg;
uint32_t bytes_to_read;
hv_vmbus_channel* channel = (hv_vmbus_channel*)context;
- boolean_t is_batched_reading;
+ bool is_batched_reading = false;
+
+ if (channel->ch_flags & VMBUS_CHAN_FLAG_BATCHREAD)
+ is_batched_reading = true;
if (channel->on_channel_callback != NULL) {
arg = channel->channel_callback_context;
- is_batched_reading = channel->batched_reading;
/*
* Optimize host to guest signaling by ensuring:
* 1. While reading the channel, we disable interrupts from
@@ -917,7 +919,7 @@
if (channel == NULL || channel->rxq == NULL)
continue;
- if (channel->batched_reading)
+ if (channel->ch_flags & VMBUS_CHAN_FLAG_BATCHREAD)
hv_ring_buffer_read_begin(&channel->inbound);
taskqueue_enqueue(channel->rxq, &channel->channel_task);
}
Index: sys/dev/hyperv/vmbus/hv_channel_mgmt.c
===================================================================
--- sys/dev/hyperv/vmbus/hv_channel_mgmt.c
+++ sys/dev/hyperv/vmbus/hv_channel_mgmt.c
@@ -282,21 +282,19 @@
{
hv_vmbus_channel* new_channel;
- /* Allocate the channel object and save this offer */
+ /*
+ * Allocate the channel object and save this offer
+ */
new_channel = hv_vmbus_allocate_channel(sc);
new_channel->ch_id = offer->child_rel_id;
new_channel->ch_subidx = offer->offer.sub_channel_index;
- if (offer->monitor_allocated)
- new_channel->ch_flags |= VMBUS_CHAN_FLAG_HASMNF;
new_channel->ch_guid_type = offer->offer.interface_type;
new_channel->ch_guid_inst = offer->offer.interface_instance;
- /*
- * By default we setup state to enable batched
- * reading. A specific service can choose to
- * disable this prior to opening the channel.
- */
- new_channel->batched_reading = TRUE;
+ /* Batch reading is on by default */
+ new_channel->ch_flags |= VMBUS_CHAN_FLAG_BATCHREAD;
+ if (offer->monitor_allocated)
+ new_channel->ch_flags |= VMBUS_CHAN_FLAG_HASMNF;
new_channel->ch_sigevt = hyperv_dmamem_alloc(
bus_get_dma_tag(sc->vmbus_dev),
@@ -310,7 +308,6 @@
return;
}
new_channel->ch_sigevt->hc_connid = VMBUS_CONNID_EVENT;
-
if (sc->vmbus_version != VMBUS_VERSION_WS2008)
new_channel->ch_sigevt->hc_connid = offer->connection_id;

File Metadata

Mime Type
text/plain
Expires
Thu, Nov 13, 11:13 AM (2 h, 46 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25254532
Default Alt Text
D7038.id18044.diff (3 KB)

Event Timeline