c
struct vmbus_channel {
    // ...
    bool ringbuffer_page_freed;
    // ...
};

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

    if (channel->ringbuffer_page && !channel->ringbuffer_page_freed) {
        __free_pages(channel->ringbuffer_page,
                      get_order(channel->ringbuffer_pagecount
                                << PAGE_SHIFT));
        channel->ringbuffer_page_freed = true;
    }
    channel->ringbuffer_page = NULL;
}
