Commit 4a4bdfea authored by Nathan Fontenot's avatar Nathan Fontenot Committed by Michael Ellerman

powerpc/pseries: Refactor dlpar_add_lmb() code

Re-factor dlpar_lmb_add() routine by moving the validation of the lmb
flags and the acquireing of the DRC to a wrapper around the work to add
the memory to the system. This is done to make handling of errors
during the addition of the memory easier and to facilitate the upcoming
addition of updating the lmb's affinity prior to adding the memory.
Signed-off-by: default avatarNathan Fontenot <nfont@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent bf162006
...@@ -384,43 +384,32 @@ static int dlpar_memory_remove_by_index(u32 drc_index, struct property *prop) ...@@ -384,43 +384,32 @@ static int dlpar_memory_remove_by_index(u32 drc_index, struct property *prop)
#endif /* CONFIG_MEMORY_HOTREMOVE */ #endif /* CONFIG_MEMORY_HOTREMOVE */
static int dlpar_add_lmb(struct of_drconf_cell *lmb) static int dlpar_add_lmb_memory(struct of_drconf_cell *lmb)
{ {
struct memory_block *mem_block; struct memory_block *mem_block;
unsigned long block_sz; unsigned long block_sz;
int nid, rc; int nid, rc;
if (lmb->flags & DRCONF_MEM_ASSIGNED)
return -EINVAL;
block_sz = memory_block_size_bytes(); block_sz = memory_block_size_bytes();
rc = dlpar_acquire_drc(lmb->drc_index);
if (rc)
return rc;
/* Find the node id for this address */ /* Find the node id for this address */
nid = memory_add_physaddr_to_nid(lmb->base_addr); nid = memory_add_physaddr_to_nid(lmb->base_addr);
/* Add the memory */ /* Add the memory */
rc = add_memory(nid, lmb->base_addr, block_sz); rc = add_memory(nid, lmb->base_addr, block_sz);
if (rc) { if (rc)
dlpar_release_drc(lmb->drc_index);
return rc; return rc;
}
/* Register this block of memory */ /* Register this block of memory */
rc = memblock_add(lmb->base_addr, block_sz); rc = memblock_add(lmb->base_addr, block_sz);
if (rc) { if (rc) {
remove_memory(nid, lmb->base_addr, block_sz); remove_memory(nid, lmb->base_addr, block_sz);
dlpar_release_drc(lmb->drc_index);
return rc; return rc;
} }
mem_block = lmb_to_memblock(lmb); mem_block = lmb_to_memblock(lmb);
if (!mem_block) { if (!mem_block) {
remove_memory(nid, lmb->base_addr, block_sz); remove_memory(nid, lmb->base_addr, block_sz);
dlpar_release_drc(lmb->drc_index);
return -EINVAL; return -EINVAL;
} }
...@@ -428,7 +417,6 @@ static int dlpar_add_lmb(struct of_drconf_cell *lmb) ...@@ -428,7 +417,6 @@ static int dlpar_add_lmb(struct of_drconf_cell *lmb)
put_device(&mem_block->dev); put_device(&mem_block->dev);
if (rc) { if (rc) {
remove_memory(nid, lmb->base_addr, block_sz); remove_memory(nid, lmb->base_addr, block_sz);
dlpar_release_drc(lmb->drc_index);
return rc; return rc;
} }
...@@ -436,6 +424,24 @@ static int dlpar_add_lmb(struct of_drconf_cell *lmb) ...@@ -436,6 +424,24 @@ static int dlpar_add_lmb(struct of_drconf_cell *lmb)
return 0; return 0;
} }
static int dlpar_add_lmb(struct of_drconf_cell *lmb)
{
int rc;
if (lmb->flags & DRCONF_MEM_ASSIGNED)
return -EINVAL;
rc = dlpar_acquire_drc(lmb->drc_index);
if (rc)
return rc;
rc = dlpar_add_lmb_memory(lmb);
if (rc)
dlpar_release_drc(lmb->drc_index);
return rc;
}
static int dlpar_memory_add_by_count(u32 lmbs_to_add, struct property *prop) static int dlpar_memory_add_by_count(u32 lmbs_to_add, struct property *prop)
{ {
struct of_drconf_cell *lmbs; struct of_drconf_cell *lmbs;
......
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