|
|
@@ -740,15 +740,20 @@ void release_pages(struct page **pages, int nr)
|
|
|
if (is_huge_zero_page(page))
|
|
|
continue;
|
|
|
|
|
|
- /* Device public page can not be huge page */
|
|
|
- if (is_device_public_page(page)) {
|
|
|
+ if (is_zone_device_page(page)) {
|
|
|
if (locked_pgdat) {
|
|
|
spin_unlock_irqrestore(&locked_pgdat->lru_lock,
|
|
|
flags);
|
|
|
locked_pgdat = NULL;
|
|
|
}
|
|
|
- put_devmap_managed_page(page);
|
|
|
- continue;
|
|
|
+ /*
|
|
|
+ * ZONE_DEVICE pages that return 'false' from
|
|
|
+ * put_devmap_managed_page() do not require special
|
|
|
+ * processing, and instead, expect a call to
|
|
|
+ * put_page_testzero().
|
|
|
+ */
|
|
|
+ if (put_devmap_managed_page(page))
|
|
|
+ continue;
|
|
|
}
|
|
|
|
|
|
page = compound_head(page);
|