> + if ((bio->bi_opf & REQ_POLLED) && !WARN_ON_ONCE(in_interrupt())) { > + bio->bi_next = cache->free_list; > + cache->free_list = bio; > + cache->nr++; > + } else { > + put_cpu(); > + bio_free(bio); > + return; > + } This reads a little strange with the return in an else. Why not: if (!(bio->bi_opf & REQ_POLLED) || WARN_ON_ONCE(in_interrupt())) { put_cpu(); bio_free(bio); return; } bio->bi_next = cache->free_list; cache->free_list = bio; cache->nr++; but given that the simple free case doesn't care about what CPU we're on or the per-cpu cache pointer, I think we can simply move the cache = per_cpu_ptr(bio->bi_pool->cache, get_cpu()); after the above return as well.