|
@@ -34,6 +34,25 @@
|
|
|
/* How many pages do we try to swap or page in/out together? */
|
|
|
int page_cluster;
|
|
|
|
|
|
+/*
|
|
|
+ * This path almost never happens for VM activity - pages are normally
|
|
|
+ * freed via pagevecs. But it gets used by networking.
|
|
|
+ */
|
|
|
+static void fastcall __page_cache_release(struct page *page)
|
|
|
+{
|
|
|
+ if (PageLRU(page)) {
|
|
|
+ unsigned long flags;
|
|
|
+ struct zone *zone = page_zone(page);
|
|
|
+
|
|
|
+ spin_lock_irqsave(&zone->lru_lock, flags);
|
|
|
+ VM_BUG_ON(!PageLRU(page));
|
|
|
+ __ClearPageLRU(page);
|
|
|
+ del_page_from_lru(zone, page);
|
|
|
+ spin_unlock_irqrestore(&zone->lru_lock, flags);
|
|
|
+ }
|
|
|
+ free_hot_page(page);
|
|
|
+}
|
|
|
+
|
|
|
static void put_compound_page(struct page *page)
|
|
|
{
|
|
|
page = (struct page *)page_private(page);
|
|
@@ -222,26 +241,6 @@ int lru_add_drain_all(void)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-/*
|
|
|
- * This path almost never happens for VM activity - pages are normally
|
|
|
- * freed via pagevecs. But it gets used by networking.
|
|
|
- */
|
|
|
-void fastcall __page_cache_release(struct page *page)
|
|
|
-{
|
|
|
- if (PageLRU(page)) {
|
|
|
- unsigned long flags;
|
|
|
- struct zone *zone = page_zone(page);
|
|
|
-
|
|
|
- spin_lock_irqsave(&zone->lru_lock, flags);
|
|
|
- VM_BUG_ON(!PageLRU(page));
|
|
|
- __ClearPageLRU(page);
|
|
|
- del_page_from_lru(zone, page);
|
|
|
- spin_unlock_irqrestore(&zone->lru_lock, flags);
|
|
|
- }
|
|
|
- free_hot_page(page);
|
|
|
-}
|
|
|
-EXPORT_SYMBOL(__page_cache_release);
|
|
|
-
|
|
|
/*
|
|
|
* Batched page_cache_release(). Decrement the reference count on all the
|
|
|
* passed pages. If it fell to zero then remove the page from the LRU and
|