[PATCH v1 2/4] KVM: PPC: Book3S HV: track shared GFNs of secure VMs
kbuild test robot
lkp at intel.com
Mon Jun 1 14:12:29 AEST 2020
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 at 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-all@lists.01.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 66040 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20200601/98d43ad7/attachment-0001.gz>
More information about the Linuxppc-dev
mailing list