VMware balloon: Add support for balloon capabilities.
In order to extend the balloon protocol, the hypervisor and the guest driver need to agree on a set of supported functionality to use. Signed-off-by: Xavier Deguillard <xdeguillard@vmware.com> Acked-by: Dmitry Torokhov <dtor@vmware.com> Signed-off-by: Philip P. Moltmann <moltmann@vmware.com> Acked-by: Andy King <acking@vmware.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
ef0f8f1129
commit
eb79100fe6
1 changed files with 43 additions and 29 deletions
|
@ -46,7 +46,7 @@
|
||||||
|
|
||||||
MODULE_AUTHOR("VMware, Inc.");
|
MODULE_AUTHOR("VMware, Inc.");
|
||||||
MODULE_DESCRIPTION("VMware Memory Control (Balloon) Driver");
|
MODULE_DESCRIPTION("VMware Memory Control (Balloon) Driver");
|
||||||
MODULE_VERSION("1.2.2.0-k");
|
MODULE_VERSION("1.3.0.0-k");
|
||||||
MODULE_ALIAS("dmi:*:svnVMware*:*");
|
MODULE_ALIAS("dmi:*:svnVMware*:*");
|
||||||
MODULE_ALIAS("vmware_vmmemctl");
|
MODULE_ALIAS("vmware_vmmemctl");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
@ -110,9 +110,18 @@ MODULE_LICENSE("GPL");
|
||||||
*/
|
*/
|
||||||
#define VMW_BALLOON_HV_PORT 0x5670
|
#define VMW_BALLOON_HV_PORT 0x5670
|
||||||
#define VMW_BALLOON_HV_MAGIC 0x456c6d6f
|
#define VMW_BALLOON_HV_MAGIC 0x456c6d6f
|
||||||
#define VMW_BALLOON_PROTOCOL_VERSION 2
|
|
||||||
#define VMW_BALLOON_GUEST_ID 1 /* Linux */
|
#define VMW_BALLOON_GUEST_ID 1 /* Linux */
|
||||||
|
|
||||||
|
enum vmwballoon_capabilities {
|
||||||
|
/*
|
||||||
|
* Bit 0 is reserved and not associated to any capability.
|
||||||
|
*/
|
||||||
|
VMW_BALLOON_BASIC_CMDS = (1 << 1),
|
||||||
|
VMW_BALLOON_BATCHED_CMDS = (1 << 2)
|
||||||
|
};
|
||||||
|
|
||||||
|
#define VMW_BALLOON_CAPABILITIES (VMW_BALLOON_BASIC_CMDS)
|
||||||
|
|
||||||
#define VMW_BALLOON_CMD_START 0
|
#define VMW_BALLOON_CMD_START 0
|
||||||
#define VMW_BALLOON_CMD_GET_TARGET 1
|
#define VMW_BALLOON_CMD_GET_TARGET 1
|
||||||
#define VMW_BALLOON_CMD_LOCK 2
|
#define VMW_BALLOON_CMD_LOCK 2
|
||||||
|
@ -131,11 +140,13 @@ MODULE_LICENSE("GPL");
|
||||||
#define VMW_BALLOON_ERROR_RESET 7
|
#define VMW_BALLOON_ERROR_RESET 7
|
||||||
#define VMW_BALLOON_ERROR_BUSY 8
|
#define VMW_BALLOON_ERROR_BUSY 8
|
||||||
|
|
||||||
|
#define VMW_BALLOON_SUCCESS_WITH_CAPABILITIES (0x03000000)
|
||||||
|
|
||||||
#define VMWARE_BALLOON_CMD(cmd, data, result) \
|
#define VMWARE_BALLOON_CMD(cmd, data, result) \
|
||||||
({ \
|
({ \
|
||||||
unsigned long __stat, __dummy1, __dummy2; \
|
unsigned long __status, __dummy1, __dummy2; \
|
||||||
__asm__ __volatile__ ("inl %%dx" : \
|
__asm__ __volatile__ ("inl %%dx" : \
|
||||||
"=a"(__stat), \
|
"=a"(__status), \
|
||||||
"=c"(__dummy1), \
|
"=c"(__dummy1), \
|
||||||
"=d"(__dummy2), \
|
"=d"(__dummy2), \
|
||||||
"=b"(result) : \
|
"=b"(result) : \
|
||||||
|
@ -144,8 +155,10 @@ MODULE_LICENSE("GPL");
|
||||||
"2"(VMW_BALLOON_HV_PORT), \
|
"2"(VMW_BALLOON_HV_PORT), \
|
||||||
"3"(data) : \
|
"3"(data) : \
|
||||||
"memory"); \
|
"memory"); \
|
||||||
|
if (VMW_BALLOON_CMD_##cmd == VMW_BALLOON_CMD_START) \
|
||||||
|
result = __dummy1; \
|
||||||
result &= -1UL; \
|
result &= -1UL; \
|
||||||
__stat & -1UL; \
|
__status & -1UL; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_FS
|
#ifdef CONFIG_DEBUG_FS
|
||||||
|
@ -223,11 +236,12 @@ static struct vmballoon balloon;
|
||||||
*/
|
*/
|
||||||
static bool vmballoon_send_start(struct vmballoon *b)
|
static bool vmballoon_send_start(struct vmballoon *b)
|
||||||
{
|
{
|
||||||
unsigned long status, dummy;
|
unsigned long status, capabilities;
|
||||||
|
|
||||||
STATS_INC(b->stats.start);
|
STATS_INC(b->stats.start);
|
||||||
|
|
||||||
status = VMWARE_BALLOON_CMD(START, VMW_BALLOON_PROTOCOL_VERSION, dummy);
|
status = VMWARE_BALLOON_CMD(START, VMW_BALLOON_CAPABILITIES,
|
||||||
|
capabilities);
|
||||||
if (status == VMW_BALLOON_SUCCESS)
|
if (status == VMW_BALLOON_SUCCESS)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue