> if (rbi->ring_buffer->feature_bits.feat_pending_send_sz) { > u32 pending_sz = READ_ONCE(rbi->ring_buffer->pending_send_sz); > > /* > + * Ensure the read of write_index in hv_get_bytes_to_write() > + * happens after the read of pending_send_sz. > + */ > + virt_rmb(); > + curr_write_sz = hv_get_bytes_to_write(rbi); > + > + /* > * If there was space before we began iteration, > * then host was not blocked. Also handles case where > * pending_sz is zero then host has nothing pending > * and does not need to be signaled. > */ > - if (orig_write_sz > pending_sz) > + if (curr_write_sz - delta > pending_sz) > return; > > /* If pending write will not fit, don't give false hope. */ > - if (hv_get_bytes_to_write(rbi) < pending_sz) > + if (curr_write_sz <= pending_sz) > return; > + > + vmbus_setevent(channel); > } > > - vmbus_setevent(channel); > } I think this won't work on older versions of Windows where feat_pending_sz is never set. On those versions vmbus_setevent needs to always be called. _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel