We have this: static inline bool blk_queue_may_bounce(struct request_queue *q) { return IS_ENABLED(CONFIG_BOUNCE) && q->limits.bounce == BLK_BOUNCE_HIGH && max_low_pfn >= max_pfn; } static inline struct bio *blk_queue_bounce(struct bio *bio, struct request_queue *q) { if (unlikely(blk_queue_may_bounce(q) && bio_has_data(bio))) return __blk_queue_bounce(bio, q); return bio; } Now, the last term in expression in blk_queue_may_bounce() is true only on the boxen where max_pfn is no greater than max_low_pfn. Unless I'm very confused, that's the boxen where we don't *have* any highmem pages. What's more, consider this: static __init int init_emergency_pool(void) { int ret; #ifndef CONFIG_MEMORY_HOTPLUG if (max_pfn <= max_low_pfn) return 0; #endif ret = mempool_init_page_pool(&page_pool, POOL_SIZE, 0); BUG_ON(ret); pr_info("pool size: %d pages\n", POOL_SIZE); init_bounce_bioset(); return 0; } On the same boxen (assuming we've not hotplug) page_pool won't be set up at all, so we wouldn't be able to bounce any highmem page if we ever ran into one. AFAICS, this condition is backwards - it should be static inline bool blk_queue_may_bounce(struct request_queue *q) { return IS_ENABLED(CONFIG_BOUNCE) && q->limits.bounce == BLK_BOUNCE_HIGH && max_low_pfn < max_pfn; } What am I missing here?