Commit 15b5c183 authored by Heiko Carstens's avatar Heiko Carstens

s390/uv: fix memblock virtual vs physical address confusion

memblock_alloc_try_nid() returns a virtual address, however in error
case the allocated memory is incorrectly freed with memblock_phys_free().
Properly use memblock_free() instead, and pass a physical address to
uv_init() to fix this.

Note: this doesn't fix a bug currently, since virtual and physical
addresses are identical.
Reviewed-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent fcfcba6d
...@@ -30,7 +30,7 @@ int __bootdata_preserved(prot_virt_host); ...@@ -30,7 +30,7 @@ int __bootdata_preserved(prot_virt_host);
EXPORT_SYMBOL(prot_virt_host); EXPORT_SYMBOL(prot_virt_host);
EXPORT_SYMBOL(uv_info); EXPORT_SYMBOL(uv_info);
static int __init uv_init(unsigned long stor_base, unsigned long stor_len) static int __init uv_init(phys_addr_t stor_base, unsigned long stor_len)
{ {
struct uv_cb_init uvcb = { struct uv_cb_init uvcb = {
.header.cmd = UVC_CMD_INIT_UV, .header.cmd = UVC_CMD_INIT_UV,
...@@ -49,12 +49,12 @@ static int __init uv_init(unsigned long stor_base, unsigned long stor_len) ...@@ -49,12 +49,12 @@ static int __init uv_init(unsigned long stor_base, unsigned long stor_len)
void __init setup_uv(void) void __init setup_uv(void)
{ {
unsigned long uv_stor_base; void *uv_stor_base;
if (!is_prot_virt_host()) if (!is_prot_virt_host())
return; return;
uv_stor_base = (unsigned long)memblock_alloc_try_nid( uv_stor_base = memblock_alloc_try_nid(
uv_info.uv_base_stor_len, SZ_1M, SZ_2G, uv_info.uv_base_stor_len, SZ_1M, SZ_2G,
MEMBLOCK_ALLOC_ACCESSIBLE, NUMA_NO_NODE); MEMBLOCK_ALLOC_ACCESSIBLE, NUMA_NO_NODE);
if (!uv_stor_base) { if (!uv_stor_base) {
...@@ -63,8 +63,8 @@ void __init setup_uv(void) ...@@ -63,8 +63,8 @@ void __init setup_uv(void)
goto fail; goto fail;
} }
if (uv_init(uv_stor_base, uv_info.uv_base_stor_len)) { if (uv_init(__pa(uv_stor_base), uv_info.uv_base_stor_len)) {
memblock_phys_free(uv_stor_base, uv_info.uv_base_stor_len); memblock_free(uv_stor_base, uv_info.uv_base_stor_len);
goto fail; goto fail;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment