diff options
| author | Jason Beloro <Jason.Beloro@Sun.COM> | 2009-07-16 18:10:57 -0700 |
|---|---|---|
| committer | Jason Beloro <Jason.Beloro@Sun.COM> | 2009-07-16 18:10:57 -0700 |
| commit | 9853d9e82e7a067a2b88dae2fd257207e6be5f94 (patch) | |
| tree | 83474d6da1693101c62f3f18d7588cd30fb953c4 /usr/src/uts/sun4/os/memnode.c | |
| parent | f94275ce205810a201404c5f35f4cc96057022b1 (diff) | |
| download | illumos-joyent-9853d9e82e7a067a2b88dae2fd257207e6be5f94.tar.gz | |
FWARC 2008/540 Memory DR Domain Service
FWARC 2009/300 CPU MD node property for real address bits
6720954 add memory dr feature to ldoms
6742779 fsflush_do_pages() may incorrectly skip constituent file large pages
Diffstat (limited to 'usr/src/uts/sun4/os/memnode.c')
| -rw-r--r-- | usr/src/uts/sun4/os/memnode.c | 106 |
1 files changed, 52 insertions, 54 deletions
diff --git a/usr/src/uts/sun4/os/memnode.c b/usr/src/uts/sun4/os/memnode.c index b9d0fa3d56..cb97541a20 100644 --- a/usr/src/uts/sun4/os/memnode.c +++ b/usr/src/uts/sun4/os/memnode.c @@ -19,12 +19,10 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/systm.h> #include <sys/platform_module.h> #include <sys/sysmacros.h> @@ -82,9 +80,6 @@ mem_node_add_slice(pfn_t start, pfn_t end) end = roundup(end, btop(mem_node_physalign)) - 1; } - if (&plat_slice_add != NULL) - plat_slice_add(start, end); - mnode = PFN_2_MEM_NODE(start); ASSERT(mnode < max_mem_nodes); @@ -111,16 +106,6 @@ mem_node_add_slice(pfn_t start, pfn_t end) lgrp_config(LGRP_CONFIG_MEM_ADD, mnode, MEM_NODE_2_LGRPHAND(mnode)); } -/* ARGSUSED */ -void -mem_node_pre_del_slice(pfn_t start, pfn_t end) -{ - int mnode = PFN_2_MEM_NODE(start); - - ASSERT(mnode < max_mem_nodes); - ASSERT(mem_node_config[mnode].exists == 1); -} - /* * Remove a PFN range from a memnode. On some platforms, * the memnode will be created with physbase at the first @@ -129,7 +114,7 @@ mem_node_pre_del_slice(pfn_t start, pfn_t end) * to assume physbase and up. */ void -mem_node_post_del_slice(pfn_t start, pfn_t end, int cancelled) +mem_node_del_slice(pfn_t start, pfn_t end) { int mnode; pgcnt_t delta_pgcnt, node_size; @@ -144,47 +129,60 @@ mem_node_post_del_slice(pfn_t start, pfn_t end, int cancelled) ASSERT(mnode < max_mem_nodes); ASSERT(mem_node_config[mnode].exists == 1); - if (!cancelled) { - delta_pgcnt = end - start; - node_size = mem_node_config[mnode].physmax - - mem_node_config[mnode].physbase; - - if (node_size > delta_pgcnt) { - /* - * Subtract the slice from the memnode. - */ - if (start <= mem_node_config[mnode].physbase) - mem_node_config[mnode].physbase = end + 1; - ASSERT(end <= mem_node_config[mnode].physmax); - if (end == mem_node_config[mnode].physmax) - mem_node_config[mnode].physmax = start - 1; - } else { - - /* - * Let the common lgrp framework know the mnode is - * leaving - */ - lgrp_config(LGRP_CONFIG_MEM_DEL, mnode, - MEM_NODE_2_LGRPHAND(mnode)); - - /* - * Delete the whole node. - */ - ASSERT(MNODE_PGCNT(mnode) == 0); - do { - omask = memnodes_mask; - nmask = omask & ~(1ull << mnode); - } while (cas64(&memnodes_mask, omask, nmask) != omask); - atomic_add_16(&num_memnodes, -1); - mem_node_config[mnode].exists = 0; - } + delta_pgcnt = end - start; + node_size = mem_node_config[mnode].physmax - + mem_node_config[mnode].physbase; + + if (node_size > delta_pgcnt) { + /* + * Subtract the slice from the memnode. + */ + if (start <= mem_node_config[mnode].physbase) + mem_node_config[mnode].physbase = end + 1; + ASSERT(end <= mem_node_config[mnode].physmax); + if (end == mem_node_config[mnode].physmax) + mem_node_config[mnode].physmax = start - 1; + } else { - if (&plat_slice_del != NULL) - plat_slice_del(start, end); + /* + * Let the common lgrp framework know the mnode is + * leaving + */ + lgrp_config(LGRP_CONFIG_MEM_DEL, mnode, + MEM_NODE_2_LGRPHAND(mnode)); + + /* + * Delete the whole node. + */ + ASSERT(MNODE_PGCNT(mnode) == 0); + do { + omask = memnodes_mask; + nmask = omask & ~(1ull << mnode); + } while (cas64(&memnodes_mask, omask, nmask) != omask); + atomic_add_16(&num_memnodes, -1); + mem_node_config[mnode].exists = 0; } } void +mem_node_add_range(pfn_t start, pfn_t end) +{ + if (&plat_slice_add != NULL) + plat_slice_add(start, end); + else + mem_node_add_slice(start, end); +} + +void +mem_node_del_range(pfn_t start, pfn_t end) +{ + if (&plat_slice_del != NULL) + plat_slice_del(start, end); + else + mem_node_del_slice(start, end); +} + +void startup_build_mem_nodes(prom_memlist_t *list, size_t nelems) { size_t elem; @@ -203,7 +201,7 @@ startup_build_mem_nodes(prom_memlist_t *list, size_t nelems) for (elem = 0; elem < nelems; list++, elem++) { basepfn = btop(list->addr); npgs = btop(list->size); - mem_node_add_slice(basepfn, basepfn + npgs - 1); + mem_node_add_range(basepfn, basepfn + npgs - 1); } } } |
