diff options
Diffstat (limited to 'drivers/hv/ring_buffer.c')
| -rw-r--r-- | drivers/hv/ring_buffer.c | 62 | 
1 files changed, 20 insertions, 42 deletions
diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index c6692fd5ab15..3c9b02471760 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c @@ -186,8 +186,6 @@ int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info,  		       struct page *pages, u32 page_cnt, u32 max_pkt_size)  {  	struct page **pages_wraparound; -	unsigned long *pfns_wraparound; -	u64 pfn;  	int i;  	BUILD_BUG_ON((sizeof(struct hv_ring_buffer) != PAGE_SIZE)); @@ -196,50 +194,30 @@ int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info,  	 * First page holds struct hv_ring_buffer, do wraparound mapping for  	 * the rest.  	 */ -	if (hv_isolation_type_snp()) { -		pfn = page_to_pfn(pages) + -			PFN_DOWN(ms_hyperv.shared_gpa_boundary); +	pages_wraparound = kcalloc(page_cnt * 2 - 1, +				   sizeof(struct page *), +				   GFP_KERNEL); +	if (!pages_wraparound) +		return -ENOMEM; -		pfns_wraparound = kcalloc(page_cnt * 2 - 1, -			sizeof(unsigned long), GFP_KERNEL); -		if (!pfns_wraparound) -			return -ENOMEM; - -		pfns_wraparound[0] = pfn; -		for (i = 0; i < 2 * (page_cnt - 1); i++) -			pfns_wraparound[i + 1] = pfn + i % (page_cnt - 1) + 1; - -		ring_info->ring_buffer = (struct hv_ring_buffer *) -			vmap_pfn(pfns_wraparound, page_cnt * 2 - 1, -				 PAGE_KERNEL); -		kfree(pfns_wraparound); - -		if (!ring_info->ring_buffer) -			return -ENOMEM; - -		/* Zero ring buffer after setting memory host visibility. */ -		memset(ring_info->ring_buffer, 0x00, PAGE_SIZE * page_cnt); -	} else { -		pages_wraparound = kcalloc(page_cnt * 2 - 1, -					   sizeof(struct page *), -					   GFP_KERNEL); -		if (!pages_wraparound) -			return -ENOMEM; - -		pages_wraparound[0] = pages; -		for (i = 0; i < 2 * (page_cnt - 1); i++) -			pages_wraparound[i + 1] = -				&pages[i % (page_cnt - 1) + 1]; +	pages_wraparound[0] = pages; +	for (i = 0; i < 2 * (page_cnt - 1); i++) +		pages_wraparound[i + 1] = +			&pages[i % (page_cnt - 1) + 1]; -		ring_info->ring_buffer = (struct hv_ring_buffer *) -			vmap(pages_wraparound, page_cnt * 2 - 1, VM_MAP, -				PAGE_KERNEL); +	ring_info->ring_buffer = (struct hv_ring_buffer *) +		vmap(pages_wraparound, page_cnt * 2 - 1, VM_MAP, +			pgprot_decrypted(PAGE_KERNEL)); -		kfree(pages_wraparound); -		if (!ring_info->ring_buffer) -			return -ENOMEM; -	} +	kfree(pages_wraparound); +	if (!ring_info->ring_buffer) +		return -ENOMEM; +	/* +	 * Ensure the header page is zero'ed since +	 * encryption status may have changed. +	 */ +	memset(ring_info->ring_buffer, 0, HV_HYP_PAGE_SIZE);  	ring_info->ring_buffer->read_index =  		ring_info->ring_buffer->write_index = 0;  |