Messages in this thread | | | Date | Mon, 11 Aug 2008 12:41:34 +0300 | From | Avi Kivity <> | Subject | Re: [PATCH 2/4] reduce stack usage in kvm_vcpu_ioctl() |
| |
Dave Hansen wrote: > Same as the last one, but this time we use kmalloc() > for all of the uses. > > Note that the kfree()s take advantage of the fact that > kfree() is OK on NULL. > > Signed-off-by: Dave Hansen <dave@linux.vnet.ibm.com> > --- > virt/kvm/kvm_main.c | 48 ++++++++++++++++++++++++++++++------------------ > 1 files changed, 30 insertions(+), 18 deletions(-) > > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 7dd9b0b..70bf180 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -1118,6 +1118,9 @@ static long kvm_vcpu_ioctl(struct file *filp, > struct kvm_vcpu *vcpu = filp->private_data; > void __user *argp = (void __user *)arg; > int r; > + struct kvm_fpu *fpu = NULL; > + struct kvm_sregs *kvm_sregs = NULL; > + >
Spurious blank line.
> > if (vcpu->kvm->mm != current->mm) > return -EIO; > @@ -1165,25 +1168,29 @@ out_free2: > break; > } > case KVM_GET_SREGS: { > - struct kvm_sregs kvm_sregs; > - > - memset(&kvm_sregs, 0, sizeof kvm_sregs); > - r = kvm_arch_vcpu_ioctl_get_sregs(vcpu, &kvm_sregs); > + kvm_sregs = kzalloc(sizeof(struct kvm_sregs), GFP_KERNEL); > + r = -ENOMEM; > + if (!kvm_sregs) > + goto out; > + memset(kvm_sregs, 0, sizeof(struct kvm_sregs)); >
memset unneeded after kzalloc.
btw, this is a generic problem, and could be handled generically:
struct ioctl_handler_entry { u32 ioctl; union { long (*handler_parg)(void *arg); long (*handler_larg)(long arg); }; };
void process_ioctl(struct ioctl_handler_entry *ioctls) { search for correct entry; allocate memory (get size from ioctl number); copy from user (if _IOW); call handler; copy to user (if _IOR, and no error); free memory; }
I imagine this can be used to simplify many ioctls.
-- error compiling committee.c: too many arguments to function
| |