Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-08 Thread Gleb Natapov
On Thu, Apr 04, 2013 at 06:47:45PM -0500, Scott Wood wrote:
 On 04/04/2013 05:41:35 AM, Gleb Natapov wrote:
 On Tue, Apr 02, 2013 at 08:57:48PM -0500, Scott Wood wrote:
  +struct kvm_device_attr {
  +  __u32   flags;  /* no flags currently defined */
  +  __u32   group;  /* device-defined */
  +  __u64   attr;   /* group-defined */
  +  __u64   addr;   /* userspace address of attr data */
  +};
  +
 Since now each device has its own fd is it an advantage to enforce
 common interface between different devices?
 
 I think so, even if only to avoid repeating the various pains
 surrounding adding ioctls.  Not necessarily enforce, just enable.
 If a device has some sort of command that does not fit neatly into
 the set or get model, it could still add a new ioctl.
 
Make sense.

 If we do so though why not handle file creation, ioctl and file
 descriptor lifetime in the
 common code. Common code will have struct kvm_device with struct
 kvm_device_arch and struct kvm_device_ops members. Instead of
 kvm_mpic_ioctl there will be kvm_device_ioctl which will despatch
 ioctls
 to a device using kvm_device-ops-(set|get|has)_attr pointers.
 
 So make it more like the pre-fd version, except for the actual fd
 usage?  It would make destruction a bit simpler (assuming there's no
 need for vcpu destruction code to access a device).  Hopefully
 nobody asks me to change it back again, though. :-)
 

--
Gleb.
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-08 Thread Gleb Natapov
On Fri, Apr 05, 2013 at 12:02:06PM +1100, Paul Mackerras wrote:
 On Thu, Apr 04, 2013 at 01:41:35PM +0300, Gleb Natapov wrote:
 
  Since now each device has its own fd is it an advantage to enforce
  common interface between different devices? If we do so though why
  not handle file creation, ioctl and file descriptor lifetime in the
  common code. Common code will have struct kvm_device with struct
  kvm_device_arch and struct kvm_device_ops members. Instead of
  kvm_mpic_ioctl there will be kvm_device_ioctl which will despatch ioctls
  to a device using kvm_device-ops-(set|get|has)_attr pointers.
 
 I thought about making the same request, but when I looked at it, the
 amount of code that could be made common in this way is pretty tiny,
 and doing that involves a bit of extra complexity, so I thought that
 on the whole it wouldn't be worthwhile.
 
The value of doing so is not only in making some code common, but also
moving fd lifetime management into the common code where it can be
debugged once and for all potential users. I also expect the amount of
shared code to grow when interface will be used by more architectures.

--
Gleb.
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-08 Thread Scott Wood

On 04/08/2013 12:33:13 AM, Paul Mackerras wrote:

On Tue, Apr 02, 2013 at 08:57:48PM -0500, Scott Wood wrote:

[snip]

 +static int kvm_ioctl_create_device(struct kvm *kvm,
 + struct kvm_create_device *cd)
 +{
 +  bool test = cd-flags  KVM_CREATE_DEVICE_TEST;
 +
 +  switch (cd-type) {
 +  default:
 +  return -ENODEV;
 +  }
 +}

This gives a compile error saying error: unused variable `test',
which is fatal since this gets compiled under arch/powerpc/kvm, and we
treat all warnings as errors there.

This still gives a compile error at the end of your series if you try
to compile with CONFIG_KVM_MPIC=n.


Ah, right.  Will mark as __maybe_unused.

-Scott
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-08 Thread Gleb Natapov
On Thu, Apr 04, 2013 at 06:47:45PM -0500, Scott Wood wrote:
 On 04/04/2013 05:41:35 AM, Gleb Natapov wrote:
 On Tue, Apr 02, 2013 at 08:57:48PM -0500, Scott Wood wrote:
  +struct kvm_device_attr {
  +  __u32   flags;  /* no flags currently defined */
  +  __u32   group;  /* device-defined */
  +  __u64   attr;   /* group-defined */
  +  __u64   addr;   /* userspace address of attr data */
  +};
  +
 Since now each device has its own fd is it an advantage to enforce
 common interface between different devices?
 
 I think so, even if only to avoid repeating the various pains
 surrounding adding ioctls.  Not necessarily enforce, just enable.
 If a device has some sort of command that does not fit neatly into
 the set or get model, it could still add a new ioctl.
 
Make sense.

 If we do so though why not handle file creation, ioctl and file
 descriptor lifetime in the
 common code. Common code will have struct kvm_device with struct
 kvm_device_arch and struct kvm_device_ops members. Instead of
 kvm_mpic_ioctl there will be kvm_device_ioctl which will despatch
 ioctls
 to a device using kvm_device-ops-(set|get|has)_attr pointers.
 
 So make it more like the pre-fd version, except for the actual fd
 usage?  It would make destruction a bit simpler (assuming there's no
 need for vcpu destruction code to access a device).  Hopefully
 nobody asks me to change it back again, though. :-)
 

--
Gleb.
--
To unsubscribe from this list: send the line unsubscribe kvm-ppc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-08 Thread Gleb Natapov
On Fri, Apr 05, 2013 at 12:02:06PM +1100, Paul Mackerras wrote:
 On Thu, Apr 04, 2013 at 01:41:35PM +0300, Gleb Natapov wrote:
 
  Since now each device has its own fd is it an advantage to enforce
  common interface between different devices? If we do so though why
  not handle file creation, ioctl and file descriptor lifetime in the
  common code. Common code will have struct kvm_device with struct
  kvm_device_arch and struct kvm_device_ops members. Instead of
  kvm_mpic_ioctl there will be kvm_device_ioctl which will despatch ioctls
  to a device using kvm_device-ops-(set|get|has)_attr pointers.
 
 I thought about making the same request, but when I looked at it, the
 amount of code that could be made common in this way is pretty tiny,
 and doing that involves a bit of extra complexity, so I thought that
 on the whole it wouldn't be worthwhile.
 
The value of doing so is not only in making some code common, but also
moving fd lifetime management into the common code where it can be
debugged once and for all potential users. I also expect the amount of
shared code to grow when interface will be used by more architectures.

--
Gleb.
--
To unsubscribe from this list: send the line unsubscribe kvm-ppc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-08 Thread Scott Wood

On 04/08/2013 12:33:13 AM, Paul Mackerras wrote:

On Tue, Apr 02, 2013 at 08:57:48PM -0500, Scott Wood wrote:

[snip]

 +static int kvm_ioctl_create_device(struct kvm *kvm,
 + struct kvm_create_device *cd)
 +{
 +  bool test = cd-flags  KVM_CREATE_DEVICE_TEST;
 +
 +  switch (cd-type) {
 +  default:
 +  return -ENODEV;
 +  }
 +}

This gives a compile error saying error: unused variable `test',
which is fatal since this gets compiled under arch/powerpc/kvm, and we
treat all warnings as errors there.

This still gives a compile error at the end of your series if you try
to compile with CONFIG_KVM_MPIC=n.


Ah, right.  Will mark as __maybe_unused.

-Scott
--
To unsubscribe from this list: send the line unsubscribe kvm-ppc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-07 Thread Paul Mackerras
On Tue, Apr 02, 2013 at 08:57:48PM -0500, Scott Wood wrote:

[snip]

 +static int kvm_ioctl_create_device(struct kvm *kvm,
 +struct kvm_create_device *cd)
 +{
 + bool test = cd-flags  KVM_CREATE_DEVICE_TEST;
 +
 + switch (cd-type) {
 + default:
 + return -ENODEV;
 + }
 +}

This gives a compile error saying error: unused variable `test',
which is fatal since this gets compiled under arch/powerpc/kvm, and we
treat all warnings as errors there.

This still gives a compile error at the end of your series if you try
to compile with CONFIG_KVM_MPIC=n.

Paul.
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-07 Thread Paul Mackerras
On Tue, Apr 02, 2013 at 08:57:48PM -0500, Scott Wood wrote:

[snip]

 +static int kvm_ioctl_create_device(struct kvm *kvm,
 +struct kvm_create_device *cd)
 +{
 + bool test = cd-flags  KVM_CREATE_DEVICE_TEST;
 +
 + switch (cd-type) {
 + default:
 + return -ENODEV;
 + }
 +}

This gives a compile error saying error: unused variable `test',
which is fatal since this gets compiled under arch/powerpc/kvm, and we
treat all warnings as errors there.

This still gives a compile error at the end of your series if you try
to compile with CONFIG_KVM_MPIC=n.

Paul.
--
To unsubscribe from this list: send the line unsubscribe kvm-ppc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-04 Thread Gleb Natapov
On Tue, Apr 02, 2013 at 08:57:48PM -0500, Scott Wood wrote:
 Currently, devices that are emulated inside KVM are configured in a
 hardcoded manner based on an assumption that any given architecture
 only has one way to do it.  If there's any need to access device state,
 it is done through inflexible one-purpose-only IOCTLs (e.g.
 KVM_GET/SET_LAPIC).  Defining new IOCTLs for every little thing is
 cumbersome and depletes a limited numberspace.
 
 This API provides a mechanism to instantiate a device of a certain
 type, returning an ID that can be used to set/get attributes of the
 device.  Attributes may include configuration parameters (e.g.
 register base address), device state, operational commands, etc.  It
 is similar to the ONE_REG API, except that it acts on devices rather
 than vcpus.
 
 Both device types and individual attributes can be tested without having
 to create the device or get/set the attribute, without the need for
 separately managing enumerated capabilities.
 
 Signed-off-by: Scott Wood scottw...@freescale.com
 ---
 v3: remove some changes that were merged into this patch by accident,
 and fix the error documentation for KVM_CREATE_DEVICE.
 
 NOTE: I had some difficulty figuring out what ioctl numbers I should
 assign...  it seems that at one point care was taken to keep vcpu and
 vm ioctls separate, but some overlap exists now (despite not exhausing
 the ioctl space).  Some of that was my fault, but not all of it. :-)
 I moved to a new ioctl range for device control -- please let me know
 if there's something else you'd prefer I do.
 ---
  Documentation/virtual/kvm/api.txt|   70 
 ++
  Documentation/virtual/kvm/devices/README |1 +
  include/uapi/linux/kvm.h |   27 
  virt/kvm/kvm_main.c  |   31 +
  4 files changed, 129 insertions(+)
  create mode 100644 Documentation/virtual/kvm/devices/README
 
 diff --git a/Documentation/virtual/kvm/api.txt 
 b/Documentation/virtual/kvm/api.txt
 index 976eb65..d52f3f9 100644
 --- a/Documentation/virtual/kvm/api.txt
 +++ b/Documentation/virtual/kvm/api.txt
 @@ -2173,6 +2173,76 @@ header; first `n_valid' valid entries with contents 
 from the data
  written, then `n_invalid' invalid entries, invalidating any previously
  valid entries found.
  
 +4.79 KVM_CREATE_DEVICE
 +
 +Capability: KVM_CAP_DEVICE_CTRL
 +Type: vm ioctl
 +Parameters: struct kvm_create_device (in/out)
 +Returns: 0 on success, -1 on error
 +Errors:
 +  ENODEV: The device type is unknown or unsupported
 +  EEXIST: Device already created, and this type of device may not
 +  be instantiated multiple times
 +
 +  Other error conditions may be defined by individual device types or
 +  have their standard meanings.
 +
 +Creates an emulated device in the kernel.  The file descriptor returned
 +in fd can be used with KVM_SET/GET/HAS_DEVICE_ATTR.
 +
 +If the KVM_CREATE_DEVICE_TEST flag is set, only test whether the
 +device type is supported (not necessarily whether it can be created
 +in the current vm).
 +
 +Individual devices should not define flags.  Attributes should be used
 +for specifying any behavior that is not implied by the device type
 +number.
 +
 +struct kvm_create_device {
 + __u32   type;   /* in: KVM_DEV_TYPE_xxx */
 + __u32   fd; /* out: device handle */
 + __u32   flags;  /* in: KVM_CREATE_DEVICE_xxx */
 +};
 +
 +4.80 KVM_SET_DEVICE_ATTR/KVM_GET_DEVICE_ATTR
 +
 +Capability: KVM_CAP_DEVICE_CTRL
 +Type: device ioctl
 +Parameters: struct kvm_device_attr
 +Returns: 0 on success, -1 on error
 +Errors:
 +  ENXIO:  The group or attribute is unknown/unsupported for this device
 +  EPERM:  The attribute cannot (currently) be accessed this way
 +  (e.g. read-only attribute, or attribute that only makes
 +  sense when the device is in a different state)
 +
 +  Other error conditions may be defined by individual device types.
 +
 +Gets/sets a specified piece of device configuration and/or state.  The
 +semantics are device-specific.  See individual device documentation in
 +the devices directory.  As with ONE_REG, the size of the data
 +transferred is defined by the particular attribute.
 +
 +struct kvm_device_attr {
 + __u32   flags;  /* no flags currently defined */
 + __u32   group;  /* device-defined */
 + __u64   attr;   /* group-defined */
 + __u64   addr;   /* userspace address of attr data */
 +};
 +
Since now each device has its own fd is it an advantage to enforce
common interface between different devices? If we do so though why
not handle file creation, ioctl and file descriptor lifetime in the
common code. Common code will have struct kvm_device with struct
kvm_device_arch and struct kvm_device_ops members. Instead of
kvm_mpic_ioctl there will be kvm_device_ioctl which will despatch ioctls
to a device using kvm_device-ops-(set|get|has)_attr pointers.

--
Gleb.
--

Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-04 Thread Scott Wood

On 04/04/2013 05:41:35 AM, Gleb Natapov wrote:

On Tue, Apr 02, 2013 at 08:57:48PM -0500, Scott Wood wrote:
 +struct kvm_device_attr {
 +  __u32   flags;  /* no flags currently defined */
 +  __u32   group;  /* device-defined */
 +  __u64   attr;   /* group-defined */
 +  __u64   addr;   /* userspace address of attr data */
 +};
 +
Since now each device has its own fd is it an advantage to enforce
common interface between different devices?


I think so, even if only to avoid repeating the various pains  
surrounding adding ioctls.  Not necessarily enforce, just enable.  If  
a device has some sort of command that does not fit neatly into the  
set or get model, it could still add a new ioctl.


If we do so though why not handle file creation, ioctl and file  
descriptor lifetime in the

common code. Common code will have struct kvm_device with struct
kvm_device_arch and struct kvm_device_ops members. Instead of
kvm_mpic_ioctl there will be kvm_device_ioctl which will despatch  
ioctls

to a device using kvm_device-ops-(set|get|has)_attr pointers.


So make it more like the pre-fd version, except for the actual fd  
usage?  It would make destruction a bit simpler (assuming there's no  
need for vcpu destruction code to access a device).  Hopefully nobody  
asks me to change it back again, though. :-)


-Scott
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-04 Thread Paul Mackerras
On Thu, Apr 04, 2013 at 01:41:35PM +0300, Gleb Natapov wrote:

 Since now each device has its own fd is it an advantage to enforce
 common interface between different devices? If we do so though why
 not handle file creation, ioctl and file descriptor lifetime in the
 common code. Common code will have struct kvm_device with struct
 kvm_device_arch and struct kvm_device_ops members. Instead of
 kvm_mpic_ioctl there will be kvm_device_ioctl which will despatch ioctls
 to a device using kvm_device-ops-(set|get|has)_attr pointers.

I thought about making the same request, but when I looked at it, the
amount of code that could be made common in this way is pretty tiny,
and doing that involves a bit of extra complexity, so I thought that
on the whole it wouldn't be worthwhile.

Paul.
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-04 Thread Gleb Natapov
On Tue, Apr 02, 2013 at 08:57:48PM -0500, Scott Wood wrote:
 Currently, devices that are emulated inside KVM are configured in a
 hardcoded manner based on an assumption that any given architecture
 only has one way to do it.  If there's any need to access device state,
 it is done through inflexible one-purpose-only IOCTLs (e.g.
 KVM_GET/SET_LAPIC).  Defining new IOCTLs for every little thing is
 cumbersome and depletes a limited numberspace.
 
 This API provides a mechanism to instantiate a device of a certain
 type, returning an ID that can be used to set/get attributes of the
 device.  Attributes may include configuration parameters (e.g.
 register base address), device state, operational commands, etc.  It
 is similar to the ONE_REG API, except that it acts on devices rather
 than vcpus.
 
 Both device types and individual attributes can be tested without having
 to create the device or get/set the attribute, without the need for
 separately managing enumerated capabilities.
 
 Signed-off-by: Scott Wood scottw...@freescale.com
 ---
 v3: remove some changes that were merged into this patch by accident,
 and fix the error documentation for KVM_CREATE_DEVICE.
 
 NOTE: I had some difficulty figuring out what ioctl numbers I should
 assign...  it seems that at one point care was taken to keep vcpu and
 vm ioctls separate, but some overlap exists now (despite not exhausing
 the ioctl space).  Some of that was my fault, but not all of it. :-)
 I moved to a new ioctl range for device control -- please let me know
 if there's something else you'd prefer I do.
 ---
  Documentation/virtual/kvm/api.txt|   70 
 ++
  Documentation/virtual/kvm/devices/README |1 +
  include/uapi/linux/kvm.h |   27 
  virt/kvm/kvm_main.c  |   31 +
  4 files changed, 129 insertions(+)
  create mode 100644 Documentation/virtual/kvm/devices/README
 
 diff --git a/Documentation/virtual/kvm/api.txt 
 b/Documentation/virtual/kvm/api.txt
 index 976eb65..d52f3f9 100644
 --- a/Documentation/virtual/kvm/api.txt
 +++ b/Documentation/virtual/kvm/api.txt
 @@ -2173,6 +2173,76 @@ header; first `n_valid' valid entries with contents 
 from the data
  written, then `n_invalid' invalid entries, invalidating any previously
  valid entries found.
  
 +4.79 KVM_CREATE_DEVICE
 +
 +Capability: KVM_CAP_DEVICE_CTRL
 +Type: vm ioctl
 +Parameters: struct kvm_create_device (in/out)
 +Returns: 0 on success, -1 on error
 +Errors:
 +  ENODEV: The device type is unknown or unsupported
 +  EEXIST: Device already created, and this type of device may not
 +  be instantiated multiple times
 +
 +  Other error conditions may be defined by individual device types or
 +  have their standard meanings.
 +
 +Creates an emulated device in the kernel.  The file descriptor returned
 +in fd can be used with KVM_SET/GET/HAS_DEVICE_ATTR.
 +
 +If the KVM_CREATE_DEVICE_TEST flag is set, only test whether the
 +device type is supported (not necessarily whether it can be created
 +in the current vm).
 +
 +Individual devices should not define flags.  Attributes should be used
 +for specifying any behavior that is not implied by the device type
 +number.
 +
 +struct kvm_create_device {
 + __u32   type;   /* in: KVM_DEV_TYPE_xxx */
 + __u32   fd; /* out: device handle */
 + __u32   flags;  /* in: KVM_CREATE_DEVICE_xxx */
 +};
 +
 +4.80 KVM_SET_DEVICE_ATTR/KVM_GET_DEVICE_ATTR
 +
 +Capability: KVM_CAP_DEVICE_CTRL
 +Type: device ioctl
 +Parameters: struct kvm_device_attr
 +Returns: 0 on success, -1 on error
 +Errors:
 +  ENXIO:  The group or attribute is unknown/unsupported for this device
 +  EPERM:  The attribute cannot (currently) be accessed this way
 +  (e.g. read-only attribute, or attribute that only makes
 +  sense when the device is in a different state)
 +
 +  Other error conditions may be defined by individual device types.
 +
 +Gets/sets a specified piece of device configuration and/or state.  The
 +semantics are device-specific.  See individual device documentation in
 +the devices directory.  As with ONE_REG, the size of the data
 +transferred is defined by the particular attribute.
 +
 +struct kvm_device_attr {
 + __u32   flags;  /* no flags currently defined */
 + __u32   group;  /* device-defined */
 + __u64   attr;   /* group-defined */
 + __u64   addr;   /* userspace address of attr data */
 +};
 +
Since now each device has its own fd is it an advantage to enforce
common interface between different devices? If we do so though why
not handle file creation, ioctl and file descriptor lifetime in the
common code. Common code will have struct kvm_device with struct
kvm_device_arch and struct kvm_device_ops members. Instead of
kvm_mpic_ioctl there will be kvm_device_ioctl which will despatch ioctls
to a device using kvm_device-ops-(set|get|has)_attr pointers.

--
Gleb.
--

Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-04 Thread Scott Wood

On 04/04/2013 05:41:35 AM, Gleb Natapov wrote:

On Tue, Apr 02, 2013 at 08:57:48PM -0500, Scott Wood wrote:
 +struct kvm_device_attr {
 +  __u32   flags;  /* no flags currently defined */
 +  __u32   group;  /* device-defined */
 +  __u64   attr;   /* group-defined */
 +  __u64   addr;   /* userspace address of attr data */
 +};
 +
Since now each device has its own fd is it an advantage to enforce
common interface between different devices?


I think so, even if only to avoid repeating the various pains  
surrounding adding ioctls.  Not necessarily enforce, just enable.  If  
a device has some sort of command that does not fit neatly into the  
set or get model, it could still add a new ioctl.


If we do so though why not handle file creation, ioctl and file  
descriptor lifetime in the

common code. Common code will have struct kvm_device with struct
kvm_device_arch and struct kvm_device_ops members. Instead of
kvm_mpic_ioctl there will be kvm_device_ioctl which will despatch  
ioctls

to a device using kvm_device-ops-(set|get|has)_attr pointers.


So make it more like the pre-fd version, except for the actual fd  
usage?  It would make destruction a bit simpler (assuming there's no  
need for vcpu destruction code to access a device).  Hopefully nobody  
asks me to change it back again, though. :-)


-Scott
--
To unsubscribe from this list: send the line unsubscribe kvm-ppc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-04 Thread Paul Mackerras
On Thu, Apr 04, 2013 at 01:41:35PM +0300, Gleb Natapov wrote:

 Since now each device has its own fd is it an advantage to enforce
 common interface between different devices? If we do so though why
 not handle file creation, ioctl and file descriptor lifetime in the
 common code. Common code will have struct kvm_device with struct
 kvm_device_arch and struct kvm_device_ops members. Instead of
 kvm_mpic_ioctl there will be kvm_device_ioctl which will despatch ioctls
 to a device using kvm_device-ops-(set|get|has)_attr pointers.

I thought about making the same request, but when I looked at it, the
amount of code that could be made common in this way is pretty tiny,
and doing that involves a bit of extra complexity, so I thought that
on the whole it wouldn't be worthwhile.

Paul.
--
To unsubscribe from this list: send the line unsubscribe kvm-ppc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC PATCH v3 1/6] kvm: add device control API

2013-04-03 Thread Alexander Graf

On 03.04.2013, at 03:57, Scott Wood wrote:

 Currently, devices that are emulated inside KVM are configured in a
 hardcoded manner based on an assumption that any given architecture
 only has one way to do it.  If there's any need to access device state,
 it is done through inflexible one-purpose-only IOCTLs (e.g.
 KVM_GET/SET_LAPIC).  Defining new IOCTLs for every little thing is
 cumbersome and depletes a limited numberspace.
 
 This API provides a mechanism to instantiate a device of a certain
 type, returning an ID that can be used to set/get attributes of the
 device.  Attributes may include configuration parameters (e.g.
 register base address), device state, operational commands, etc.  It
 is similar to the ONE_REG API, except that it acts on devices rather
 than vcpus.
 
 Both device types and individual attributes can be tested without having
 to create the device or get/set the attribute, without the need for
 separately managing enumerated capabilities.
 
 Signed-off-by: Scott Wood scottw...@freescale.com
 ---
 v3: remove some changes that were merged into this patch by accident,
 and fix the error documentation for KVM_CREATE_DEVICE.
 
 NOTE: I had some difficulty figuring out what ioctl numbers I should
 assign...  it seems that at one point care was taken to keep vcpu and
 vm ioctls separate, but some overlap exists now (despite not exhausing
 the ioctl space).  Some of that was my fault, but not all of it. :-)
 I moved to a new ioctl range for device control -- please let me know
 if there's something else you'd prefer I do.
 ---
 Documentation/virtual/kvm/api.txt|   70 ++
 Documentation/virtual/kvm/devices/README |1 +
 include/uapi/linux/kvm.h |   27 
 virt/kvm/kvm_main.c  |   31 +
 4 files changed, 129 insertions(+)
 create mode 100644 Documentation/virtual/kvm/devices/README
 
 diff --git a/Documentation/virtual/kvm/api.txt 
 b/Documentation/virtual/kvm/api.txt
 index 976eb65..d52f3f9 100644
 --- a/Documentation/virtual/kvm/api.txt
 +++ b/Documentation/virtual/kvm/api.txt
 @@ -2173,6 +2173,76 @@ header; first `n_valid' valid entries with contents 
 from the data
 written, then `n_invalid' invalid entries, invalidating any previously
 valid entries found.
 
 +4.79 KVM_CREATE_DEVICE
 +
 +Capability: KVM_CAP_DEVICE_CTRL
 +Type: vm ioctl
 +Parameters: struct kvm_create_device (in/out)
 +Returns: 0 on success, -1 on error
 +Errors:
 +  ENODEV: The device type is unknown or unsupported
 +  EEXIST: Device already created, and this type of device may not
 +  be instantiated multiple times
 +
 +  Other error conditions may be defined by individual device types or
 +  have their standard meanings.
 +
 +Creates an emulated device in the kernel.  The file descriptor returned
 +in fd can be used with KVM_SET/GET/HAS_DEVICE_ATTR.
 +
 +If the KVM_CREATE_DEVICE_TEST flag is set, only test whether the
 +device type is supported (not necessarily whether it can be created
 +in the current vm).
 +
 +Individual devices should not define flags.  Attributes should be used
 +for specifying any behavior that is not implied by the device type
 +number.
 +
 +struct kvm_create_device {
 + __u32   type;   /* in: KVM_DEV_TYPE_xxx */
 + __u32   fd; /* out: device handle */
 + __u32   flags;  /* in: KVM_CREATE_DEVICE_xxx */
 +};
 +
 +4.80 KVM_SET_DEVICE_ATTR/KVM_GET_DEVICE_ATTR
 +
 +Capability: KVM_CAP_DEVICE_CTRL
 +Type: device ioctl
 +Parameters: struct kvm_device_attr
 +Returns: 0 on success, -1 on error
 +Errors:
 +  ENXIO:  The group or attribute is unknown/unsupported for this device
 +  EPERM:  The attribute cannot (currently) be accessed this way
 +  (e.g. read-only attribute, or attribute that only makes
 +  sense when the device is in a different state)
 +
 +  Other error conditions may be defined by individual device types.
 +
 +Gets/sets a specified piece of device configuration and/or state.  The
 +semantics are device-specific.  See individual device documentation in
 +the devices directory.  As with ONE_REG, the size of the data
 +transferred is defined by the particular attribute.
 +
 +struct kvm_device_attr {
 + __u32   flags;  /* no flags currently defined */
 + __u32   group;  /* device-defined */
 + __u64   attr;   /* group-defined */
 + __u64   addr;   /* userspace address of attr data */
 +};
 +
 +4.81 KVM_HAS_DEVICE_ATTR
 +
 +Capability: KVM_CAP_DEVICE_CTRL
 +Type: device ioctl
 +Parameters: struct kvm_device_attr
 +Returns: 0 on success, -1 on error
 +Errors:
 +  ENXIO:  The group or attribute is unknown/unsupported for this device
 +
 +Tests whether a device supports a particular attribute.  A successful
 +return indicates the attribute is implemented.  It does not necessarily
 +indicate that the attribute can be read or written in the device's
 +current state.  addr is ignored.
 
 4.77 KVM_ARM_VCPU_INIT