Memtoy  - a toy [tool] for performing various memory
operations [mapping, protection, faulting] for investigating
vm behavior.

N.B., migrate command depends on Ray Bryant's "Manual Page Migration"
      patches, atop the Memory Hotplug page migration patches.

May be run interactively or from a script [see ./test*].

Use 'help' command interactively, or, e.g.,

	echo help | ./memtoy


Supported commands [augmented help]:

quit           - just what you think
	EOF on stdin has the same effect

help           - show this help
help <command> - display help for just <command>

pid            - show process id of this session

pause          - pause program until signal -- e.g., INT, USR1

numa          - display numa info as seen by this program.
	shows nodes from which program may allocate memory
	with total and free memory.

migrate <to-node-id[s]> [<from-node-id[s]>] -
	migrate this process' memory from <from-node-id[s]>
	to <to-node-id[s]>.  Specify multiple node ids as a
	comma-separated list.  If both to and from nodes are
	specified, the sets must have the same # of nodes,
	and must not intersect.  If <from-node-id[s]> is
	omitted, <to-node-id[s]> must specify a single node.

show [<name>]  - show info for segment[s]; default all

anon <seg-name> <seg-size>[k|m|g|p] [<seg-share>] -
	define a MAP_ANONYMOUS segment of specified size
	<seg-share> := private|shared - default = private

file <pathname> [<offset>[k|m|g|p] <length>[k|m|g|p]] [<seg-share>] -
	define a mapped file segment of specified length starting at the
	specified offset into the file.  <offset> and <length> may be
	omitted and specified on the map command.
	<seg-share> := private|shared - default = private

shm <seg-name> <seg-size>[k|m|g|p] -
	define a shared memory segment of specified size.
	You may need to increase limits [/proc/sys/kernel/shmmax].
	Use map/unmap to attach/detach

remove <seg-name> [<seg-name> ...] - remove the named segment[s]

map <seg-name> [<offset>[k|m|g|p] <length>[k|m|g|p]] [<seg-share>] -
	mmap()/shmat() a previously defined, currently unmapped() segment.
	<offset> and <length> apply only to mapped files.
	Use <length> of '*' or '0' to map to the end of the file.
	Offset and length specified here override those specified on
	the file command.

unmap <seg-name> - unmap specified segment, but remember name/size/...

touch <seg-name> [<offset>[k|m|g|p] <length>[k|m|g|p]] [read|write] -
	read [default] or write the named segment from <offset> through
	<offset>+<length>.  If <offset> and <length> omitted, touches all
	 of mapped segment.

mbind <seg-name> [<offset>[k|m|g|p] <length>[k|m|g|p]]
      <policy> [<node/list>] -
	set the numa policy for the specified range of the name segment
	to policy --  one of {default, bind, preferred, interleaved}.
	<node/list> specifies a node id or a comma separated list of
	node ids.  <node> is ignored for 'default' policy, and only
	the first node is used for 'preferred' policy

where <seg-name> [<offset>[k|m|g|p] <length>[k|m|g|p]] -
	show the node location of pages in the specified range
	of the specified segment.  <offset> defaults to start of
	segment; <length> defaults to 64 pages.
	Use SIGINT to interrupt a long display.

Note:  to recognize the optional offset and length args, they must
start with a digit.  This is required anyway because the strings are
converted using strtoul() with a zero 'base' argument.  So, hex args
must always start with '0x'...