All of lore.kernel.org
 help / color / mirror / Atom feed
* [intel-tdx:mig-dpamt-v3 86/97] arch/x86/kvm/mmu/tdp_mmu.c:2170:42: sparse: sparse: incompatible types in comparison expression (different address spaces):
@ 2025-10-03 23:57 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2025-10-03 23:57 UTC (permalink / raw)
  Cc: oe-kbuild-all, Kai Huang, Kishen Maloor

tree:   https://github.com/intel/tdx.git mig-dpamt-v3
head:   365885765611aa7959870e2388dda12ce2126442
commit: 3561867d781985bf3cd9a7feba55dd22524877f8 [86/97] KVM: x86/mmu: cgm: Add kvm_mmu_import_private_pages()
config: x86_64-randconfig-123-20251003 (https://download.01.org/0day-ci/archive/20251004/202510040754.objbrYuD-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251004/202510040754.objbrYuD-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202510040754.objbrYuD-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
   arch/x86/kvm/mmu/tdp_mmu.c:2044:40: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected unsigned long long [noderef] [usertype] __rcu *[usertype] sptep @@     got unsigned long long [usertype] *sptep @@
   arch/x86/kvm/mmu/tdp_mmu.c:2044:40: sparse:     expected unsigned long long [noderef] [usertype] __rcu *[usertype] sptep
   arch/x86/kvm/mmu/tdp_mmu.c:2044:40: sparse:     got unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:2073:71: sparse: sparse: incorrect type in argument 3 (different address spaces) @@     expected unsigned long long [usertype] *sptep @@     got unsigned long long [noderef] [usertype] __rcu *[addressable] [usertype] sptep @@
   arch/x86/kvm/mmu/tdp_mmu.c:2073:71: sparse:     expected unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:2073:71: sparse:     got unsigned long long [noderef] [usertype] __rcu *[addressable] [usertype] sptep
>> arch/x86/kvm/mmu/tdp_mmu.c:2170:42: sparse: sparse: incompatible types in comparison expression (different address spaces):
   arch/x86/kvm/mmu/tdp_mmu.c:2170:42: sparse:    unsigned long long [noderef] __rcu *
   arch/x86/kvm/mmu/tdp_mmu.c:2170:42: sparse:    unsigned long long [usertype] *
   arch/x86/kvm/mmu/tdp_mmu.c: note: in included file (through include/linux/rbtree.h, include/linux/mm_types.h, include/linux/mmzone.h, ...):
   include/linux/rcupdate.h:869:9: sparse: sparse: context imbalance in '__tdp_mmu_zap_root' - unexpected unlock
   arch/x86/kvm/mmu/tdp_mmu.c:1596:33: sparse: sparse: context imbalance in 'tdp_mmu_split_huge_pages_root' - unexpected unlock

vim +2170 arch/x86/kvm/mmu/tdp_mmu.c

  2034	
  2035	static int tdp_mmu_restore_private_page(struct kvm *kvm, gfn_t gfn,
  2036						u64 *sptep, u64 old_spte, int level)
  2037	{
  2038		int ret;
  2039	
  2040		if (!is_writable_pte(old_spte)) {
  2041			ret = static_call(kvm_x86_write_unblock_private_page)(kvm, gfn, level);
  2042			if (ret)
  2043				return ret;
> 2044			kvm_tdp_mmu_write_spte(sptep, old_spte,
  2045					       old_spte | PT_WRITABLE_MASK, level);
  2046		}
  2047	
  2048		if (!kvm_x86_ops.restore_private_page)
  2049			return 0;
  2050	
  2051		return static_call(kvm_x86_restore_private_page)(kvm, gfn);
  2052	}
  2053	
  2054	static int tdp_mmu_restore_private_pages(struct kvm *kvm,
  2055						 struct kvm_mmu_page *root)
  2056	{
  2057		struct tdp_iter iter;
  2058		gfn_t end = tdp_mmu_max_gfn_exclusive();
  2059		gfn_t start = 0;
  2060		int ret = 0;
  2061	
  2062		rcu_read_lock();
  2063		for_each_tdp_pte_min_level(iter, kvm, root, PG_LEVEL_4K, start, end) {
  2064			if (tdp_mmu_iter_cond_resched(kvm, &iter, false, false))
  2065				continue;
  2066	
  2067			if (iter.level > PG_LEVEL_4K)
  2068				continue;
  2069	
  2070			if (!is_shadow_present_pte(iter.old_spte))
  2071				continue;
  2072	
  2073			ret = tdp_mmu_restore_private_page(kvm, iter.gfn, iter.sptep,
  2074							   iter.old_spte, iter.level);
  2075			if (ret)
  2076				break;
  2077		}
  2078		rcu_read_unlock();
  2079	
  2080		return ret;
  2081	}
  2082	
  2083	int kvm_tdp_mmu_restore_private_pages(struct kvm *kvm)
  2084	{
  2085		struct kvm_mmu_page *root;
  2086		int i, ret;
  2087	
  2088		write_lock(&kvm->mmu_lock);
  2089	
  2090		for (i = 0; i < kvm_arch_nr_memslot_as_ids(kvm); i++) {
  2091			for_each_tdp_mmu_root_yield_safe(kvm, root) {
  2092				if (!is_mirror_sp(root))
  2093					continue;
  2094				ret = tdp_mmu_restore_private_pages(kvm, root);
  2095				if (ret)
  2096					break;
  2097			}
  2098		}
  2099		kvm_flush_remote_tlbs(kvm);
  2100	
  2101		write_unlock(&kvm->mmu_lock);
  2102		return ret;
  2103	}
  2104	
  2105	int kvm_tdp_mmu_import_private_pages(struct kvm *kvm,
  2106					     struct kvm_cgm_data *data,
  2107					     struct kvm_import_private_pages *pages)
  2108	{
  2109		struct kvm_vcpu *vcpu = kvm_get_vcpu(kvm, 0);
  2110		struct kvm_import_private_gfn *gfns = pages->gfns;
  2111		uint64_t page_nr = pages->page_nr;
  2112		uint64_t i, old_spte, new_spte;
  2113		struct kvm_memory_slot *slot;
  2114		struct page *page_unused;
  2115		struct kvm_mmu_page *sp;
  2116		uint64_t *sptep = NULL;
  2117		kvm_pfn_t pfn;
  2118		gfn_t gfn;
  2119		int ret;
  2120	
  2121		for (i = 0; i < page_nr; i++) {
  2122			gfn = (gfn_t)(gfns[i].gfn);
  2123	
  2124			if (!kvm_mem_is_private(kvm, gfn)) {
  2125				pr_err("Import page (gfn: %llx) isn't private\n", gfn);
  2126				return -EINVAL;
  2127			}
  2128	
  2129			kvm_tdp_mmu_walk_lockless_begin();
  2130			kvm_tdp_mmu_fast_pf_get_last_sptep(vcpu, gfn, &old_spte, true);
  2131			kvm_tdp_mmu_walk_lockless_end();
  2132	
  2133			if (!is_shadow_present_pte(old_spte)) {
  2134				slot = gfn_to_memslot(kvm, gfn);
  2135				if (!slot) {
  2136					pr_err("Import page not valid\n");
  2137					return -EINVAL;
  2138				}
  2139				ret = kvm_gmem_get_pfn(kvm, slot,
  2140						       gfn, &pfn, &page_unused, NULL);
  2141				if (ret) {
  2142					pr_err("Failed to get pfn from gmem\n");
  2143					return -EIO;
  2144				}
  2145				folio_put(page_folio(page_unused));
  2146				/* Initial (first time) import of a private page */
  2147				gfns[i].init = true;
  2148			} else {
  2149				pfn = spte_to_pfn(old_spte);
  2150			}
  2151			pages->pfns[i] = pfn;
  2152		}
  2153	
  2154		ret = static_call(kvm_x86_cgm_set_memory_state)(kvm, data, pages);
  2155		if (ret < 0)
  2156			return ret;
  2157	
  2158		read_lock(&kvm->mmu_lock);
  2159		kvm_tdp_mmu_walk_lockless_begin();
  2160	
  2161		for (i = 0; i < page_nr; i++) {
  2162			if (gfns[i].skip)
  2163				continue;
  2164	
  2165			gfn = (gfn_t)(gfns[i].gfn);
  2166			pfn = pages->pfns[i];
  2167			sptep = kvm_tdp_mmu_fast_pf_get_last_sptep(vcpu, gfn,
  2168								&old_spte, true);
  2169			if (!is_shadow_present_pte(old_spte)) {
> 2170				sp = sptep_to_sp(rcu_dereference(sptep));

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2025-10-03 23:57 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-03 23:57 [intel-tdx:mig-dpamt-v3 86/97] arch/x86/kvm/mmu/tdp_mmu.c:2170:42: sparse: sparse: incompatible types in comparison expression (different address spaces): kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.