c
// ... in vmbus_channel structure ...
    bool ringbuffer_page_freed;

// ... initialization ...
    channel->ringbuffer_page_freed = false;


static inline void free_the_page(struct page *page, unsigned int order) {
    if (pcp_allowed_order(order) && page != NULL && !page->freed) { /* Check the flag */
        page->freed = true;             // Set flag to true so future calls know it's already freed.
        free_unref_page(page, order);
    }
}

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

        if (!channel->ringbuffer_page_freed) { /* Check the flag */
            __free_pages(channel->ringbuffer_page, get_order(channel->ringbuffer_pagecount << PAGE_SHIFT));
            channel->ringbuffer_page_freed = true;  // Set to true if freed here.
        }

        channel->ringbuffer_page = NULL; 
    }
}
