Page MenuHomeFreeBSD

D6404.diff
No OneTemporary

D6404.diff

Index: head/sys/dev/hyperv/vmbus/hv_connection.c
===================================================================
--- head/sys/dev/hyperv/vmbus/hv_connection.c
+++ head/sys/dev/hyperv/vmbus/hv_connection.c
@@ -332,32 +332,32 @@
*/
for (f = 0; f < flag_cnt; f++) {
uint32_t rel_id_base;
+ unsigned long flags;
int bit;
if (intr_flags[f] == 0)
continue;
+ flags = atomic_swap_long(&intr_flags[f], 0);
rel_id_base = f << HV_CHANNEL_ULONG_SHIFT;
- for (bit = 0; bit < HV_CHANNEL_ULONG_LEN; bit++) {
- if (atomic_testandclear_long(&intr_flags[f], bit)) {
- struct hv_vmbus_channel *channel;
- uint32_t rel_id;
-
- rel_id = rel_id_base + bit;
- channel =
- hv_vmbus_g_connection.channels[rel_id];
-
- /* if channel is closed or closing */
- if (channel == NULL || channel->rxq == NULL)
- continue;
-
- if (channel->batched_reading) {
- hv_ring_buffer_read_begin(
- &channel->inbound);
- }
- taskqueue_enqueue(channel->rxq,
- &channel->channel_task);
- }
+
+ while ((bit = ffsl(flags)) != 0) {
+ struct hv_vmbus_channel *channel;
+ uint32_t rel_id;
+
+ --bit; /* NOTE: ffsl is 1-based */
+ flags &= ~(1UL << bit);
+
+ rel_id = rel_id_base + bit;
+ channel = hv_vmbus_g_connection.channels[rel_id];
+
+ /* if channel is closed or closing */
+ if (channel == NULL || channel->rxq == NULL)
+ continue;
+
+ if (channel->batched_reading)
+ hv_ring_buffer_read_begin(&channel->inbound);
+ taskqueue_enqueue(channel->rxq, &channel->channel_task);
}
}
}

File Metadata

Mime Type
text/plain
Expires
Fri, Feb 7, 9:45 AM (21 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16508864
Default Alt Text
D6404.diff (1 KB)

Event Timeline