Lines Matching +full:send +full:- +full:migration
1 // SPDX-License-Identifier: GPL-2.0
9 * Test that when the APIC is in xAPIC mode, a vCPU can send an IPI to wake
19 * Migration is a command line option. When used on non-numa machines will
20 * exit with error. Test is still usefull on non-numa for testing IPIs.
67 * Record local version register as a cross-check that APIC access
94 data->halter_apic_id = GET_APIC_ID_FIELD(xapic_read_reg(APIC_ID)); in halter_guest_code()
95 data->halter_lvr = xapic_read_reg(APIC_LVR); in halter_guest_code()
106 data->halter_tpr = xapic_read_reg(APIC_TASKPRI); in halter_guest_code()
107 data->halter_ppr = xapic_read_reg(APIC_PROCPRI); in halter_guest_code()
108 data->hlt_count++; in halter_guest_code()
111 data->wake_count++; in halter_guest_code()
116 * Runs on halter vCPU when IPI arrives. Write an arbitrary non-zero value to
147 * set data->halter_apic_id. in sender_guest_code()
150 icr2_val = SET_APIC_DEST_FIELD(data->halter_apic_id); in sender_guest_code()
151 data->icr = icr_val; in sender_guest_code()
152 data->icr2 = icr2_val; in sender_guest_code()
154 last_wake_count = data->wake_count; in sender_guest_code()
155 last_hlt_count = data->hlt_count; in sender_guest_code()
159 * Send IPI to halter vCPU. in sender_guest_code()
165 data->ipis_sent++; in sender_guest_code()
176 while (rdtsc() - tsc_start < 2000000000) { in sender_guest_code()
178 (data->wake_count != last_wake_count) && in sender_guest_code()
179 (data->hlt_count != last_hlt_count)) in sender_guest_code()
184 (data->wake_count != last_wake_count) && in sender_guest_code()
185 (data->hlt_count != last_hlt_count)); in sender_guest_code()
187 last_wake_count = data->wake_count; in sender_guest_code()
188 last_hlt_count = data->hlt_count; in sender_guest_code()
196 struct kvm_vcpu *vcpu = params->vcpu; in vcpu_thread()
204 vcpu->id, r); in vcpu_thread()
206 fprintf(stderr, "vCPU thread running vCPU %u\n", vcpu->id); in vcpu_thread()
219 vcpu->id, (const char *)uc.args[0], in vcpu_thread()
220 params->data->ipis_sent, params->data->hlt_count, in vcpu_thread()
221 params->data->wake_count, in vcpu_thread()
222 *params->pipis_rcvd, params->data->halter_tpr, in vcpu_thread()
223 params->data->halter_ppr, params->data->halter_lvr, in vcpu_thread()
224 params->data->migrations_attempted, in vcpu_thread()
225 params->data->migrations_completed); in vcpu_thread()
239 vcpu->id, r); in cancel_join_vcpu_thread()
244 vcpu->id, r); in cancel_join_vcpu_thread()
275 "(each 1-bit indicates node is present): %#lx\n", in do_migrations()
278 /* Init array of masks containing a single-bit in each, one for each in do_migrations()
290 "Did not find at least 2 numa nodes. Can't do migration"); in do_migrations()
299 ipis_sent = data->ipis_sent; in do_migrations()
300 hlt_count = data->hlt_count; in do_migrations()
301 wake_count = data->wake_count; in do_migrations()
303 while ((int)(time(NULL) - start_time) < run_secs) { in do_migrations()
304 data->migrations_attempted++; in do_migrations()
325 data->migrations_completed++; in do_migrations()
333 if (((now - start_time) % interval_secs == 0) && in do_migrations()
339 now - start_time, data->migrations_attempted, in do_migrations()
340 data->migrations_completed, in do_migrations()
341 data->ipis_sent, *pipis_rcvd, in do_migrations()
342 data->hlt_count, data->wake_count); in do_migrations()
344 TEST_ASSERT(ipis_sent != data->ipis_sent && in do_migrations()
345 hlt_count != data->hlt_count && in do_migrations()
346 wake_count != data->wake_count, in do_migrations()
351 ipis_sent = data->ipis_sent; in do_migrations()
352 hlt_count = data->hlt_count; in do_migrations()
353 wake_count = data->wake_count; in do_migrations()
365 if (opt == -1) in get_cmdline_args()
379 "Usage: -s <runtime seconds>. Default is %d seconds.\n" in get_cmdline_args()
380 "-m adds calls to migrate_pages while vCPUs are running." in get_cmdline_args()
382 "-d <delay microseconds> - delay between migrate_pages() calls." in get_cmdline_args()
438 while ((wait_secs < max_halter_wait) && !data->hlt_count) { in main()
443 TEST_ASSERT(data->hlt_count, in main()
449 data->halter_apic_id, wait_secs); in main()
476 TEST_ASSERT(data->hlt_count >= vcpu_get_stat(params[0].vcpu, halt_exits), in main()
478 data->hlt_count, vcpu_get_stat(params[0].vcpu, halt_exits)); in main()
480 TEST_ASSERT_EQ(data->hlt_count, vcpu_get_stat(params[0].vcpu, halt_exits)); in main()
491 run_secs, data->ipis_sent, in main()
492 data->hlt_count, data->wake_count, *pipis_rcvd, in main()
493 data->halter_apic_id, in main()
494 data->icr, data->icr2, in main()
495 data->halter_tpr, data->halter_ppr, data->halter_lvr, in main()
496 data->migrations_attempted, data->migrations_completed); in main()