Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drbd: replace kmap() with kmap_local_page() in receiver path

Use kmap_local_page() instead of kmap() to avoid
CPU contention.

kmap() uses a global set of mapping slots that can cause contention
between multiple CPUs, while kmap_local_page() uses per-CPU slots
eliminating this contention. It also ensures non-sleeping operation
and provides better cache locality.

Convert kmap() to kmap_local_page() as it aligns with ongoing
kernel efforts to modernize kmap() usage for better multi-core
scalability.

Signed-off-by: Shi Hao <i.shihao.999@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Shi Hao and committed by
Jens Axboe
77220f6d e48886b9

+4 -4
+4 -4
drivers/block/drbd/drbd_receiver.c
··· 1736 1736 page = peer_req->pages; 1737 1737 page_chain_for_each(page) { 1738 1738 unsigned len = min_t(int, ds, PAGE_SIZE); 1739 - data = kmap(page); 1739 + data = kmap_local_page(page); 1740 1740 err = drbd_recv_all_warn(peer_device->connection, data, len); 1741 1741 if (drbd_insert_fault(device, DRBD_FAULT_RECEIVE)) { 1742 1742 drbd_err(device, "Fault injection: Corrupting data on receive\n"); 1743 1743 data[0] = data[0] ^ (unsigned long)-1; 1744 1744 } 1745 - kunmap(page); 1745 + kunmap_local(data); 1746 1746 if (err) { 1747 1747 drbd_free_peer_req(device, peer_req); 1748 1748 return NULL; ··· 1777 1777 1778 1778 page = drbd_alloc_pages(peer_device, 1, 1); 1779 1779 1780 - data = kmap(page); 1780 + data = kmap_local_page(page); 1781 1781 while (data_size) { 1782 1782 unsigned int len = min_t(int, data_size, PAGE_SIZE); 1783 1783 ··· 1786 1786 break; 1787 1787 data_size -= len; 1788 1788 } 1789 - kunmap(page); 1789 + kunmap_local(data); 1790 1790 drbd_free_pages(peer_device->device, page); 1791 1791 return err; 1792 1792 }