summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4/os/memnode.c
diff options
context:
space:
mode:
authorJason Beloro <Jason.Beloro@Sun.COM>2009-07-16 18:10:57 -0700
committerJason Beloro <Jason.Beloro@Sun.COM>2009-07-16 18:10:57 -0700
commit9853d9e82e7a067a2b88dae2fd257207e6be5f94 (patch)
tree83474d6da1693101c62f3f18d7588cd30fb953c4 /usr/src/uts/sun4/os/memnode.c
parentf94275ce205810a201404c5f35f4cc96057022b1 (diff)
downloadillumos-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.c106
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);
}
}
}