Hi Ram,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on powerpc/next]
[also build test WARNING on v5.7 next-20200529]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:    
https://github.com/0day-ci/linux/commits/Ram-Pai/Migrate-non-migrated-pages-of-a-SVM/20200601-034649
base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-allyesconfig (attached as .config)
compiler: powerpc64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross 
ARCH=powerpc 

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

All warnings (new ones prefixed by >>, old ones prefixed by <<):

arch/powerpc/kvm/book3s_hv_uvmem.c:158:6: warning: no previous prototype for 
'kvmppc_uvmem_available' [-Wmissing-prototypes]
158 | bool kvmppc_uvmem_available(void)
|      ^~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kvm/book3s_hv_uvmem.c:167:5: warning: no previous prototype for 
'kvmppc_uvmem_slot_init' [-Wmissing-prototypes]
167 | int kvmppc_uvmem_slot_init(struct kvm *kvm, const struct kvm_memory_slot 
*slot)
|     ^~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kvm/book3s_hv_uvmem.c:192:6: warning: no previous prototype for 
'kvmppc_uvmem_slot_free' [-Wmissing-prototypes]
192 | void kvmppc_uvmem_slot_free(struct kvm *kvm, const struct kvm_memory_slot 
*slot)
|      ^~~~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/kvm/book3s_hv_uvmem.c:279:6: warning: no previous prototype for 
>> 'kvmppc_gfn_is_uvmem_shared' [-Wmissing-prototypes]
279 | bool kvmppc_gfn_is_uvmem_shared(unsigned long gfn, struct kvm *kvm)
|      ^~~~~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kvm/book3s_hv_uvmem.c:293:15: warning: no previous prototype for 
'kvmppc_h_svm_init_start' [-Wmissing-prototypes]
293 | unsigned long kvmppc_h_svm_init_start(struct kvm *kvm)
|               ^~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kvm/book3s_hv_uvmem.c:335:15: warning: no previous prototype for 
'kvmppc_h_svm_init_done' [-Wmissing-prototypes]
335 | unsigned long kvmppc_h_svm_init_done(struct kvm *kvm)
|               ^~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kvm/book3s_hv_uvmem.c:356:6: warning: no previous prototype for 
'kvmppc_uvmem_drop_pages' [-Wmissing-prototypes]
356 | void kvmppc_uvmem_drop_pages(const struct kvm_memory_slot *free,
|      ^~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kvm/book3s_hv_uvmem.c:397:15: warning: no previous prototype for 
'kvmppc_h_svm_init_abort' [-Wmissing-prototypes]
397 | unsigned long kvmppc_h_svm_init_abort(struct kvm *kvm)
|               ^~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kvm/book3s_hv_uvmem.c:599:15: warning: no previous prototype for 
'kvmppc_h_svm_page_in' [-Wmissing-prototypes]
599 | unsigned long kvmppc_h_svm_page_in(struct kvm *kvm, unsigned long gpa,
|               ^~~~~~~~~~~~~~~~~~~~
arch/powerpc/kvm/book3s_hv_uvmem.c:784:1: warning: no previous prototype for 
'kvmppc_h_svm_page_out' [-Wmissing-prototypes]
784 | kvmppc_h_svm_page_out(struct kvm *kvm, unsigned long gpa,
| ^~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kvm/book3s_hv_uvmem.c:822:5: warning: no previous prototype for 
'kvmppc_send_page_to_uv' [-Wmissing-prototypes]
822 | int kvmppc_send_page_to_uv(struct kvm *kvm, unsigned long gfn)
|     ^~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kvm/book3s_hv_uvmem.c:867:5: warning: no previous prototype for 
'kvmppc_uvmem_init' [-Wmissing-prototypes]
867 | int kvmppc_uvmem_init(void)
|     ^~~~~~~~~~~~~~~~~
arch/powerpc/kvm/book3s_hv_uvmem.c:922:6: warning: no previous prototype for 
'kvmppc_uvmem_free' [-Wmissing-prototypes]
922 | void kvmppc_uvmem_free(void)
|      ^~~~~~~~~~~~~~~~~

vim +/kvmppc_gfn_is_uvmem_shared +279 arch/powerpc/kvm/book3s_hv_uvmem.c

   157  
 > 158  bool kvmppc_uvmem_available(void)
   159  {
   160          /*
   161           * If kvmppc_uvmem_bitmap != NULL, then there is an ultravisor
   162           * and our data structures have been initialized successfully.
   163           */
   164          return !!kvmppc_uvmem_bitmap;
   165  }
   166  
   167  int kvmppc_uvmem_slot_init(struct kvm *kvm, const struct 
kvm_memory_slot *slot)
   168  {
   169          struct kvmppc_uvmem_slot *p;
   170  
   171          p = kzalloc(sizeof(*p), GFP_KERNEL);
   172          if (!p)
   173                  return -ENOMEM;
   174          p->pfns = vzalloc(array_size(slot->npages, sizeof(*p->pfns)));
   175          if (!p->pfns) {
   176                  kfree(p);
   177                  return -ENOMEM;
   178          }
   179          p->nr_pfns = slot->npages;
   180          p->base_pfn = slot->base_gfn;
   181  
   182          mutex_lock(&kvm->arch.uvmem_lock);
   183          list_add(&p->list, &kvm->arch.uvmem_pfns);
   184          mutex_unlock(&kvm->arch.uvmem_lock);
   185  
   186          return 0;
   187  }
   188  
   189  /*
   190   * All device PFNs are already released by the time we come here.
   191   */
   192  void kvmppc_uvmem_slot_free(struct kvm *kvm, const struct 
kvm_memory_slot *slot)
   193  {
   194          struct kvmppc_uvmem_slot *p, *next;
   195  
   196          mutex_lock(&kvm->arch.uvmem_lock);
   197          list_for_each_entry_safe(p, next, &kvm->arch.uvmem_pfns, list) {
   198                  if (p->base_pfn == slot->base_gfn) {
   199                          vfree(p->pfns);
   200                          list_del(&p->list);
   201                          kfree(p);
   202                          break;
   203                  }
   204          }
   205          mutex_unlock(&kvm->arch.uvmem_lock);
   206  }
   207  
   208  static void kvmppc_uvmem_pfn_insert(unsigned long gfn, unsigned long 
uvmem_pfn,
   209                                      struct kvm *kvm)
   210  {
   211          struct kvmppc_uvmem_slot *p;
   212  
   213          list_for_each_entry(p, &kvm->arch.uvmem_pfns, list) {
   214                  if (gfn >= p->base_pfn && gfn < p->base_pfn + 
p->nr_pfns) {
   215                          unsigned long index = gfn - p->base_pfn;
   216  
   217                          p->pfns[index] = uvmem_pfn | KVMPPC_UVMEM_PFN;
   218                          return;
   219                  }
   220          }
   221  }
   222  
   223  static void kvmppc_uvmem_pfn_remove(unsigned long gfn, struct kvm *kvm)
   224  {
   225          struct kvmppc_uvmem_slot *p;
   226  
   227          list_for_each_entry(p, &kvm->arch.uvmem_pfns, list) {
   228                  if (gfn >= p->base_pfn && gfn < p->base_pfn + 
p->nr_pfns) {
   229                          /*
   230                           * Reset everything, but keep the 
KVMPPC_UVMEM_SHARED
   231                           * flag intact.  A gfn continues to be shared or
   232                           * unshared, with or without an associated 
device pfn.
   233                           */
   234                          p->pfns[gfn - p->base_pfn] &= 
KVMPPC_UVMEM_SHARED;
   235                          return;
   236                  }
   237          }
   238  }
   239  
   240  static bool kvmppc_gfn_is_uvmem_pfn(unsigned long gfn, struct kvm *kvm,
   241                                      unsigned long *uvmem_pfn)
   242  {
   243          struct kvmppc_uvmem_slot *p;
   244  
   245          list_for_each_entry(p, &kvm->arch.uvmem_pfns, list) {
   246                  if (gfn >= p->base_pfn && gfn < p->base_pfn + 
p->nr_pfns) {
   247                          unsigned long index = gfn - p->base_pfn;
   248  
   249                          if (p->pfns[index] & KVMPPC_UVMEM_PFN) {
   250                                  if (uvmem_pfn)
   251                                          *uvmem_pfn = p->pfns[index] &
   252                                                       
KVMPPC_UVMEM_PFN_MASK;
   253                                  return true;
   254                          } else
   255                                  return false;
   256                  }
   257          }
   258          return false;
   259  }
   260  
   261  static void kvmppc_gfn_uvmem_shared(unsigned long gfn, struct kvm *kvm,
   262                  bool set)
   263  {
   264          struct kvmppc_uvmem_slot *p;
   265  
   266          list_for_each_entry(p, &kvm->arch.uvmem_pfns, list) {
   267                  if (gfn >= p->base_pfn && gfn < p->base_pfn + 
p->nr_pfns) {
   268                          unsigned long index = gfn - p->base_pfn;
   269  
   270                          if (set)
   271                                  p->pfns[index] |= KVMPPC_UVMEM_SHARED;
   272                          else
   273                                  p->pfns[index] &= ~KVMPPC_UVMEM_SHARED;
   274                          return;
   275                  }
   276          }
   277  }
   278  
 > 279  bool kvmppc_gfn_is_uvmem_shared(unsigned long gfn, struct kvm *kvm)
   280  {
   281          struct kvmppc_uvmem_slot *p;
   282  
   283          list_for_each_entry(p, &kvm->arch.uvmem_pfns, list) {
   284                  if (gfn >= p->base_pfn && gfn < p->base_pfn + 
p->nr_pfns) {
   285                          unsigned long index = gfn - p->base_pfn;
   286  
   287                          return (p->pfns[index] & KVMPPC_UVMEM_SHARED);
   288                  }
   289          }
   290          return false;
   291  }
   292  

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

Attachment: .config.gz
Description: application/gzip

Reply via email to