aboutsummaryrefslogtreecommitdiffstats
path: root/mm/highmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/highmem.c')
-rw-r--r--mm/highmem.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/mm/highmem.c b/mm/highmem.c
index 9b274fdf9d08..ee5519b176ee 100644
--- a/mm/highmem.c
+++ b/mm/highmem.c
@@ -46,6 +46,19 @@ static void *mempool_alloc_pages_isa(gfp_t gfp_mask, void *data)
46 */ 46 */
47#ifdef CONFIG_HIGHMEM 47#ifdef CONFIG_HIGHMEM
48 48
49unsigned long totalhigh_pages __read_mostly;
50
51unsigned int nr_free_highpages (void)
52{
53 pg_data_t *pgdat;
54 unsigned int pages = 0;
55
56 for_each_online_pgdat(pgdat)
57 pages += pgdat->node_zones[ZONE_HIGHMEM].free_pages;
58
59 return pages;
60}
61
49static int pkmap_count[LAST_PKMAP]; 62static int pkmap_count[LAST_PKMAP];
50static unsigned int last_pkmap_nr; 63static unsigned int last_pkmap_nr;
51static __cacheline_aligned_in_smp DEFINE_SPINLOCK(kmap_lock); 64static __cacheline_aligned_in_smp DEFINE_SPINLOCK(kmap_lock);
@@ -315,8 +328,8 @@ static void bounce_end_io(struct bio *bio, mempool_t *pool, int err)
315 if (bvec->bv_page == org_vec->bv_page) 328 if (bvec->bv_page == org_vec->bv_page)
316 continue; 329 continue;
317 330
318 mempool_free(bvec->bv_page, pool); 331 dec_zone_page_state(bvec->bv_page, NR_BOUNCE);
319 dec_page_state(nr_bounce); 332 mempool_free(bvec->bv_page, pool);
320 } 333 }
321 334
322 bio_endio(bio_orig, bio_orig->bi_size, err); 335 bio_endio(bio_orig, bio_orig->bi_size, err);
@@ -397,7 +410,7 @@ static void __blk_queue_bounce(request_queue_t *q, struct bio **bio_orig,
397 to->bv_page = mempool_alloc(pool, q->bounce_gfp); 410 to->bv_page = mempool_alloc(pool, q->bounce_gfp);
398 to->bv_len = from->bv_len; 411 to->bv_len = from->bv_len;
399 to->bv_offset = from->bv_offset; 412 to->bv_offset = from->bv_offset;
400 inc_page_state(nr_bounce); 413 inc_zone_page_state(to->bv_page, NR_BOUNCE);
401 414
402 if (rw == WRITE) { 415 if (rw == WRITE) {
403 char *vto, *vfrom; 416 char *vto, *vfrom;