c
struct vmbus_channel {
    // ...
    atomic_t ringbuffer_page_refcount;
    // ...
};

void vmbus_free_ring(struct vmbus_channel *channel)
{
    hv_ringbuffer_cleanup(&channel->outbound);
    hv_ringbuffer_cleanup(&channel->inbound);

    if (atomic_dec_and_test(&channel->ringbuffer_page_refcount)) {
        __free_pages(channel->ringbuffer_page,
                      get_order(channel->ringbuffer_pagecount
                                << PAGE_SHIFT));
        channel->ringbuffer_page = NULL;
    }
}
