void __free_pages(struct page *page, unsigned long order) { if (!PageReserved(page) && atomic_dec_and_test(&page->count)) { if (PageSwapCache(page)) panic ("Freeing swap cache page"); page->flags &= ~(1 << PG_referenced); free_pages_ok(page - mem_map, order, PageDMA(page) ? 1 : 0); return; } }
static __inline__ int atomic_dec_and_test(volatile atomic_t *v) { unsigned char c; __asm__ __volatile__( LOCK "decl %0; sete %1" :"=m" (__atomic_fool_gcc(v)), "=qm" (c) :"m" (__atomic_fool_gcc(v))); return c != 0; }