forked from mirrors/linux
		
	virtio: force vring descriptors to be allocated from lowmem
Virtio devices may attempt to add descriptors to a virtqueue from atomic context using GFP_ATOMIC allocation. This is problematic because such allocations can fall outside of the lowmem mapping, causing virt_to_phys to report bogus physical addresses which are subsequently passed to userspace via the buffers for the virtual device. This patch masks out __GFP_HIGH and __GFP_HIGHMEM from the requested flags when allocating descriptors for a virtqueue. If an atomic allocation is requested and later fails, we will return -ENOSPC which will be handled by the driver. Cc: stable@kernel.org Cc: Sasha Levin <levinsasha928@gmail.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
		
							parent
							
								
									b9cdc88df8
								
							
						
					
					
						commit
						b92b1b89a3
					
				
					 1 changed files with 7 additions and 0 deletions
				
			
		|  | @ -135,6 +135,13 @@ static int vring_add_indirect(struct vring_virtqueue *vq, | |||
| 	unsigned head; | ||||
| 	int i; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * We require lowmem mappings for the descriptors because | ||||
| 	 * otherwise virt_to_phys will give us bogus addresses in the | ||||
| 	 * virtqueue. | ||||
| 	 */ | ||||
| 	gfp &= ~(__GFP_HIGHMEM | __GFP_HIGH); | ||||
| 
 | ||||
| 	desc = kmalloc((out + in) * sizeof(struct vring_desc), gfp); | ||||
| 	if (!desc) | ||||
| 		return -ENOMEM; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Will Deacon
						Will Deacon