RE: [EXTERNAL] [PATCH net] hv_netvsc: use kmap_local_page in netvsc_copy_to_send_buf
From: Haiyang Zhang
Date: Tue Jun 02 2026 - 19:00:15 EST
> -----Original Message-----
> From: LeantionX <leontyevantony@xxxxxxxxx>
> Sent: Tuesday, June 2, 2026 11:52 AM
> To: netdev@xxxxxxxxxxxxxxx
> Cc: linux-hyperv@xxxxxxxxxxxxxxx; KY Srinivasan <kys@xxxxxxxxxxxxx>;
> Haiyang Zhang <haiyangz@xxxxxxxxxxxxx>; wei.liu@xxxxxxxxxx; Dexuan Cui
> <DECUI@xxxxxxxxxxxxx>; Long Li <longli@xxxxxxxxxxxxx>;
> andrew+netdev@xxxxxxx; kuba@xxxxxxxxxx; pabeni@xxxxxxxxxx;
> edumazet@xxxxxxxxxx; davem@xxxxxxxxxxxxx; stable@xxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx; Anton Leontev <leontyevantony@xxxxxxxxx>
> Subject: [EXTERNAL] [PATCH net] hv_netvsc: use kmap_local_page in
> netvsc_copy_to_send_buf
>
> [You don't often get email from leontyevantony@xxxxxxxxx. Learn why this
> is important at https://aka.ms/LearnAboutSenderIdentification ]
>
> From: Anton Leontev <leontyevantony@xxxxxxxxx>
>
> netvsc_copy_to_send_buf() copies skb fragment pages into the shared
> VMBus send buffer using phys_to_virt() on the fragment PFN. On 32-bit
> x86 with CONFIG_HIGHMEM=y, phys_to_virt() (i.e. __va()) is only valid
> for LOWMEM addresses below 896 MiB. For a HIGHMEM page it returns an
> address that has no kernel page table entry and lies outside the
> kernel direct map, so the subsequent memcpy() faults. As this happens
> on the transmit softirq path, the fault is fatal.
Please include the stack trace in patch description.
> A HIGHMEM fragment reaches this path whenever the page backing an skb
> fragment lives above the LOWMEM boundary, which is common on a 32-bit
> guest with several GiB of RAM (for example when the in-kernel NFS
> server splices page cache pages directly into the reply skb).
>
> Map the fragment page on demand with kmap_local_page()/kunmap_local()
> instead. Using pfn_to_page() on pb[i].pfn maps exactly the page
> described by the page buffer entry. On configurations without HIGHMEM
> (amd64, i386 without CONFIG_HIGHMEM) kmap_local_page() reduces to
> page_address(), so this is a no-op there.
So, on 64bit kernel, it has no performance impact?
Thanks,
- Haiyang