diff options
| author | Dave Hansen <dave@linux.vnet.ibm.com> | 2008-08-11 13:01:46 -0400 |
|---|---|---|
| committer | Avi Kivity <avi@qumranet.com> | 2008-10-15 04:15:18 -0400 |
| commit | fa3795a7308df099f0f2c9e5ca2c20a5ff65bdc4 (patch) | |
| tree | 5adec83a7a6348f4e99a76fc0dbfccaa80484647 /virt | |
| parent | f0d662759a2465babdba1160749c446648c9d159 (diff) | |
KVM: Reduce stack usage in kvm_vcpu_ioctl()
Signed-off-by: Dave Hansen <dave@linux.vnet.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'virt')
| -rw-r--r-- | virt/kvm/kvm_main.c | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 5eb96c7c8d7..0309571fcb2 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -1126,6 +1126,8 @@ static long kvm_vcpu_ioctl(struct file *filp, | |||
| 1126 | struct kvm_vcpu *vcpu = filp->private_data; | 1126 | struct kvm_vcpu *vcpu = filp->private_data; |
| 1127 | void __user *argp = (void __user *)arg; | 1127 | void __user *argp = (void __user *)arg; |
| 1128 | int r; | 1128 | int r; |
| 1129 | struct kvm_fpu *fpu = NULL; | ||
| 1130 | struct kvm_sregs *kvm_sregs = NULL; | ||
| 1129 | 1131 | ||
| 1130 | if (vcpu->kvm->mm != current->mm) | 1132 | if (vcpu->kvm->mm != current->mm) |
| 1131 | return -EIO; | 1133 | return -EIO; |
| @@ -1173,25 +1175,28 @@ out_free2: | |||
| 1173 | break; | 1175 | break; |
| 1174 | } | 1176 | } |
| 1175 | case KVM_GET_SREGS: { | 1177 | case KVM_GET_SREGS: { |
| 1176 | struct kvm_sregs kvm_sregs; | 1178 | kvm_sregs = kzalloc(sizeof(struct kvm_sregs), GFP_KERNEL); |
| 1177 | 1179 | r = -ENOMEM; | |
| 1178 | memset(&kvm_sregs, 0, sizeof kvm_sregs); | 1180 | if (!kvm_sregs) |
| 1179 | r = kvm_arch_vcpu_ioctl_get_sregs(vcpu, &kvm_sregs); | 1181 | goto out; |
| 1182 | r = kvm_arch_vcpu_ioctl_get_sregs(vcpu, kvm_sregs); | ||
| 1180 | if (r) | 1183 | if (r) |
| 1181 | goto out; | 1184 | goto out; |
| 1182 | r = -EFAULT; | 1185 | r = -EFAULT; |
| 1183 | if (copy_to_user(argp, &kvm_sregs, sizeof kvm_sregs)) | 1186 | if (copy_to_user(argp, kvm_sregs, sizeof(struct kvm_sregs))) |
| 1184 | goto out; | 1187 | goto out; |
| 1185 | r = 0; | 1188 | r = 0; |
| 1186 | break; | 1189 | break; |
| 1187 | } | 1190 | } |
| 1188 | case KVM_SET_SREGS: { | 1191 | case KVM_SET_SREGS: { |
| 1189 | struct kvm_sregs kvm_sregs; | 1192 | kvm_sregs = kmalloc(sizeof(struct kvm_sregs), GFP_KERNEL); |
| 1190 | 1193 | r = -ENOMEM; | |
| 1194 | if (!kvm_sregs) | ||
| 1195 | goto out; | ||
| 1191 | r = -EFAULT; | 1196 | r = -EFAULT; |
| 1192 | if (copy_from_user(&kvm_sregs, argp, sizeof kvm_sregs)) | 1197 | if (copy_from_user(kvm_sregs, argp, sizeof(struct kvm_sregs))) |
| 1193 | goto out; | 1198 | goto out; |
| 1194 | r = kvm_arch_vcpu_ioctl_set_sregs(vcpu, &kvm_sregs); | 1199 | r = kvm_arch_vcpu_ioctl_set_sregs(vcpu, kvm_sregs); |
| 1195 | if (r) | 1200 | if (r) |
| 1196 | goto out; | 1201 | goto out; |
| 1197 | r = 0; | 1202 | r = 0; |
| @@ -1272,25 +1277,28 @@ out_free2: | |||
| 1272 | break; | 1277 | break; |
| 1273 | } | 1278 | } |
| 1274 | case KVM_GET_FPU: { | 1279 | case KVM_GET_FPU: { |
| 1275 | struct kvm_fpu fpu; | 1280 | fpu = kzalloc(sizeof(struct kvm_fpu), GFP_KERNEL); |
| 1276 | 1281 | r = -ENOMEM; | |
| 1277 | memset(&fpu, 0, sizeof fpu); | 1282 | if (!fpu) |
| 1278 | r = kvm_arch_vcpu_ioctl_get_fpu(vcpu, &fpu); | 1283 | goto out; |
| 1284 | r = kvm_arch_vcpu_ioctl_get_fpu(vcpu, fpu); | ||
| 1279 | if (r) | 1285 | if (r) |
| 1280 | goto out; | 1286 | goto out; |
| 1281 | r = -EFAULT; | 1287 | r = -EFAULT; |
| 1282 | if (copy_to_user(argp, &fpu, sizeof fpu)) | 1288 | if (copy_to_user(argp, fpu, sizeof(struct kvm_fpu))) |
| 1283 | goto out; | 1289 | goto out; |
| 1284 | r = 0; | 1290 | r = 0; |
| 1285 | break; | 1291 | break; |
| 1286 | } | 1292 | } |
| 1287 | case KVM_SET_FPU: { | 1293 | case KVM_SET_FPU: { |
| 1288 | struct kvm_fpu fpu; | 1294 | fpu = kmalloc(sizeof(struct kvm_fpu), GFP_KERNEL); |
| 1289 | 1295 | r = -ENOMEM; | |
| 1296 | if (!fpu) | ||
| 1297 | goto out; | ||
| 1290 | r = -EFAULT; | 1298 | r = -EFAULT; |
| 1291 | if (copy_from_user(&fpu, argp, sizeof fpu)) | 1299 | if (copy_from_user(fpu, argp, sizeof(struct kvm_fpu))) |
| 1292 | goto out; | 1300 | goto out; |
| 1293 | r = kvm_arch_vcpu_ioctl_set_fpu(vcpu, &fpu); | 1301 | r = kvm_arch_vcpu_ioctl_set_fpu(vcpu, fpu); |
| 1294 | if (r) | 1302 | if (r) |
| 1295 | goto out; | 1303 | goto out; |
| 1296 | r = 0; | 1304 | r = 0; |
| @@ -1300,6 +1308,8 @@ out_free2: | |||
| 1300 | r = kvm_arch_vcpu_ioctl(filp, ioctl, arg); | 1308 | r = kvm_arch_vcpu_ioctl(filp, ioctl, arg); |
| 1301 | } | 1309 | } |
| 1302 | out: | 1310 | out: |
| 1311 | kfree(fpu); | ||
| 1312 | kfree(kvm_sregs); | ||
| 1303 | return r; | 1313 | return r; |
| 1304 | } | 1314 | } |
| 1305 | 1315 | ||
