All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: [intel-tdx:kvm-upstream 132/152] arch/x86/kvm/mmu/tdp_mmu.c:411:71: sparse: sparse: incorrect type in argument 4 (different address spaces)
Date: Sat, 18 Dec 2021 21:02:46 +0800	[thread overview]
Message-ID: <202112182038.tlccGG67-lkp@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 8494 bytes --]

tree:   https://github.com/intel/tdx.git kvm-upstream
head:   bdfe06c17daab60c196ff80c1d98467a1d3734fa
commit: 81d423a001d35c498d0c024fa49bba248a916c55 [132/152] KVM, x86/mmu: Support TDX private mapping for TDP MMU
config: x86_64-randconfig-s021-20211216 (https://download.01.org/0day-ci/archive/20211218/202112182038.tlccGG67-lkp(a)intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.4-dirty
        # https://github.com/intel/tdx/commit/81d423a001d35c498d0c024fa49bba248a916c55
        git remote add intel-tdx https://github.com/intel/tdx.git
        git fetch --no-tags intel-tdx kvm-upstream
        git checkout 81d423a001d35c498d0c024fa49bba248a916c55
        # save the config file to linux build tree
        mkdir build_dir
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=x86_64 SHELL=/bin/bash arch/x86/kvm/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)
>> arch/x86/kvm/mmu/tdp_mmu.c:411:71: sparse: sparse: incorrect type in argument 4 (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:411:71: sparse:     expected unsigned long long [noderef] [usertype] __rcu *[usertype] sptep
   arch/x86/kvm/mmu/tdp_mmu.c:411:71: sparse:     got unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:471:43: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected unsigned long long [usertype] *sptep @@     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep @@
   arch/x86/kvm/mmu/tdp_mmu.c:471:43: sparse:     expected unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:471:43: sparse:     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1404:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected unsigned long long [usertype] *sptep @@     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep @@
   arch/x86/kvm/mmu/tdp_mmu.c:1404:13: sparse:     expected unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1404:13: sparse:     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1443:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected unsigned long long [usertype] *sptep @@     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep @@
   arch/x86/kvm/mmu/tdp_mmu.c:1443:33: sparse:     expected unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1443:33: sparse:     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1494:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected unsigned long long [usertype] *sptep @@     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep @@
   arch/x86/kvm/mmu/tdp_mmu.c:1494:13: sparse:     expected unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1494:13: sparse:     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep
   arch/x86/kvm/mmu/tdp_mmu.c:328:9: sparse: sparse: context imbalance in 'tdp_mmu_unlink_page' - different lock contexts for basic block

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

   331	
   332	/**
   333	 * handle_removed_tdp_mmu_page - handle a pt removed from the TDP structure
   334	 *
   335	 * @kvm: kvm instance
   336	 * @parent_sptep: pointer to the parent SPTE which points to the @pt.
   337	 * @pt: the page removed from the paging structure
   338	 * @shared: This operation may not be running under the exclusive use
   339	 *	    of the MMU lock and the operation must synchronize with other
   340	 *	    threads that might be modifying SPTEs.
   341	 *
   342	 * Given a page table that has been removed from the TDP paging structure,
   343	 * iterates through the page table to clear SPTEs and free child page tables.
   344	 *
   345	 * Note that pt is passed in as a tdp_ptep_t, but it does not need RCU
   346	 * protection. Since this thread removed it from the paging structure,
   347	 * this thread will be responsible for ensuring the page is freed. Hence the
   348	 * early rcu_dereferences in the function.
   349	 */
   350	static void handle_removed_tdp_mmu_page(struct kvm *kvm, tdp_ptep_t parent_sptep,
   351						tdp_ptep_t pt, bool shared)
   352	{
   353		struct kvm_mmu_page *parent_sp =
   354			sptep_to_sp(rcu_dereference(parent_sptep));
   355		struct kvm_mmu_page *sp = sptep_to_sp(rcu_dereference(pt));
   356		int level = sp->role.level;
   357		gfn_t base_gfn = sp->gfn;
   358		int i;
   359	
   360		WARN_ON(!is_private_sp(parent_sp) != !is_private_sp(sp));
   361	
   362		trace_kvm_mmu_prepare_zap_page(sp);
   363	
   364		tdp_mmu_unlink_page(kvm, sp, shared);
   365	
   366		for (i = 0; i < PT64_ENT_PER_PAGE; i++) {
   367			u64 *sptep = rcu_dereference(pt) + i;
   368			gfn_t gfn = base_gfn + i * KVM_PAGES_PER_HPAGE(level);
   369			u64 old_child_spte;
   370	
   371			if (shared) {
   372				/*
   373				 * Set the SPTE to a nonpresent value that other
   374				 * threads will not overwrite. If the SPTE was
   375				 * already marked as removed then another thread
   376				 * handling a page fault could overwrite it, so
   377				 * set the SPTE until it is set from some other
   378				 * value to the removed SPTE value.
   379				 */
   380				for (;;) {
   381					old_child_spte = xchg(sptep, SHADOW_REMOVED_SPTE);
   382					if (!is_removed_spte(old_child_spte))
   383						break;
   384					cpu_relax();
   385				}
   386			} else {
   387				/*
   388				 * If the SPTE is not MMU-present, there is no backing
   389				 * page associated with the SPTE and so no side effects
   390				 * that need to be recorded, and exclusive ownership of
   391				 * mmu_lock ensures the SPTE can't be made present.
   392				 * Note, zapping MMIO SPTEs is also unnecessary as they
   393				 * are guarded by the memslots generation, not by being
   394				 * unreachable.
   395				 */
   396				old_child_spte = READ_ONCE(*sptep);
   397				if (!is_shadow_present_pte(old_child_spte) &&
   398						!is_zapped_private_pte(old_child_spte))
   399					continue;
   400	
   401				/*
   402				 * Marking the SPTE as a removed SPTE is not
   403				 * strictly necessary here as the MMU lock will
   404				 * stop other threads from concurrently modifying
   405				 * this SPTE. Using the removed SPTE value keeps
   406				 * the two branches consistent and simplifies
   407				 * the function.
   408				 */
   409				WRITE_ONCE(*sptep, SHADOW_REMOVED_SPTE);
   410			}
 > 411			handle_changed_spte(kvm, kvm_mmu_page_as_id(sp), gfn, sptep,
   412					    old_child_spte, SHADOW_REMOVED_SPTE, level,
   413					    shared);
   414		}
   415	
   416		if (sp->private_sp) {
   417	
   418			/*
   419			 * Currently prviate page table (not the leaf page) can only be
   420			 * zapped when VM is being destroyed, because currently
   421			 * kvm_x86_ops->free_private_sp() can only be called after TD
   422			 * has been torn down (after tdx_vm_teardown()).  To make sure
   423			 * this code path can only be reached when the whole page table
   424			 * is being torn down when TD is being destroyed, zapping
   425			 * aliasing only zaps the leaf pages, but not the intermediate
   426			 * page tables.
   427			 */
   428			WARN_ON(!is_private_sp(sp));
   429			/*
   430			 * The level used in kvm_x86_ops->free_private_sp() doesn't
   431			 * matter since PG_LEVEL_4K is always used internally.
   432			 */
   433			if (!__kvm_mmu_free_private_sp(kvm, sp)) {
   434				free_page((unsigned long)sp->private_sp);
   435				sp->private_sp = NULL;
   436			}
   437		}
   438	
   439		kvm_flush_remote_tlbs_with_address(kvm, base_gfn,
   440						   KVM_PAGES_PER_HPAGE(level + 1));
   441	
   442		call_rcu(&sp->rcu_head, tdp_mmu_free_sp_rcu_callback);
   443	}
   444	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Kai Huang <kai.huang@intel.com>
Cc: kbuild-all@lists.01.org, linux-kernel@vger.kernel.org,
	Isaku Yamahata <isaku.yamahata@intel.com>
Subject: [intel-tdx:kvm-upstream 132/152] arch/x86/kvm/mmu/tdp_mmu.c:411:71: sparse: sparse: incorrect type in argument 4 (different address spaces)
Date: Sat, 18 Dec 2021 21:02:46 +0800	[thread overview]
Message-ID: <202112182038.tlccGG67-lkp@intel.com> (raw)

tree:   https://github.com/intel/tdx.git kvm-upstream
head:   bdfe06c17daab60c196ff80c1d98467a1d3734fa
commit: 81d423a001d35c498d0c024fa49bba248a916c55 [132/152] KVM, x86/mmu: Support TDX private mapping for TDP MMU
config: x86_64-randconfig-s021-20211216 (https://download.01.org/0day-ci/archive/20211218/202112182038.tlccGG67-lkp@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.4-dirty
        # https://github.com/intel/tdx/commit/81d423a001d35c498d0c024fa49bba248a916c55
        git remote add intel-tdx https://github.com/intel/tdx.git
        git fetch --no-tags intel-tdx kvm-upstream
        git checkout 81d423a001d35c498d0c024fa49bba248a916c55
        # save the config file to linux build tree
        mkdir build_dir
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=x86_64 SHELL=/bin/bash arch/x86/kvm/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)
>> arch/x86/kvm/mmu/tdp_mmu.c:411:71: sparse: sparse: incorrect type in argument 4 (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:411:71: sparse:     expected unsigned long long [noderef] [usertype] __rcu *[usertype] sptep
   arch/x86/kvm/mmu/tdp_mmu.c:411:71: sparse:     got unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:471:43: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected unsigned long long [usertype] *sptep @@     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep @@
   arch/x86/kvm/mmu/tdp_mmu.c:471:43: sparse:     expected unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:471:43: sparse:     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1404:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected unsigned long long [usertype] *sptep @@     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep @@
   arch/x86/kvm/mmu/tdp_mmu.c:1404:13: sparse:     expected unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1404:13: sparse:     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1443:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected unsigned long long [usertype] *sptep @@     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep @@
   arch/x86/kvm/mmu/tdp_mmu.c:1443:33: sparse:     expected unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1443:33: sparse:     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1494:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected unsigned long long [usertype] *sptep @@     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep @@
   arch/x86/kvm/mmu/tdp_mmu.c:1494:13: sparse:     expected unsigned long long [usertype] *sptep
   arch/x86/kvm/mmu/tdp_mmu.c:1494:13: sparse:     got unsigned long long [noderef] [usertype] __rcu *[usertype] sptep
   arch/x86/kvm/mmu/tdp_mmu.c:328:9: sparse: sparse: context imbalance in 'tdp_mmu_unlink_page' - different lock contexts for basic block

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

   331	
   332	/**
   333	 * handle_removed_tdp_mmu_page - handle a pt removed from the TDP structure
   334	 *
   335	 * @kvm: kvm instance
   336	 * @parent_sptep: pointer to the parent SPTE which points to the @pt.
   337	 * @pt: the page removed from the paging structure
   338	 * @shared: This operation may not be running under the exclusive use
   339	 *	    of the MMU lock and the operation must synchronize with other
   340	 *	    threads that might be modifying SPTEs.
   341	 *
   342	 * Given a page table that has been removed from the TDP paging structure,
   343	 * iterates through the page table to clear SPTEs and free child page tables.
   344	 *
   345	 * Note that pt is passed in as a tdp_ptep_t, but it does not need RCU
   346	 * protection. Since this thread removed it from the paging structure,
   347	 * this thread will be responsible for ensuring the page is freed. Hence the
   348	 * early rcu_dereferences in the function.
   349	 */
   350	static void handle_removed_tdp_mmu_page(struct kvm *kvm, tdp_ptep_t parent_sptep,
   351						tdp_ptep_t pt, bool shared)
   352	{
   353		struct kvm_mmu_page *parent_sp =
   354			sptep_to_sp(rcu_dereference(parent_sptep));
   355		struct kvm_mmu_page *sp = sptep_to_sp(rcu_dereference(pt));
   356		int level = sp->role.level;
   357		gfn_t base_gfn = sp->gfn;
   358		int i;
   359	
   360		WARN_ON(!is_private_sp(parent_sp) != !is_private_sp(sp));
   361	
   362		trace_kvm_mmu_prepare_zap_page(sp);
   363	
   364		tdp_mmu_unlink_page(kvm, sp, shared);
   365	
   366		for (i = 0; i < PT64_ENT_PER_PAGE; i++) {
   367			u64 *sptep = rcu_dereference(pt) + i;
   368			gfn_t gfn = base_gfn + i * KVM_PAGES_PER_HPAGE(level);
   369			u64 old_child_spte;
   370	
   371			if (shared) {
   372				/*
   373				 * Set the SPTE to a nonpresent value that other
   374				 * threads will not overwrite. If the SPTE was
   375				 * already marked as removed then another thread
   376				 * handling a page fault could overwrite it, so
   377				 * set the SPTE until it is set from some other
   378				 * value to the removed SPTE value.
   379				 */
   380				for (;;) {
   381					old_child_spte = xchg(sptep, SHADOW_REMOVED_SPTE);
   382					if (!is_removed_spte(old_child_spte))
   383						break;
   384					cpu_relax();
   385				}
   386			} else {
   387				/*
   388				 * If the SPTE is not MMU-present, there is no backing
   389				 * page associated with the SPTE and so no side effects
   390				 * that need to be recorded, and exclusive ownership of
   391				 * mmu_lock ensures the SPTE can't be made present.
   392				 * Note, zapping MMIO SPTEs is also unnecessary as they
   393				 * are guarded by the memslots generation, not by being
   394				 * unreachable.
   395				 */
   396				old_child_spte = READ_ONCE(*sptep);
   397				if (!is_shadow_present_pte(old_child_spte) &&
   398						!is_zapped_private_pte(old_child_spte))
   399					continue;
   400	
   401				/*
   402				 * Marking the SPTE as a removed SPTE is not
   403				 * strictly necessary here as the MMU lock will
   404				 * stop other threads from concurrently modifying
   405				 * this SPTE. Using the removed SPTE value keeps
   406				 * the two branches consistent and simplifies
   407				 * the function.
   408				 */
   409				WRITE_ONCE(*sptep, SHADOW_REMOVED_SPTE);
   410			}
 > 411			handle_changed_spte(kvm, kvm_mmu_page_as_id(sp), gfn, sptep,
   412					    old_child_spte, SHADOW_REMOVED_SPTE, level,
   413					    shared);
   414		}
   415	
   416		if (sp->private_sp) {
   417	
   418			/*
   419			 * Currently prviate page table (not the leaf page) can only be
   420			 * zapped when VM is being destroyed, because currently
   421			 * kvm_x86_ops->free_private_sp() can only be called after TD
   422			 * has been torn down (after tdx_vm_teardown()).  To make sure
   423			 * this code path can only be reached when the whole page table
   424			 * is being torn down when TD is being destroyed, zapping
   425			 * aliasing only zaps the leaf pages, but not the intermediate
   426			 * page tables.
   427			 */
   428			WARN_ON(!is_private_sp(sp));
   429			/*
   430			 * The level used in kvm_x86_ops->free_private_sp() doesn't
   431			 * matter since PG_LEVEL_4K is always used internally.
   432			 */
   433			if (!__kvm_mmu_free_private_sp(kvm, sp)) {
   434				free_page((unsigned long)sp->private_sp);
   435				sp->private_sp = NULL;
   436			}
   437		}
   438	
   439		kvm_flush_remote_tlbs_with_address(kvm, base_gfn,
   440						   KVM_PAGES_PER_HPAGE(level + 1));
   441	
   442		call_rcu(&sp->rcu_head, tdp_mmu_free_sp_rcu_callback);
   443	}
   444	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

             reply	other threads:[~2021-12-18 13:02 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-18 13:02 kernel test robot [this message]
2021-12-18 13:02 ` [intel-tdx:kvm-upstream 132/152] arch/x86/kvm/mmu/tdp_mmu.c:411:71: sparse: sparse: incorrect type in argument 4 (different address spaces) kernel test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202112182038.tlccGG67-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=kbuild-all@lists.01.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.