Subject: Re: linux-next: manual merge of the kvm-arm tree with the kvm tree

From: Stephen Rothwell <[email-masked]>
Date: Sun, 9 Aug 2020 18:55:43 +1000

Hi all,

On Mon, 13 Jul 2020 14:40:36 +1000 Stephen Rothwell <[email-masked]> wrote:
>
> Today's linux-next merge of the kvm-arm tree got a conflict in:
> 
>   arch/arm64/kvm/mmu.c
> 
> between commit:
> 
>   c1a33aebe91d ("KVM: arm64: Use common KVM implementation of MMU memory caches")
> 
> from the kvm tree and commit:
> 
>   a0e50aa3f4a8 ("KVM: arm64: Factor out stage 2 page table data from struct kvm")
> 
> from the kvm-arm tree.
> 
> I fixed it up (see below) and can carry the fix as necessary. This
> is now fixed as far as linux-next is concerned, but any non trivial
> conflicts should be mentioned to your upstream maintainer when your tree
> is submitted for merging.  You may also want to consider cooperating
> with the maintainer of the conflicting tree to minimise any particularly
> complex conflicts.
> 
> diff --cc arch/arm64/kvm/mmu.c
> index 838aad520f1c,cd14c831d56f..000000000000
> --- a/arch/arm64/kvm/mmu.c
> +++ b/arch/arm64/kvm/mmu.c
> @@@ -124,11 -127,44 +127,12 @@@ static void stage2_dissolve_pud(struct 
>   	put_page(virt_to_page(pudp));
>   }
>   
> - static void clear_stage2_pgd_entry(struct kvm *kvm, pgd_t *pgd, phys_addr_t addr)
>  -static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
>  -				  int min, int max)
>  -{
>  -	void *page;
>  -
>  -	BUG_ON(max > KVM_NR_MEM_OBJS);
>  -	if (cache->nobjs >= min)
>  -		return 0;
>  -	while (cache->nobjs < max) {
>  -		page = (void *)__get_free_page(GFP_PGTABLE_USER);
>  -		if (!page)
>  -			return -ENOMEM;
>  -		cache->objects[cache->nobjs++] = page;
>  -	}
>  -	return 0;
>  -}
>  -
>  -static void mmu_free_memory_cache(struct kvm_mmu_memory_cache *mc)
>  -{
>  -	while (mc->nobjs)
>  -		free_page((unsigned long)mc->objects[--mc->nobjs]);
>  -}
>  -
>  -static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc)
>  -{
>  -	void *p;
>  -
>  -	BUG_ON(!mc || !mc->nobjs);
>  -	p = mc->objects[--mc->nobjs];
>  -	return p;
>  -}
>  -
> + static void clear_stage2_pgd_entry(struct kvm_s2_mmu *mmu, pgd_t *pgd, phys_addr_t addr)
>   {
> + 	struct kvm *kvm = mmu->kvm;
>   	p4d_t *p4d_table __maybe_unused = stage2_p4d_offset(kvm, pgd, 0UL);
>   	stage2_pgd_clear(kvm, pgd);
> - 	kvm_tlb_flush_vmid_ipa(kvm, addr);
> + 	kvm_tlb_flush_vmid_ipa(mmu, addr, S2_NO_LEVEL_HINT);
>   	stage2_p4d_free(kvm, p4d_table);
>   	put_page(virt_to_page(pgd));
>   }

This is now a conflict between the kvm-arm tree and Linus' tree.

-- 
Cheers,
Stephen Rothwell