From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Mian M. Hamayun" Subject: Can we force a KVM VCPU in Guest Mode to Exit to User Mode From User Mode ? Date: Thu, 26 Jul 2012 11:38:54 +0200 Message-ID: <5011102E.5020302@imag.fr> Reply-To: mian-muhammad.hamayun@imag.fr Mime-Version: 1.0 Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary="------------ms000105090308010402050407" To: kvm@vger.kernel.org Return-path: Received: from mx2.imag.fr ([129.88.30.17]:47596 "EHLO rominette.imag.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750766Ab2GZJjA (ORCPT ); Thu, 26 Jul 2012 05:39:00 -0400 Received: from manolette.imag.fr (manolette.imag.fr [129.88.34.201]) by rominette.imag.fr (8.13.8/8.13.8) with ESMTP id q6Q9aXRe003552 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 26 Jul 2012 11:36:33 +0200 Received: from [147.171.132.78] (tima-dhcp-h4e.imag.fr [147.171.132.78]) by manolette.imag.fr (8.13.8/8.13.8) with ESMTP id q6Q9f8lX008109 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 26 Jul 2012 11:41:09 +0200 Sender: kvm-owner@vger.kernel.org List-ID: This is a cryptographically signed message in MIME format. --------------ms000105090308010402050407 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: quoted-printable Hi Everyone, I want to know if we can force a VMExit on a KVM VCPU currently in Guest = Mode from the User Mode ? As an example, I want to execute an IOCTL on a KVM VCPU which is=20 currently in Guest Mode, say it is waiting to execute some guest=20 instructions. As far as I know, the VCPU should not be running for an IOCTL to=20 complete on it. To give you a concrete example, please see the following code segments=20 (taken from qemu-kvm): void run_on_cpu(CPUArchState *env, void (*func)(void *data), void *data) { struct qemu_work_item wi; if (qemu_cpu_is_self(env)) { func(data); return; } wi.func =3D func; wi.data =3D data; if (!env->queued_work_first) { env->queued_work_first =3D &wi; } else { env->queued_work_last->next =3D &wi; } env->queued_work_last =3D &wi; wi.next =3D NULL; wi.done =3D false; qemu_cpu_kick(env); while (!wi.done) { CPUArchState *self_env =3D cpu_single_env; qemu_cond_wait(&qemu_work_cond, &qemu_global_mutex); cpu_single_env =3D self_env; } } The "run_on_cpu" function in qemu-kvm invokes "qemu_cpu_kick" to=20 schedule the appropriate VCPU thread and blocks itself on the=20 "qemu_work_cond". void qemu_cpu_kick(void *_env) { CPUArchState *env =3D _env; qemu_cond_broadcast(env->halt_cond); if (!tcg_enabled() && !env->thread_kicked) { qemu_cpu_kick_thread(env); env->thread_kicked =3D true; } } A "SIG_IPI" is sent to the vcpu thread, which wakes up the target VCPU=20 thread. static void qemu_cpu_kick_thread(CPUArchState *env) { int err; err =3D pthread_kill(env->thread->thread, SIG_IPI); if (err) { fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); exit(1); } } And this thread flushes the queued work using the following function and = unblocks the original thread waiting on "qemu_work_cond". static void flush_queued_work(CPUArchState *env) { struct qemu_work_item *wi; if (!env->queued_work_first) { return; } while ((wi =3D env->queued_work_first)) { env->queued_work_first =3D wi->next; wi->func(wi->data); wi->done =3D true; } env->queued_work_last =3D NULL; qemu_cond_broadcast(&qemu_work_cond); } This mechanism 'seems' to work fine when both vcpu threads are in User=20 Mode. But when booting an SMP Guest, the boot processor (BSP) initially=20 executes the bootstrap code while the non-boot processors (APs) are=20 waiting for initial INIT-SIPI-SIPI messages. What I fail to understand is if an AP is currently waiting for an INIT=20 signal, and we call the "run_on_cpu" function above for this cpu, it=20 blocks the whole system, as the AP is in Guest mode and cannot call the=20 "flush_queued_work" and the BSP is waiting for this to happen. How can we resolve this deadlock ? Is there a way to force the AP to=20 quit the Guest Mode, by using some specific mechanism from the User mode = ? I hope I was able to explain the problem. Best Regards, Hamayun --------------ms000105090308010402050407 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIIAjCC A7YwggKeoAMCAQICAQMwDQYJKoZIhvcNAQEFBQAwLDELMAkGA1UEBhMCRlIxDTALBgNVBAoT BENOUlMxDjAMBgNVBAMTBUNOUlMyMB4XDTA5MDEyMTA5MDM1MloXDTI5MDEyMDA5MDM1Mlow NTELMAkGA1UEBhMCRlIxDTALBgNVBAoTBENOUlMxFzAVBgNVBAMTDkNOUlMyLVN0YW5kYXJk MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnKlkarQHIxnDvggIxOIqXe3UKN7+ P6DtkkRrFkc1EzeNdKn1TYPkBRuPCGFM3ndb16n/u2Wdyaw8D/GJe5MioEcPXwa+jnigC3nX QmVhcmOSQIpbZxD61ic+2HdNHnnbb0sSAFJY4thCBbIzN3fgjWwdvPj28pRYJfeC2YbZXPPY Ls39cIkEh+850SrYkoxpLxxSZfpgjxB/zI/5XC4U7UyL4J03uNI8lMpQ/UF63vY87K7svVwW 3bDwc5l6gf87M9IAnk2Mxls4LjPDdobKclTbLeIQ/ZJQaJOE7XepiWlRhevglKP5lwgRjCTw D7o4tCzW12xOY/60MZ/vj6ZapQIDAQABo4HZMIHWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFBHj2dFSRxtZsTwbeGZr9KGI7QpbMFQGA1UdIwRNMEuAFFCXtg33rDMXr/EdRjxrO/8A oOXloTCkLjAsMQswCQYDVQQGEwJGUjENMAsGA1UEChMEQ05SUzEOMAwGA1UEAxMFQ05SUzKC AQAwDgYDVR0PAQH/BAQDAgEGMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9jcmxzLnNlcnZp Y2VzLmNucnMuZnIvQ05SUzIvZ2V0ZGVyLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAT+njF+ZM J/UXalBV6u7PTKq97izddj5ZoC8LaInaQ9AeHSxrEvlnE55lK6SE0jHPgqDK7yLoEGzpzxd8 rK2HhUyK4dV7TObZDrKh5CmeIK8PPnu5fyRMMuCI/nrarBZgoXWuiZyKZp2Uun6rDiAj7ffH hF2CSBTexNSwxU4sh9SNAxEvNtUpb66ZZxkMjW1aIN/Rn8bLr1XuC8qxWw/vXHT080aJY0d+ LM6/yDANAEb2GOZsPzB+kG4QjR85Sc+TaevInsJnc69Ki/Z8Qijdpd3tr8lVG2Q/VLxhJhDr kdXp9+7Q9gsL+qaQ3WD0QJ0Lp5z4zi8hOP6rBr/aDXf6ZzCCBEQwggMsoAMCAQICAi5NMA0G CSqGSIb3DQEBBQUAMDUxCzAJBgNVBAYTAkZSMQ0wCwYDVQQKEwRDTlJTMRcwFQYDVQQDEw5D TlJTMi1TdGFuZGFyZDAeFw0xMDEyMDcxNDUxMTJaFw0xMjA5MjkxNDUxMTJaMHwxCzAJBgNV BAYTAkZSMQ0wCwYDVQQKEwRDTlJTMRAwDgYDVQQLEwdVTVI1MTU5MR4wHAYDVQQDExVNaWFu LU11aGFtbWFkIEhhbWF5dW4xLDAqBgkqhkiG9w0BCQEWHU1pYW4tTXVoYW1tYWQuSGFtYXl1 bkBpbWFnLmZyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJBGxJA4I58grdhUtbOPP2 KIC5WZPAOwH0O8rQpxMIFcL3zh8K/SK3CtphnUbnOLMsZdd15ZM8ebiHTmtscsPG+9aOSoXw viXwcuXmNdxt0A+QSK8InMRxypgsjF/rhhyEsHNLa6J4sWgBXYkP4AgG1TkG4SG+A5tERGh8 9cwE2wIDAQABo4IBmTCCAZUwDAYDVR0TAQH/BAIwADARBglghkgBhvhCAQEEBAMCBLAwDgYD VR0PAQH/BAQDAgXgMHoGCWCGSAGG+EIBDQRtFmtDZXJ0aWZpY2F0IENOUlMyLVN0YW5kYXJk LiBQb3VyIHRvdXRlIGluZm9ybWF0aW9uIHNlIHJlcG9ydGVyIOAgaHR0cDovL2lnYy5zZXJ2 aWNlcy5jbnJzLmZyL0NOUlMyLVN0YW5kYXJkLzAdBgNVHQ4EFgQU2ehQH3aDOvQOkV44YoUk xmzr4x4wVAYDVR0jBE0wS4AUEePZ0VJHG1mxPBt4Zmv0oYjtCluhMKQuMCwxCzAJBgNVBAYT AkZSMQ0wCwYDVQQKEwRDTlJTMQ4wDAYDVQQDEwVDTlJTMoIBAzAoBgNVHREEITAfgR1NaWFu LU11aGFtbWFkLkhhbWF5dW5AaW1hZy5mcjBHBgNVHR8EQDA+MDygOqA4hjZodHRwOi8vY3Js cy5zZXJ2aWNlcy5jbnJzLmZyL0NOUlMyLVN0YW5kYXJkL2dldGRlci5jcmwwDQYJKoZIhvcN AQEFBQADggEBAAVr5o0odld0uD73gKzHyDfeQQuY2nd3Je5m321fZlecr3AtvatAtI6NNURx W/JDBNYPtDtdt6Q1CH3QB/wrUecyp3CGGQlxOs67OvvQOdaIdeAgpt9mJmM0B/HjiBzER0gC yVbI/t7sDSlBalM847lt8JxEwfUXQWXx0wxi4wk1gyeCm4ebf4PTAUo4/LBSP8KhnlD7MFJ5 RmGD0eDChb7PNSnWE/T8NbSq7uScZs89eUTd/Vtp84wIQGF94+QWECjt6Oq4N2WYeo//9gcI IvDQqdmQZx2bCb2BKdWh+bczQ3ENrjL7Q8X/3oKdnWCm9C+DB1gLAs32O3Q6ErcG398xggI9 MIICOQIBATA7MDUxCzAJBgNVBAYTAkZSMQ0wCwYDVQQKEwRDTlJTMRcwFQYDVQQDEw5DTlJT Mi1TdGFuZGFyZAICLk0wCQYFKw4DAhoFAKCCAVgwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEH ATAcBgkqhkiG9w0BCQUxDxcNMTIwNzI2MDkzODU0WjAjBgkqhkiG9w0BCQQxFgQUA6nrjQkO /RlpEQNbr1/MklhA9BIwSgYJKwYBBAGCNxAEMT0wOzA1MQswCQYDVQQGEwJGUjENMAsGA1UE ChMEQ05SUzEXMBUGA1UEAxMOQ05SUzItU3RhbmRhcmQCAi5NMEwGCyqGSIb3DQEJEAILMT2g OzA1MQswCQYDVQQGEwJGUjENMAsGA1UEChMEQ05SUzEXMBUGA1UEAxMOQ05SUzItU3RhbmRh cmQCAi5NMF8GCSqGSIb3DQEJDzFSMFAwCwYJYIZIAWUDBAECMAoGCCqGSIb3DQMHMA4GCCqG SIb3DQMCAgIAgDANBggqhkiG9w0DAgIBQDAHBgUrDgMCBzANBggqhkiG9w0DAgIBKDANBgkq hkiG9w0BAQEFAASBgAs3jD1LULDFbIp3GCG0Ooxc5mKNIbeh0ID8FfYvHtyFUodFTLR6Tcv0 B5iU85xWcIkYdZcJwlxkZ7P61py76C1iRPIUzzhSq/xJVItPe41vAMj32mepBh5Nakc7WEPf UBBuou3BLUHH6Kj3X0XVXYRrZiF7cvkQQfz4SN/PWpZvAAAAAAAA --------------ms000105090308010402050407--