Re: [PATCH] x86/sev: Adjust the alignment of vaddr_end

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Dave,

On 2/10/2023 11:38 AM, Dave Hansen wrote:
> On 2/10/23 08:58, Pavan Kumar Paluri wrote:
>> --- a/arch/x86/kernel/sev.c
>> +++ b/arch/x86/kernel/sev.c
>> @@ -648,8 +648,8 @@ static void pvalidate_pages(unsigned long vaddr, unsigned int npages, bool valid
>>  	unsigned long vaddr_end;
>>  	int rc;
>>  
>> -	vaddr = vaddr & PAGE_MASK;
>> -	vaddr_end = vaddr + (npages << PAGE_SHIFT);
>> +	vaddr_end = PAGE_ALIGN(vaddr + (npages << PAGE_SHIFT));
>> +	vaddr = PAGE_ALIGN_DOWN(vaddr);
> 
> Could you folks please go take a look at all of the callers that call
> into pvalidate_pages() and set_pages_state()?
> 
> I think part of the problem here is that the API is quite inconsistent.
> There have been a few bugs in this area.  Ideally, if you have an
> interface that deals in 'pages', then the addresses should be aligned
> already before hitting that interface.

I agree
> 
> But, there are messes like this:
> 
> static inline void __init snp_memcpy(void *dst, void *src, size_t sz,
>                                      unsigned long paddr, bool decrypt)
> {
>         unsigned long npages = PAGE_ALIGN(sz) >> PAGE_SHIFT;
> 	...
> 	early_snp_set_memory_shared((unsigned long)__va(paddr), paddr,
> 				    npages);
> 
> That's taking a theoretically unaligned 'paddr', page-aligning the size,
> then passing the result into an 'npages' interface.  That makes zero
> sense if, for instance, it tried to do:
> 
> 	paddr = 0x0fff
> 	sz = 2
> 
> That would pass along:
> 
> 	paddr = 0x0fff
> 	npages = 1
> 
> npages (the effective end address) is aligned, but paddr is not.
> 
> We can keep on hacking around these bugs as they present themselves
> one-by-one.  Could you look a bit more widely, please, and see if
> there's something more fundamental that should be done?

We will try to fix paddr and vaddr alignments before they begin to touch
the interfaces.

Thanks,
Pavan



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux