diff mbox

[3/3] add cpu_set qmp command

Message ID 1326806230-2734-4-git-send-email-imammedo@redhat.com
State New
Headers show

Commit Message

Igor Mammedov Jan. 17, 2012, 1:17 p.m. UTC
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 qapi-schema.json |    9 +++++++++
 qmp-commands.hx  |   26 ++++++++++++++++++++++++++
 qmp.c            |   15 +++++++++++++++
 3 files changed, 50 insertions(+), 0 deletions(-)

Comments

Jan Kiszka Jan. 17, 2012, 2:18 p.m. UTC | #1
On 2012-01-17 14:17, Igor Mammedov wrote:
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  qapi-schema.json |    9 +++++++++
>  qmp-commands.hx  |   26 ++++++++++++++++++++++++++
>  qmp.c            |   15 +++++++++++++++
>  3 files changed, 50 insertions(+), 0 deletions(-)
> 
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 44cf764..05cc582 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -903,6 +903,15 @@
>  { 'command': 'cpu', 'data': {'index': 'int'} }
>  
>  ##
> +# @cpu_set
> +#
> +# Sets specified cpu to online/ofline mode
> +#
> +# Notes: semantics is : cpu_set x online|offline
> +##
> +{ 'command': 'cpu_set', 'data': {'cpu_index': 'int', 'status': 'str'} }
> +
> +##
>  # @memsave:
>  #
>  # Save a portion of guest memory to a file.
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index 7e3f4b9..ef1ac1e 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -348,6 +348,32 @@ Note: CPUs' indexes are obtained with the 'query-cpus' command.
>  EQMP
>  
>      {
> +        .name       = "cpu_set",
> +        .args_type  = "cpu_index:i,status:s",
> +        .mhandler.cmd_new = qmp_marshal_input_cpu_set,
> +    },
> +
> +SQMP
> +cpu_set
> +-------
> +
> +Sets virtual cpu to online/ofline state
> +
> +Arguments:
> +
> +- "cpu_index": virtual cpu index (json-int)
> +- "status": desired state of cpu, online/offline (json-string)
> +
> +Example:
> +
> +-> { "execute": "cpu_set",
> +             "arguments": { "cpu_index": 2,
> +                            "status": "online" } }
> +<- { "return": {} }
> +
> +EQMP
> +
> +    {
>          .name       = "memsave",
>          .args_type  = "val:l,size:i,filename:s,cpu:i?",
>          .mhandler.cmd_new = qmp_marshal_input_memsave,
> diff --git a/qmp.c b/qmp.c
> index c74dde6..e2b268d 100644
> --- a/qmp.c
> +++ b/qmp.c
> @@ -101,6 +101,21 @@ void qmp_cpu(int64_t index, Error **errp)
>      /* Just do nothing */
>  }
>  
> +void qmp_cpu_set(int64_t cpu_index, const char *status, Error **errp)
> +{
> +    int state;
> +
> +    if (!strcmp(status, "online")) {
> +        state = 1;
> +    } else if (!strcmp(status, "offline")) {
> +        state = 0;
> +    } else {
> +        error_set(errp, QERR_INVALID_PARAMETER, status);
> +        return;
> +    }
> +    qemu_system_cpu_hot_add(cpu_index, state);
> +}
> +
>  #ifndef CONFIG_VNC
>  /* If VNC support is enabled, the "true" query-vnc command is
>     defined in the VNC subsystem */

This shouldn't go upstream. We rather need qdev'ified CPUs that can be
added and removed as any other device.

Jan
Igor Mammedov Jan. 19, 2012, 9:38 a.m. UTC | #2
On 01/17/2012 03:18 PM, Jan Kiszka wrote:
> On 2012-01-17 14:17, Igor Mammedov wrote:
>> Signed-off-by: Igor Mammedov<imammedo@redhat.com>
>> ---
>>   qapi-schema.json |    9 +++++++++
>>   qmp-commands.hx  |   26 ++++++++++++++++++++++++++
>>   qmp.c            |   15 +++++++++++++++
>>   3 files changed, 50 insertions(+), 0 deletions(-)
>>
>> diff --git a/qapi-schema.json b/qapi-schema.json
>> index 44cf764..05cc582 100644
>> --- a/qapi-schema.json
>> +++ b/qapi-schema.json
>> @@ -903,6 +903,15 @@
>>   { 'command': 'cpu', 'data': {'index': 'int'} }
>>
>>   ##
>> +# @cpu_set
>> +#
>> +# Sets specified cpu to online/ofline mode
>> +#
>> +# Notes: semantics is : cpu_set x online|offline
>> +##
>> +{ 'command': 'cpu_set', 'data': {'cpu_index': 'int', 'status': 'str'} }
>> +
>> +##
>>   # @memsave:
>>   #
>>   # Save a portion of guest memory to a file.
>> diff --git a/qmp-commands.hx b/qmp-commands.hx
>> index 7e3f4b9..ef1ac1e 100644
>> --- a/qmp-commands.hx
>> +++ b/qmp-commands.hx
>> @@ -348,6 +348,32 @@ Note: CPUs' indexes are obtained with the 'query-cpus' command.
>>   EQMP
>>
>>       {
>> +        .name       = "cpu_set",
>> +        .args_type  = "cpu_index:i,status:s",
>> +        .mhandler.cmd_new = qmp_marshal_input_cpu_set,
>> +    },
>> +
>> +SQMP
>> +cpu_set
>> +-------
>> +
>> +Sets virtual cpu to online/ofline state
>> +
>> +Arguments:
>> +
>> +- "cpu_index": virtual cpu index (json-int)
>> +- "status": desired state of cpu, online/offline (json-string)
>> +
>> +Example:
>> +
>> +->  { "execute": "cpu_set",
>> +             "arguments": { "cpu_index": 2,
>> +                            "status": "online" } }
>> +<- { "return": {} }
>> +
>> +EQMP
>> +
>> +    {
>>           .name       = "memsave",
>>           .args_type  = "val:l,size:i,filename:s,cpu:i?",
>>           .mhandler.cmd_new = qmp_marshal_input_memsave,
>> diff --git a/qmp.c b/qmp.c
>> index c74dde6..e2b268d 100644
>> --- a/qmp.c
>> +++ b/qmp.c
>> @@ -101,6 +101,21 @@ void qmp_cpu(int64_t index, Error **errp)
>>       /* Just do nothing */
>>   }
>>
>> +void qmp_cpu_set(int64_t cpu_index, const char *status, Error **errp)
>> +{
>> +    int state;
>> +
>> +    if (!strcmp(status, "online")) {
>> +        state = 1;
>> +    } else if (!strcmp(status, "offline")) {
>> +        state = 0;
>> +    } else {
>> +        error_set(errp, QERR_INVALID_PARAMETER, status);
>> +        return;
>> +    }
>> +    qemu_system_cpu_hot_add(cpu_index, state);
>> +}
>> +
>>   #ifndef CONFIG_VNC
>>   /* If VNC support is enabled, the "true" query-vnc command is
>>      defined in the VNC subsystem */
>
> This shouldn't go upstream. We rather need qdev'ified CPUs that can be
> added and removed as any other device.
>

Jan,

Thanks for review!
Then I'll drop this patch and re-post the other ones after fixing them.

> Jan
>
Jan Kiszka Jan. 19, 2012, 10:24 a.m. UTC | #3
On 2012-01-19 10:38, Igor Mammedov wrote:
> On 01/17/2012 03:18 PM, Jan Kiszka wrote:
>> On 2012-01-17 14:17, Igor Mammedov wrote:
>>> Signed-off-by: Igor Mammedov<imammedo@redhat.com>
>>> ---
>>>   qapi-schema.json |    9 +++++++++
>>>   qmp-commands.hx  |   26 ++++++++++++++++++++++++++
>>>   qmp.c            |   15 +++++++++++++++
>>>   3 files changed, 50 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/qapi-schema.json b/qapi-schema.json
>>> index 44cf764..05cc582 100644
>>> --- a/qapi-schema.json
>>> +++ b/qapi-schema.json
>>> @@ -903,6 +903,15 @@
>>>   { 'command': 'cpu', 'data': {'index': 'int'} }
>>>
>>>   ##
>>> +# @cpu_set
>>> +#
>>> +# Sets specified cpu to online/ofline mode
>>> +#
>>> +# Notes: semantics is : cpu_set x online|offline
>>> +##
>>> +{ 'command': 'cpu_set', 'data': {'cpu_index': 'int', 'status': 'str'} }
>>> +
>>> +##
>>>   # @memsave:
>>>   #
>>>   # Save a portion of guest memory to a file.
>>> diff --git a/qmp-commands.hx b/qmp-commands.hx
>>> index 7e3f4b9..ef1ac1e 100644
>>> --- a/qmp-commands.hx
>>> +++ b/qmp-commands.hx
>>> @@ -348,6 +348,32 @@ Note: CPUs' indexes are obtained with the 'query-cpus' command.
>>>   EQMP
>>>
>>>       {
>>> +        .name       = "cpu_set",
>>> +        .args_type  = "cpu_index:i,status:s",
>>> +        .mhandler.cmd_new = qmp_marshal_input_cpu_set,
>>> +    },
>>> +
>>> +SQMP
>>> +cpu_set
>>> +-------
>>> +
>>> +Sets virtual cpu to online/ofline state
>>> +
>>> +Arguments:
>>> +
>>> +- "cpu_index": virtual cpu index (json-int)
>>> +- "status": desired state of cpu, online/offline (json-string)
>>> +
>>> +Example:
>>> +
>>> +->  { "execute": "cpu_set",
>>> +             "arguments": { "cpu_index": 2,
>>> +                            "status": "online" } }
>>> +<- { "return": {} }
>>> +
>>> +EQMP
>>> +
>>> +    {
>>>           .name       = "memsave",
>>>           .args_type  = "val:l,size:i,filename:s,cpu:i?",
>>>           .mhandler.cmd_new = qmp_marshal_input_memsave,
>>> diff --git a/qmp.c b/qmp.c
>>> index c74dde6..e2b268d 100644
>>> --- a/qmp.c
>>> +++ b/qmp.c
>>> @@ -101,6 +101,21 @@ void qmp_cpu(int64_t index, Error **errp)
>>>       /* Just do nothing */
>>>   }
>>>
>>> +void qmp_cpu_set(int64_t cpu_index, const char *status, Error **errp)
>>> +{
>>> +    int state;
>>> +
>>> +    if (!strcmp(status, "online")) {
>>> +        state = 1;
>>> +    } else if (!strcmp(status, "offline")) {
>>> +        state = 0;
>>> +    } else {
>>> +        error_set(errp, QERR_INVALID_PARAMETER, status);
>>> +        return;
>>> +    }
>>> +    qemu_system_cpu_hot_add(cpu_index, state);
>>> +}
>>> +
>>>   #ifndef CONFIG_VNC
>>>   /* If VNC support is enabled, the "true" query-vnc command is
>>>      defined in the VNC subsystem */
>>
>> This shouldn't go upstream. We rather need qdev'ified CPUs that can be
>> added and removed as any other device.
>>
> 
> Jan,
> 
> Thanks for review!
> Then I'll drop this patch and re-post the other ones after fixing them.

Well, you will still need the control logic of this patch, thus need to
think about converting x86 CPUs to qdev. Otherwise, testing will only be
possible over qemu-kvm.

Jan
Igor Mammedov Jan. 19, 2012, 11:04 a.m. UTC | #4
On 01/19/2012 11:24 AM, Jan Kiszka wrote:
> On 2012-01-19 10:38, Igor Mammedov wrote:
>> On 01/17/2012 03:18 PM, Jan Kiszka wrote:
>>> On 2012-01-17 14:17, Igor Mammedov wrote:
>>>> Signed-off-by: Igor Mammedov<imammedo@redhat.com>
>>>> ---
>>>>    qapi-schema.json |    9 +++++++++
>>>>    qmp-commands.hx  |   26 ++++++++++++++++++++++++++
>>>>    qmp.c            |   15 +++++++++++++++
>>>>    3 files changed, 50 insertions(+), 0 deletions(-)
>>>>
>>>> diff --git a/qapi-schema.json b/qapi-schema.json
>>>> index 44cf764..05cc582 100644
>>>> --- a/qapi-schema.json
>>>> +++ b/qapi-schema.json
>>>> @@ -903,6 +903,15 @@
>>>>    { 'command': 'cpu', 'data': {'index': 'int'} }
>>>>
>>>>    ##
>>>> +# @cpu_set
>>>> +#
>>>> +# Sets specified cpu to online/ofline mode
>>>> +#
>>>> +# Notes: semantics is : cpu_set x online|offline
>>>> +##
>>>> +{ 'command': 'cpu_set', 'data': {'cpu_index': 'int', 'status': 'str'} }
>>>> +
>>>> +##
>>>>    # @memsave:
>>>>    #
>>>>    # Save a portion of guest memory to a file.
>>>> diff --git a/qmp-commands.hx b/qmp-commands.hx
>>>> index 7e3f4b9..ef1ac1e 100644
>>>> --- a/qmp-commands.hx
>>>> +++ b/qmp-commands.hx
>>>> @@ -348,6 +348,32 @@ Note: CPUs' indexes are obtained with the 'query-cpus' command.
>>>>    EQMP
>>>>
>>>>        {
>>>> +        .name       = "cpu_set",
>>>> +        .args_type  = "cpu_index:i,status:s",
>>>> +        .mhandler.cmd_new = qmp_marshal_input_cpu_set,
>>>> +    },
>>>> +
>>>> +SQMP
>>>> +cpu_set
>>>> +-------
>>>> +
>>>> +Sets virtual cpu to online/ofline state
>>>> +
>>>> +Arguments:
>>>> +
>>>> +- "cpu_index": virtual cpu index (json-int)
>>>> +- "status": desired state of cpu, online/offline (json-string)
>>>> +
>>>> +Example:
>>>> +
>>>> +->   { "execute": "cpu_set",
>>>> +             "arguments": { "cpu_index": 2,
>>>> +                            "status": "online" } }
>>>> +<- { "return": {} }
>>>> +
>>>> +EQMP
>>>> +
>>>> +    {
>>>>            .name       = "memsave",
>>>>            .args_type  = "val:l,size:i,filename:s,cpu:i?",
>>>>            .mhandler.cmd_new = qmp_marshal_input_memsave,
>>>> diff --git a/qmp.c b/qmp.c
>>>> index c74dde6..e2b268d 100644
>>>> --- a/qmp.c
>>>> +++ b/qmp.c
>>>> @@ -101,6 +101,21 @@ void qmp_cpu(int64_t index, Error **errp)
>>>>        /* Just do nothing */
>>>>    }
>>>>
>>>> +void qmp_cpu_set(int64_t cpu_index, const char *status, Error **errp)
>>>> +{
>>>> +    int state;
>>>> +
>>>> +    if (!strcmp(status, "online")) {
>>>> +        state = 1;
>>>> +    } else if (!strcmp(status, "offline")) {
>>>> +        state = 0;
>>>> +    } else {
>>>> +        error_set(errp, QERR_INVALID_PARAMETER, status);
>>>> +        return;
>>>> +    }
>>>> +    qemu_system_cpu_hot_add(cpu_index, state);
>>>> +}
>>>> +
>>>>    #ifndef CONFIG_VNC
>>>>    /* If VNC support is enabled, the "true" query-vnc command is
>>>>       defined in the VNC subsystem */
>>>
>>> This shouldn't go upstream. We rather need qdev'ified CPUs that can be
>>> added and removed as any other device.
>>>
>>
>> Jan,
>>
>> Thanks for review!
>> Then I'll drop this patch and re-post the other ones after fixing them.
>
> Well, you will still need the control logic of this patch, thus need to
> think about converting x86 CPUs to qdev. Otherwise, testing will only be
> possible over qemu-kvm.
>
> Jan
>

