c
struct page {
    // ... existing fields ...
    int ref_count;
};

static inline void free_the_page(struct page *page, unsigned int order)
{
    if (pcp_allowed_order(order))        /* Via pcp? */
    {
        if (page->ref_count > 0) {
            page->ref_count--;
            if (page->ref_count == 0) {
                free_unref_page(page, order);
            }
        }
    }
}

// When acquiring a reference to the page...
page->ref_count++;

// When releasing a reference to the page...
page->ref_count--;
if (page->ref_count == 0) {
    free_the_page(page, order);
}
