[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 5/6] x86/ucode: Alter ops->free_patch() to free the entire patch
The data layout for struct microcode_patch is extremely poor, and unnecessarily complicated. Almost all of it is opaque to core.c, with the exception of free_patch(). Move the responsibility for freeing the patch into the free_patch() hook, which will allow each driver to do a better job. Take the opportunity to make the hooks idempotent. No practical change in behaviour. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Wei Liu <wl@xxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> --- xen/arch/x86/cpu/microcode/amd.c | 17 ++++++++++++----- xen/arch/x86/cpu/microcode/core.c | 3 +-- xen/arch/x86/cpu/microcode/intel.c | 8 ++++++-- xen/arch/x86/cpu/microcode/private.h | 2 +- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/xen/arch/x86/cpu/microcode/amd.c b/xen/arch/x86/cpu/microcode/amd.c index 768fbcf322..77e582c8e1 100644 --- a/xen/arch/x86/cpu/microcode/amd.c +++ b/xen/arch/x86/cpu/microcode/amd.c @@ -180,10 +180,8 @@ static bool match_cpu(const struct microcode_patch *patch) return patch && (microcode_fits(patch->mc_amd) == NEW_UCODE); } -static void free_patch(void *mc) +static void free_mc_amd(struct microcode_amd *mc_amd) { - struct microcode_amd *mc_amd = mc; - if ( mc_amd ) { xfree(mc_amd->equiv_cpu_table); @@ -192,6 +190,15 @@ static void free_patch(void *mc) } } +static void free_patch(struct microcode_patch *patch) +{ + if ( patch ) + { + free_mc_amd(patch->mc_amd); + xfree(patch); + } +} + static enum microcode_match_result compare_header( const struct microcode_header_amd *new_header, const struct microcode_header_amd *old_header) @@ -564,12 +571,12 @@ static struct microcode_patch *cpu_request_microcode(const void *buf, patch->mc_amd = mc_amd; else { - free_patch(mc_amd); + free_mc_amd(mc_amd); error = -ENOMEM; } } else - free_patch(mc_amd); + free_mc_amd(mc_amd); out: if ( error && !patch ) diff --git a/xen/arch/x86/cpu/microcode/core.c b/xen/arch/x86/cpu/microcode/core.c index 61e4b9b7ab..30017e3e0f 100644 --- a/xen/arch/x86/cpu/microcode/core.c +++ b/xen/arch/x86/cpu/microcode/core.c @@ -245,8 +245,7 @@ static struct microcode_patch *parse_blob(const char *buf, size_t len) static void microcode_free_patch(struct microcode_patch *microcode_patch) { - microcode_ops->free_patch(microcode_patch->mc); - xfree(microcode_patch); + microcode_ops->free_patch(microcode_patch); } /* Return true if cache gets updated. Otherwise, return false */ diff --git a/xen/arch/x86/cpu/microcode/intel.c b/xen/arch/x86/cpu/microcode/intel.c index 48544e8d6d..0e6ba50048 100644 --- a/xen/arch/x86/cpu/microcode/intel.c +++ b/xen/arch/x86/cpu/microcode/intel.c @@ -248,9 +248,13 @@ static bool match_cpu(const struct microcode_patch *patch) return microcode_update_match(&patch->mc_intel->hdr) == NEW_UCODE; } -static void free_patch(void *mc) +static void free_patch(struct microcode_patch *patch) { - xfree(mc); + if ( patch ) + { + xfree(patch->mc_intel); + xfree(patch); + } } static enum microcode_match_result compare_patch( diff --git a/xen/arch/x86/cpu/microcode/private.h b/xen/arch/x86/cpu/microcode/private.h index c32ddc8d19..897d32a8e9 100644 --- a/xen/arch/x86/cpu/microcode/private.h +++ b/xen/arch/x86/cpu/microcode/private.h @@ -26,7 +26,7 @@ struct microcode_ops { int (*apply_microcode)(const struct microcode_patch *patch); int (*start_update)(void); void (*end_update_percpu)(void); - void (*free_patch)(void *mc); + void (*free_patch)(struct microcode_patch *patch); bool (*match_cpu)(const struct microcode_patch *patch); enum microcode_match_result (*compare_patch)( const struct microcode_patch *new, const struct microcode_patch *old); -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |