|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 6/8] microcode: delete microcode pointer and size from microcode_info
microcode pointer and size were passed to other CPUs to parse
microcode locally. Now, parsing microcode is done on one CPU.
Other CPUs needn't parse the microcode blob; the pointer and
size can be removed.
Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx>
---
xen/arch/x86/microcode.c | 33 +++++++++++++++++----------------
1 file changed, 17 insertions(+), 16 deletions(-)
diff --git a/xen/arch/x86/microcode.c b/xen/arch/x86/microcode.c
index 936f0b8..3c2274f 100644
--- a/xen/arch/x86/microcode.c
+++ b/xen/arch/x86/microcode.c
@@ -190,9 +190,7 @@ DEFINE_PER_CPU(struct ucode_cpu_info, ucode_cpu_info);
struct microcode_info {
unsigned int cpu;
- uint32_t buffer_size;
int error;
- char buffer[1];
};
static void microcode_fini_cpu(unsigned int cpu)
@@ -316,6 +314,7 @@ int microcode_update(XEN_GUEST_HANDLE_PARAM(const_void)
buf, unsigned long len)
{
int ret;
struct microcode_info *info;
+ void * buffer;
if ( len != (uint32_t)len )
return -E2BIG;
@@ -323,28 +322,26 @@ int microcode_update(XEN_GUEST_HANDLE_PARAM(const_void)
buf, unsigned long len)
if ( microcode_ops == NULL )
return -EINVAL;
- info = xmalloc_bytes(sizeof(*info) + len);
- if ( info == NULL )
- return -ENOMEM;
-
- ret = copy_from_guest(info->buffer, buf, len);
- if ( ret != 0 )
+ info = xmalloc(struct microcode_info);
+ buffer = xmalloc_bytes(len);
+ if ( !info || !buffer )
{
- xfree(info);
- return ret;
+ ret = -ENOMEM;
+ goto free;
}
+ ret = copy_from_guest(buffer, buf, len);
+ if ( ret != 0 )
+ goto free;
+
if ( microcode_ops->start_update )
{
ret = microcode_ops->start_update();
if ( ret != 0 )
- {
- xfree(info);
- return ret;
- }
+ goto free;
}
- ret = parse_microcode_blob(info->buffer, len);
+ ret = parse_microcode_blob(buffer, len);
if ( ret <= 0 )
{
printk(XENLOG_ERR "No valid or newer ucode found. Update abort!\n");
@@ -352,11 +349,15 @@ int microcode_update(XEN_GUEST_HANDLE_PARAM(const_void)
buf, unsigned long len)
return -EINVAL;
}
- info->buffer_size = len;
info->error = 0;
info->cpu = cpumask_first(&cpu_online_map);
return continue_hypercall_on_cpu(info->cpu, do_microcode_update, info);
+
+ free:
+ xfree(info);
+ xfree(buffer);
+ return ret;
}
static int __init microcode_init(void)
--
1.8.3.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |