Hi Ben,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on next-20210331]
[cannot apply to kvm/queue tip/master linux/master linus/master v5.12-rc5 
v5.12-rc4 v5.12-rc3 v5.12-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    
https://github.com/0day-ci/linux/commits/Ben-Gardon/More-parallel-operations-for-the-TDP-MMU/20210401-051137
base:    7a43c78d0573e0bbbb0456b033e2b9a895b89464
config: x86_64-allyesconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
        # 
https://github.com/0day-ci/linux/commit/2b2c6d3bdc35269df5f9293a02da5b71c74095f3
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review 
Ben-Gardon/More-parallel-operations-for-the-TDP-MMU/20210401-051137
        git checkout 2b2c6d3bdc35269df5f9293a02da5b71c74095f3
        # save the attached .config to linux build tree
        make W=1 ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>

All errors (new ones prefixed by >>):

   In file included from include/linux/rculist.h:11,
                    from include/linux/pid.h:5,
                    from include/linux/sched.h:14,
                    from include/linux/hardirq.h:9,
                    from include/linux/kvm_host.h:7,
                    from arch/x86/kvm/mmu.h:5,
                    from arch/x86/kvm/mmu/tdp_mmu.c:3:
   arch/x86/kvm/mmu/tdp_mmu.c: In function 'kvm_tdp_mmu_get_vcpu_root_hpa':
>> arch/x86/kvm/mmu/tdp_mmu.c:139:5: error: implicit declaration of function 
>> 'lockdep_is_held_write'; did you mean 'lockdep_is_held_type'? 
>> [-Werror=implicit-function-declaration]
     139 |     lockdep_is_held_write(&kvm->mmu_lock))
         |     ^~~~~~~~~~~~~~~~~~~~~
   include/linux/rcupdate.h:318:52: note: in definition of macro 
