mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 01:32:21 +02:00
netvsc_copy_to_send_buf() copies page buffer entries into the VMBus send buffer using phys_to_virt() on the entry PFN. Entries for the RNDIS header and the skb linear data come from kmalloc'd memory and are always in the kernel direct map, but entries for skb fragments reference page cache or user pages, which on 32-bit x86 with CONFIG_HIGHMEM=y can live above the LOWMEM boundary. For such a page phys_to_virt() returns an address outside the direct map and the subsequent memcpy() faults on the transmit softirq path, which is fatal. Map the pages with kmap_local_page() instead, handling two properties of the page buffer entries: - pb[i].pfn is a Hyper-V PFN at HV_HYP_PAGE_SIZE (4K) granularity, not a native PFN. Reconstruct the physical address first and derive the native page from it, so the mapping stays correct where PAGE_SIZE > HV_HYP_PAGE_SIZE (e.g. arm64 with 64K pages). - Since commit |
||
|---|---|---|
| .. | ||
| hyperv_net.h | ||
| Kconfig | ||
| Makefile | ||
| netvsc_bpf.c | ||
| netvsc_drv.c | ||
| netvsc_trace.c | ||
| netvsc_trace.h | ||
| netvsc.c | ||
| rndis_filter.c | ||