I've agree that converting x86 CPUs to qdev is needed. I've seen RFC
patches for qev-ifying ppc CPU but they haven't made to upstream yet. I'll
look at them as model for x86 CPU conversion but I can't promise fast
results here (I'm complete newbie in this). I'm open to suggestions if
you have a better idea how to do it or a better example.

I think there is sense in having in the tree the first 2 patches separately
from qdev-ifying cpu patches, since they provide a basic infrastructure
for vcpu hot-plug and we will reduce difference between qemu and qemu-kvm
in this parts of code. In addition, it will open a road for hot-unplug
patches that people send now against qemu-kvm.

It still will be possible to play with hot-plug using 3rd patch off the tree
while qdev-ifed cpu patch(es) in works.
diff mbox

Patch

diff --git a/qapi-schema.json b/qapi-schema.json
index 44cf764..05cc582 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -903,6 +903,15 @@ 
 { 'command': 'cpu', 'data': {'index': 'int'} }
 
 ##
+# @cpu_set
+#
+# Sets specified cpu to online/ofline mode
+#
+# Notes: semantics is : cpu_set x online|offline
+##
+{ 'command': 'cpu_set', 'data': {'cpu_index': 'int', 'status': 'str'} }
+
+##
 # @memsave:
 #
 # Save a portion of guest memory to a file.
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 7e3f4b9..ef1ac1e 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -348,6 +348,32 @@  Note: CPUs' indexes are obtained with the 'query-cpus' command.
 EQMP
 
     {
+        .name       = "cpu_set",
+        .args_type  = "cpu_index:i,status:s",
+        .mhandler.cmd_new = qmp_marshal_input_cpu_set,
+    },
+
+SQMP
+cpu_set
+-------
+
+Sets virtual cpu to online/ofline state
+
+Arguments:
+
+- "cpu_index": virtual cpu index (json-int)
+- "status": desired state of cpu, online/offline (json-string)
+
+Example:
+
+-> { "execute": "cpu_set",
+             "arguments": { "cpu_index": 2,
+                            "status": "online" } }
+<- { "return": {} }
+
+EQMP
+
+    {
         .name       = "memsave",
         .args_type  = "val:l,size:i,filename:s,cpu:i?",
         .mhandler.cmd_new = qmp_marshal_input_memsave,
diff --git a/qmp.c b/qmp.c
index c74dde6..e2b268d 100644
--- a/qmp.c
+++ b/qmp.c
@@ -101,6 +101,21 @@  void qmp_cpu(int64_t index, Error **errp)
     /* Just do nothing */
 }
 
+void qmp_cpu_set(int64_t cpu_index, const char *status, Error **errp)
+{
+    int state;
+
+    if (!strcmp(status, "online")) {
+        state = 1;
+    } else if (!strcmp(status, "offline")) {
+        state = 0;
+    } else {
+        error_set(errp, QERR_INVALID_PARAMETER, status);
+        return;
+    }
+    qemu_system_cpu_hot_add(cpu_index, state);
+}
+
 #ifndef CONFIG_VNC
 /* If VNC support is enabled, the "true" query-vnc command is
    defined in the VNC subsystem */