'RCU_LOCKDEP_WARN'
     318 |   if (debug_lockdep_rcu_enabled() && !__warned && (c)) { \
         |                                                    ^
   include/linux/rculist.h:391:7: note: in expansion of macro '__list_check_rcu'
     391 |  for (__list_check_rcu(dummy, ## cond, 0),   \
         |       ^~~~~~~~~~~~~~~~
   arch/x86/kvm/mmu/tdp_mmu.c:138:2: note: in expansion of macro 
'list_for_each_entry_rcu'
     138 |  list_for_each_entry_rcu(_root, &_kvm->arch.tdp_mmu_roots, link, \
         |  ^~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kvm/mmu/tdp_mmu.c:184:2: note: in expansion of macro 
'for_each_tdp_mmu_root'
     184 |  for_each_tdp_mmu_root(kvm, root) {
         |  ^~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors


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

     2  
   > 3  #include "mmu.h"
     4  #include "mmu_internal.h"
     5  #include "mmutrace.h"
     6  #include "tdp_iter.h"
     7  #include "tdp_mmu.h"
     8  #include "spte.h"
     9  
    10  #include <asm/cmpxchg.h>
    11  #include <trace/events/kvm.h>
    12  
    13  static bool __read_mostly tdp_mmu_enabled = false;
    14  module_param_named(tdp_mmu, tdp_mmu_enabled, bool, 0644);
    15  
    16  /* Initializes the TDP MMU for the VM, if enabled. */
    17  void kvm_mmu_init_tdp_mmu(struct kvm *kvm)
    18  {
    19          if (!tdp_enabled || !READ_ONCE(tdp_mmu_enabled))
    20                  return;
    21  
    22          /* This should not be changed for the lifetime of the VM. */
    23          kvm->arch.tdp_mmu_enabled = true;
    24  
    25          INIT_LIST_HEAD(&kvm->arch.tdp_mmu_roots);
    26          spin_lock_init(&kvm->arch.tdp_mmu_pages_lock);
    27          INIT_LIST_HEAD(&kvm->arch.tdp_mmu_pages);
    28  }
    29  
    30  void kvm_mmu_uninit_tdp_mmu(struct kvm *kvm)
    31  {
    32          if (!kvm->arch.tdp_mmu_enabled)
    33                  return;
    34  
    35          WARN_ON(!list_empty(&kvm->arch.tdp_mmu_roots));
    36  
    37          /*
    38           * Ensure that all the outstanding RCU callbacks to free shadow 
pages
    39           * can run before the VM is torn down.
    40           */
    41          rcu_barrier();
    42  }
    43  
    44  static bool zap_gfn_range(struct kvm *kvm, struct kvm_mmu_page *root,
    45                            gfn_t start, gfn_t end, bool can_yield);
    46  
    47  static void tdp_mmu_free_sp(struct kvm_mmu_page *sp)
    48  {
    49          free_page((unsigned long)sp->spt);
    50          kmem_cache_free(mmu_page_header_cache, sp);
    51  }
    52  
    53  /*
    54   * This is called through call_rcu in order to free TDP page table 
memory
    55   * safely with respect to other kernel threads that may be operating on
    56   * the memory.
    57   * By only accessing TDP MMU page table memory in an RCU read critical
    58   * section, and freeing it after a grace period, lockless access to that
    59   * memory won't use it after it is freed.
    60   */
    61  static void tdp_mmu_free_sp_rcu_callback(struct rcu_head *head)
    62  {
    63          struct kvm_mmu_page *sp = container_of(head, struct 
kvm_mmu_page,
    64                                                 rcu_head);
    65  
    66          tdp_mmu_free_sp(sp);
    67  }
    68  
    69  void kvm_tdp_mmu_put_root(struct kvm *kvm, struct kvm_mmu_page *root)
    70  {
    71          gfn_t max_gfn = 1ULL << (shadow_phys_bits - PAGE_SHIFT);
    72  
    73          lockdep_assert_held_write(&kvm->mmu_lock);
    74  
    75          if (!refcount_dec_and_test(&root->tdp_mmu_root_count))
    76                  return;
    77  
    78          WARN_ON(!root->tdp_mmu_page);
    79  
    80          spin_lock(&kvm->arch.tdp_mmu_pages_lock);
    81          list_del_rcu(&root->link);
    82          spin_unlock(&kvm->arch.tdp_mmu_pages_lock);
    83  
    84          zap_gfn_range(kvm, root, 0, max_gfn, false);
    85  
    86          call_rcu(&root->rcu_head, tdp_mmu_free_sp_rcu_callback);
    87  }
    88  
    89  /*
    90   * Finds the next valid root after root (or the first valid root if root
    91   * is NULL), takes a reference on it, and returns that next root. If 
root
    92   * is not NULL, this thread should have already taken a reference on 
it, and
    93   * that reference will be dropped. If no valid root is found, this
    94   * function will return NULL.
    95   */
    96  static struct kvm_mmu_page *tdp_mmu_next_root(struct kvm *kvm,
    97                                                struct kvm_mmu_page 
*prev_root)
    98  {
    99          struct kvm_mmu_page *next_root;
   100  
   101          lockdep_assert_held_write(&kvm->mmu_lock);
   102  
   103          rcu_read_lock();
   104  
   105          if (prev_root)
   106                  next_root = 
list_next_or_null_rcu(&kvm->arch.tdp_mmu_roots,
   107                                                    &prev_root->link,
   108                                                    typeof(*prev_root), 
link);
   109          else
   110                  next_root = 
list_first_or_null_rcu(&kvm->arch.tdp_mmu_roots,
   111                                                     typeof(*next_root), 
link);
   112  
   113          while (next_root && !kvm_tdp_mmu_get_root(kvm, next_root))
   114                  next_root = 
list_next_or_null_rcu(&kvm->arch.tdp_mmu_roots,
   115                                  &next_root->link, typeof(*next_root), 
link);
   116  
   117          rcu_read_unlock();
   118  
   119          if (prev_root)
   120                  kvm_tdp_mmu_put_root(kvm, prev_root);
   121  
   122          return next_root;
   123  }
   124  
   125  /*
   126   * Note: this iterator gets and puts references to the roots it 
iterates over.
   127   * This makes it safe to release the MMU lock and yield within the 
loop, but
   128   * if exiting the loop early, the caller must drop the reference to the 
most
   129   * recent root. (Unless keeping a live reference is desirable.)
   130   */
   131  #define for_each_tdp_mmu_root_yield_safe(_kvm, _root)   \
   132          for (_root = tdp_mmu_next_root(_kvm, NULL);     \
   133               _root;                                     \
   134               _root = tdp_mmu_next_root(_kvm, _root))
   135  
   136  /* Only safe under the MMU lock in write mode, without yielding. */
   137  #define for_each_tdp_mmu_root(_kvm, _root)                              
\
   138          list_for_each_entry_rcu(_root, &_kvm->arch.tdp_mmu_roots, link, 
\
 > 139                                  lockdep_is_held_write(&kvm->mmu_lock))
   140  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]

Attachment: .config.gz
Description: application/gzip

Reply via email to