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 <lkp@xxxxxxxxx> 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-all@xxxxxxxxxxxx
Attachment:
.config.gz
Description: application/gzip