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

Drivers: hv: vmbus: Remove second way of mapping ring buffers

With changes to how Hyper-V guest VMs flip memory between private
(encrypted) and shared (decrypted), it's no longer necessary to
have separate code paths for mapping VMBus ring buffers for
for normal VMs and for Confidential VMs.

As such, remove the code path that uses vmap_pfn(), and set
the protection flags argument to vmap() to account for the
difference between normal and Confidential VMs.

Signed-off-by: Michael Kelley <mikelley@microsoft.com>
Reviewed-by: Tianyu Lan <Tianyu.Lan@microsoft.com>
Link: https://lore.kernel.org/r/1679838727-87310-10-git-send-email-mikelley@microsoft.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>

authored by

Michael Kelley and committed by
Wei Liu
bb862397 a5ddb745

+20 -42
+20 -42
drivers/hv/ring_buffer.c
··· 186 186 struct page *pages, u32 page_cnt, u32 max_pkt_size) 187 187 { 188 188 struct page **pages_wraparound; 189 - unsigned long *pfns_wraparound; 190 - u64 pfn; 191 189 int i; 192 190 193 191 BUILD_BUG_ON((sizeof(struct hv_ring_buffer) != PAGE_SIZE)); ··· 194 196 * First page holds struct hv_ring_buffer, do wraparound mapping for 195 197 * the rest. 196 198 */ 197 - if (hv_isolation_type_snp()) { 198 - pfn = page_to_pfn(pages) + 199 - PFN_DOWN(ms_hyperv.shared_gpa_boundary); 199 + pages_wraparound = kcalloc(page_cnt * 2 - 1, 200 + sizeof(struct page *), 201 + GFP_KERNEL); 202 + if (!pages_wraparound) 203 + return -ENOMEM; 200 204 201 - pfns_wraparound = kcalloc(page_cnt * 2 - 1, 202 - sizeof(unsigned long), GFP_KERNEL); 203 - if (!pfns_wraparound) 204 - return -ENOMEM; 205 + pages_wraparound[0] = pages; 206 + for (i = 0; i < 2 * (page_cnt - 1); i++) 207 + pages_wraparound[i + 1] = 208 + &pages[i % (page_cnt - 1) + 1]; 205 209 206 - pfns_wraparound[0] = pfn; 207 - for (i = 0; i < 2 * (page_cnt - 1); i++) 208 - pfns_wraparound[i + 1] = pfn + i % (page_cnt - 1) + 1; 210 + ring_info->ring_buffer = (struct hv_ring_buffer *) 211 + vmap(pages_wraparound, page_cnt * 2 - 1, VM_MAP, 212 + pgprot_decrypted(PAGE_KERNEL)); 209 213 210 - ring_info->ring_buffer = (struct hv_ring_buffer *) 211 - vmap_pfn(pfns_wraparound, page_cnt * 2 - 1, 212 - pgprot_decrypted(PAGE_KERNEL)); 213 - kfree(pfns_wraparound); 214 + kfree(pages_wraparound); 215 + if (!ring_info->ring_buffer) 216 + return -ENOMEM; 214 217 215 - if (!ring_info->ring_buffer) 216 - return -ENOMEM; 217 - 218 - /* Zero ring buffer after setting memory host visibility. */ 219 - memset(ring_info->ring_buffer, 0x00, PAGE_SIZE * page_cnt); 220 - } else { 221 - pages_wraparound = kcalloc(page_cnt * 2 - 1, 222 - sizeof(struct page *), 223 - GFP_KERNEL); 224 - if (!pages_wraparound) 225 - return -ENOMEM; 226 - 227 - pages_wraparound[0] = pages; 228 - for (i = 0; i < 2 * (page_cnt - 1); i++) 229 - pages_wraparound[i + 1] = 230 - &pages[i % (page_cnt - 1) + 1]; 231 - 232 - ring_info->ring_buffer = (struct hv_ring_buffer *) 233 - vmap(pages_wraparound, page_cnt * 2 - 1, VM_MAP, 234 - PAGE_KERNEL); 235 - 236 - kfree(pages_wraparound); 237 - if (!ring_info->ring_buffer) 238 - return -ENOMEM; 239 - } 240 - 218 + /* 219 + * Ensure the header page is zero'ed since 220 + * encryption status may have changed. 221 + */ 222 + memset(ring_info->ring_buffer, 0, HV_HYP_PAGE_SIZE); 241 223 242 224 ring_info->ring_buffer->read_index = 243 225 ring_info->ring_buffer->write_index = 0;