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: Alexander Gordeev <agordeev@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
This commit is contained in:
parent
fcfcba6dfc
commit
15b5c1833a
@ -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)
|
|||||||
|
|
||||||
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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user