diff
+ static inline void vmbus_get_ringbuffer_page(struct vmbus_channel *channel)
+ {
+     atomic_inc(&channel->ringbuffer_refcount);
+ }
+
+ static inline void vmbus_put_ringbuffer_page(struct vmbus_channel *channel)
+ {
+     if (atomic_dec_and_test(&channel->ringbuffer_refcount)) {
+         __free_pages(channel->ringbuffer_page,
+                      get_order(channel->ringbuffer_pagecount * PAGE_SIZE));
+         channel->ringbuffer_page = NULL;
+         channel->ringbuffer_pagecount = 0;
+     }
+ }

1281 void vmbus_free_ring(struct vmbus_channel *channel)
1283         hv_ringbuffer_cleanup(&channel->outbound);
1284         hv_ringbuffer_cleanup(&channel->inbound);
1286         if (channel->ringbuffer_page) {
-1287                 __free_pages(channel->ringbuffer_page,
+1287                 vmbus_put_ringbuffer_page(channel);
1288         }
