#define page_cache_release(page) put_page(page)
void release_pages(struct page **pages, int nr, int cold);
-#ifdef CONFIG_NUMA
-extern struct page *page_cache_alloc(struct address_space *x);
-extern struct page *page_cache_alloc_cold(struct address_space *x);
-#else
static inline struct page *page_cache_alloc(struct address_space *x)
{
return alloc_pages(mapping_gfp_mask(x), 0);
{
return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, 0);
}
-#endif
typedef int filler_t(void *, struct page *);
unsigned long index);
extern struct page * find_lock_page(struct address_space *mapping,
unsigned long index);
-extern __deprecated_for_modules struct page * find_trylock_page(
- struct address_space *mapping, unsigned long index);
+extern struct page * find_trylock_page(struct address_space *mapping,
+ unsigned long index);
extern struct page * find_or_create_page(struct address_space *mapping,
unsigned long index, gfp_t gfp_mask);
unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
unsigned int nr_pages, struct page **pages);
-unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t start,
- unsigned int nr_pages, struct page **pages);
unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
int tag, unsigned int nr_pages, struct page **pages);
extern int read_cache_pages(struct address_space *mapping,
struct list_head *pages, filler_t *filler, void *data);
-static inline struct page *read_mapping_page(struct address_space *mapping,
- unsigned long index, void *data)
-{
- filler_t *filler = (filler_t *)mapping->a_ops->readpage;
- return read_cache_page(mapping, index, filler, data);
-}
-
int add_to_page_cache(struct page *page, struct address_space *mapping,
unsigned long index, gfp_t gfp_mask);
int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
extern void remove_from_page_cache(struct page *page);
extern void __remove_from_page_cache(struct page *page);
+extern atomic_t nr_pagecache;
+
+#ifdef CONFIG_SMP
+
+#define PAGECACHE_ACCT_THRESHOLD max(16, NR_CPUS * 2)
+DECLARE_PER_CPU(long, nr_pagecache_local);
+
+/*
+ * pagecache_acct implements approximate accounting for pagecache.
+ * vm_enough_memory() do not need high accuracy. Writers will keep
+ * an offset in their per-cpu arena and will spill that into the
+ * global count whenever the absolute value of the local count
+ * exceeds the counter's threshold.
+ *
+ * MUST be protected from preemption.
+ * current protection is mapping->page_lock.
+ */
+static inline void pagecache_acct(int count)
+{
+ long *local;
+
+ local = &__get_cpu_var(nr_pagecache_local);
+ *local += count;
+ if (*local > PAGECACHE_ACCT_THRESHOLD || *local < -PAGECACHE_ACCT_THRESHOLD) {
+ atomic_add(*local, &nr_pagecache);
+ *local = 0;
+ }
+}
+
+#else
+
+static inline void pagecache_acct(int count)
+{
+ atomic_add(count, &nr_pagecache);
+}
+#endif
+
+static inline unsigned long get_page_cache_size(void)
+{
+ int ret = atomic_read(&nr_pagecache);
+ if (unlikely(ret < 0))
+ ret = 0;
+ return ret;
+}
+
/*
* Return byte-offset into filesystem object for page.
*/
extern void end_page_writeback(struct page *page);
-/*
- * permit installation of a state change monitor in the queue for a page
- */
-extern void install_page_waitqueue_monitor(struct page *page,
- wait_queue_t *monitor);
-
-/*
- * Wait for filesystem-specific page synchronisation to complete
- */
-static inline void wait_on_page_fs_misc(struct page *page)
-{
- if (PageFsMisc(page))
- wait_on_page_bit(page, PG_fs_misc);
-}
-
-extern void fastcall end_page_fs_misc(struct page *page);
-
/*
* Fault a userspace page into pagetables. Return non-zero on a fault.
*