[PATCH] lib/test_bpf: Replace kmap() with kmap_local_page()

From: Sumitra Sharma
Date: Mon Jun 12 2023 - 06:49:31 EST


kmap() has been deprecated in favor of the kmap_local_page()
due to high cost, restricted mapping space, the overhead of
a global lock for synchronization, and making the process
sleep in the absence of free slots.

kmap_local_page() is faster than kmap() and offers thread-local
and CPU-local mappings, take pagefaults in a local kmap region
and preserves preemption by saving the mappings of outgoing
tasks and restoring those of the incoming one during a context
switch.

The mapping is kept thread local in the function
“generate_test_data” in test_bpf.c

Therefore, replace kmap() with kmap_local_page() and use
memcpy_to_page() to avoid open coding kmap_local_page()
+ memcpy() + kunmap_local().

Remove the unused variable “ptr”.

Signed-off-by: Sumitra Sharma <sumitraartsy@xxxxxxxxx>
---
lib/test_bpf.c | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/lib/test_bpf.c b/lib/test_bpf.c
index ade9ac672adb..3bb94727d83b 100644
--- a/lib/test_bpf.c
+++ b/lib/test_bpf.c
@@ -14381,25 +14381,17 @@ static void *generate_test_data(struct bpf_test *test, int sub)
* single fragment to the skb, filled with
* test->frag_data.
*/
- void *ptr;
-
page = alloc_page(GFP_KERNEL);

if (!page)
goto err_kfree_skb;

- ptr = kmap(page);
- if (!ptr)
- goto err_free_page;
- memcpy(ptr, test->frag_data, MAX_DATA);
- kunmap(page);
+ memcpy_to_page(page, 0, test->frag_data, MAX_DATA);
skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
}

return skb;

-err_free_page:
- __free_page(page);
err_kfree_skb:
kfree_skb(skb);
return NULL;
--
2.25.1