linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / include / linux / pagemap.h
index e77298b..ee700c6 100644 (file)
@@ -51,10 +51,6 @@ static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask)
 #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);
@@ -64,7 +60,6 @@ static inline struct page *page_cache_alloc_cold(struct address_space *x)
 {
        return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, 0);
 }
-#endif
 
 typedef int filler_t(void *, struct page *);
 
@@ -72,14 +67,12 @@ extern struct page * find_get_page(struct address_space *mapping,
                                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);
 
@@ -99,13 +92,6 @@ extern struct page * read_cache_page(struct address_space *mapping,
 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,
@@ -113,6 +99,51 @@ 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.
  */
@@ -169,23 +200,6 @@ static inline void wait_on_page_writeback(struct page *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.
  *