| From foo@baz Mon Sep 17 12:33:31 CEST 2018 |
| From: Michael Kelley <mikelley@microsoft.com> |
| Date: Thu, 2 Aug 2018 03:08:25 +0000 |
| Subject: Drivers: hv: vmbus: Cleanup synic memory free path |
| |
| From: Michael Kelley <mikelley@microsoft.com> |
| |
| [ Upstream commit 572086325ce9a9e348b8748e830653f3959e88b6 ] |
| |
| clk_evt memory is not being freed when the synic is shutdown |
| or when there is an allocation error. Add the appropriate |
| kfree() call, along with a comment to clarify how the memory |
| gets freed after an allocation error. Make the free path |
| consistent by removing checks for NULL since kfree() and |
| free_page() already do the check. |
| |
| Signed-off-by: Michael Kelley <mikelley@microsoft.com> |
| Reported-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/hv/hv.c | 14 ++++++++------ |
| 1 file changed, 8 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/hv/hv.c |
| +++ b/drivers/hv/hv.c |
| @@ -196,6 +196,10 @@ int hv_synic_alloc(void) |
| |
| return 0; |
| err: |
| + /* |
| + * Any memory allocations that succeeded will be freed when |
| + * the caller cleans up by calling hv_synic_free() |
| + */ |
| return -ENOMEM; |
| } |
| |
| @@ -208,12 +212,10 @@ void hv_synic_free(void) |
| struct hv_per_cpu_context *hv_cpu |
| = per_cpu_ptr(hv_context.cpu_context, cpu); |
| |
| - if (hv_cpu->synic_event_page) |
| - free_page((unsigned long)hv_cpu->synic_event_page); |
| - if (hv_cpu->synic_message_page) |
| - free_page((unsigned long)hv_cpu->synic_message_page); |
| - if (hv_cpu->post_msg_page) |
| - free_page((unsigned long)hv_cpu->post_msg_page); |
| + kfree(hv_cpu->clk_evt); |
| + free_page((unsigned long)hv_cpu->synic_event_page); |
| + free_page((unsigned long)hv_cpu->synic_message_page); |
| + free_page((unsigned long)hv_cpu->post_msg_page); |
| } |
| |
| kfree(hv_context.hv_numa_map); |