#!/bin/bash
################################################################################
##                                                                            ##
## Copyright (c) International Business Machines  Corp., 2007                 ##
##                                                                            ##
## This program is free software;  you can redistribute it and#or modify      ##
## it under the terms of the GNU General Public License as published by       ##
## the Free Software Foundation; either version 2 of the License, or          ##
## (at your option) any later version.                                        ##
##                                                                            ##
## This program is distributed in the hope that it will be useful, but        ##
## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
## for more details.                                                          ##
##                                                                            ##
## You should have received a copy of the GNU General Public License          ##
## along with this program;  if not, write to the Free Software               ##
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA    ##
##                                                                            ##
################################################################################
#
# Author:        Sivakumar Chinnaiah, Sivakumar.C@in.ibm.com
#
# History:       July 04 2007 - Created - Sivakumar Chinnaiah.
#
# File :         numa01.sh
#
# Description:  Test Basic functionality of numactl command.
#		Test #1: Verifies cpunodebind and membind
#		Test #2: Verifies preferred node bind for memory allocation
#		Test #3: Verifies memory interleave on all nodes
#		Test #4: Verifies physcpubind
#		Test #5: Verifies localalloc
#		Test #6: Verifies memory policies on shared memory
#		Test #7: Verifies numademo
#		Test #8: Verifies memhog
#		Test #9: Verifies numa_node_size api
#		Test #10:Verifies Migratepages
#		- it uses numastat output which is expected to be in the format
#                           node0           node1
#numa_hit                 4280408         4605341
#numa_miss                      0               0
#numa_foreign                   0               0
#interleave_hit             12445           13006
#local_node               4277766         4566799
#other_node                  2642           38542



# Function:     chk_ifexists
#
# Description:  - Check if command required for this test exits.
#
# Input:        - $1 - calling test case.
#               - $2 - command that needs to be checked.
#
# Return:       - zero on success.
#               - non-zero on failure.
chk_ifexists()
{
    RC=0

    which $2 &>$LTPTMP/tst_numa.err || RC=$?
    if [ $RC -ne 0 ]
    then
        tst_brkm TBROK NULL "$1: command $2 not found."
    fi
    return $RC
}

# Function:     extract_numastat
#
# Description:  - extract the value of given row,column from the numastat output .
#
# Input:        - $1 - row number.
#               - $2 - column number.
#
# Return:       - zero on success.
#               - non-zero on failure.
extract_numastat()
{
    RC=0

    # check whether numastat output is changed

    RC=$(awk '
        { if ( NR == '$2' ){
            print $1;
            }
        }
        ' $LTPTMP/numalog)
    if [ $RC != $1 ]
    then
	tst_brkm TBROK NULL "numastat o/p seems to be changed, $1 expected to be in the row $2"
        return 1
    fi

    RC=$(awk '
        { if ( NR == '$2' ){
            print $'$3';
            }
        }
        ' $LTPTMP/numalog)
    return 0
}



# Function:     comparelog
#
# Description:  - return the difference of input arguments if they are in
#                 increasing order.
#
# Input:        - $1 - original value.
#               - $2 - changed value.
#
# Return:       - difference of arguments on success.
comparelog()
{

    if [ $2 -gt $1 ]
    then
        RC=$[$2-$1]
    else
        RC=0
    fi
    return 0
}



# Function: init
#
# Description:  - Check if command required for this test exits.
#               - Initialize global variables.
#
# Return:       - zero on success.
#               - non-zero on failure.
init()
{
    # Initialize global variables.
    export RC=0
    export TST_TOTAL=6
    export TCID="Initnuma"
    export TST_COUNT=0

    # Page Size
    page_size=0

    # row definitions, pls see at the top of this file
    numa_hit=2
    numa_miss=3
    numa_foreign=4
    interleave_hit=5
    local_node=6
    other_node=7

    #arguments to memory exercise program support_numa.c
    PRT_PG_SIZE=1
    ALLOC_1MB=2
    PAUSE=3

    # Inititalize cleanup function.
    trap "cleanup" 0

    # create the temporary directory used by this testcase
    if [ -z $TMP ]
    then
        LTPTMP=/tmp/tst_numa.$$
    else
        LTPTMP=$TMP/tst_numa.$$
    fi

    mkdir -p $LTPTMP &>/dev/null || RC=$?
    if [ $RC -ne 0 ]
    then
         tst_brkm TBROK NULL "INIT: Unable to create temporary directory"
         return $RC
    fi

    # check if commands tst_*, numa*, awk exists.
    chk_ifexists INIT tst_resm   || return $RC
    chk_ifexists INIT numactl    || return $RC
    chk_ifexists INIT numastat   || return $RC
    chk_ifexists INIT awk        || return $RC
    chk_ifexists INIT cat        || return $RC
    chk_ifexists INIT kill       || return $RC

    RC=0
    #Set pagesize
    support_numa $PRT_PG_SIZE > $LTPTMP/numaarg || RC=$?
    if [ $RC -ne 0 ]
    then
        tst_resm TFAIL "INIT: memory exerciser program support_numa exits abnormally"
    fi
    page_size=$(cat $LTPTMP/numaarg)

    tst_resm TINFO "INIT: Numa tests will start now !!"
}



# Function:     cleanup
#
# Description:  - remove temporaty files and directories.
#
# Return:       - zero on success.
#               - non-zero on failure.
cleanup()
{
    TCID=exitnuma
    RC=0

    # remove all the temporary files created by this test.
    tst_resm TINFO "CLEAN: removing $LTPTMP"
    rm -fr $LTPTMP || RC=$?
    return $RC
}



# Function:     test01
#
# Description:  - Verification of local node and memory affinity
#
# Return:       - zero on success.
#               - non-zero on failure.
test01()
{
    TCID=numa01
    TST_COUNT=1

    RC=0                # Return value from commands.
    Prev_value=0        # extracted from the numastat o/p
    Curr_value=0	# Current value extracted from numastat o/p
    Exp_incr=0          # 1 MB/ PAGESIZE
    col=0
    MB=$[1024*1024]

    # Increase in numastat o/p is interms of pages
    Exp_incr=$[$MB/$page_size]

    COUNTER=1
    for node in `echo $nodes_list`; do
        col=$[$COUNTER+1]		#Node number in numastat o/p
        numastat > $LTPTMP/numalog
        extract_numastat local_node $local_node $col || return 1
        Prev_value=$RC
        numactl --cpunodebind=$node --membind=$node support_numa $ALLOC_1MB
        numastat > $LTPTMP/numalog
        extract_numastat local_node $local_node $col || return 1
        Curr_value=$RC
        comparelog $Prev_value $Curr_value
        if [ $RC -lt $Exp_incr ]
        then
             tst_resm TFAIL \
                 "Test #1: NUMA hit and localnode increase in node$node is less than expected"
            return 1
        fi
        COUNTER=$[$COUNTER+1]
    done
    tst_resm TPASS "NUMA local node and memory affinity -TEST01 PASSED !!"
    return 0
}



# Function:     test02
#
# Description:  - Verification of memory allocated from preferred node
#
# Return:       - zero on success.
#               - non-zero on failure.
test02()
{
    TCID=numa02
    TST_COUNT=2

    RC=0                # Return value from commands.
    Prev_value=0        # extracted from the numastat o/p
    Curr_value=0        # Current value extracted from numastat o/p
    Exp_incr=0          # 1 MB/ PAGESIZE
    col=0
    MB=$[1024*1024]

    # Increase in numastat o/p is interms of pages
    Exp_incr=$[$MB/$page_size]

    COUNTER=1
    for node in `echo $nodes_list`; do

	if [ $total_nodes -eq 1 ]
        then
            tst_brkm TBROK NULL "Preferred policy cant be applied for a single node machine"
	    return 1
	fi

        if [ $COUNTER -eq $total_nodes ]   #wrap up for last node
 	then
	    Preferred_node=`echo $nodes_list | cut -d ' ' -f 1`
	    col=2			#column represents node0 in numastat o/p
	else
	    # always next node is preferred node
	    Preferred_node=`echo $nodes_list | cut -d ' ' -f $[COUNTER+1]`
	    col=$[$COUNTER+2]              #Preferred Node number in numastat o/p
	fi

        numastat > $LTPTMP/numalog
        extract_numastat other_node $other_node $col || return 1
        Prev_value=$RC
        numactl --cpunodebind=$node --preferred=$Preferred_node support_numa $ALLOC_1MB
	sleep 2s	#In RHEL collection of statistics takes more time.
        numastat > $LTPTMP/numalog
        extract_numastat other_node $other_node $col || return 1
        Curr_value=$RC
        comparelog $Prev_value $Curr_value
        if [ $RC -lt $Exp_incr ]
        then
             tst_resm TFAIL \
                 "Test #2: NUMA hit and othernode increase in node$node is less than expected"
            return 1
        fi
        COUNTER=$[$COUNTER+1]
    done
    tst_resm TPASS "NUMA preferred node policy -TEST02 PASSED !!"
    return 0
}


# Function:     test03
#
# Description:  - Verification of memory interleaved on all nodes
#
# Return:       - zero on success.
#               - non-zero on failure.
test03()
{
    TCID=numa03
    TST_COUNT=3

    RC=0                # Return value from commands.
    Prev_value=0        # extracted from the numastat o/p
    declare -a parray   # array contains previous value of all nodes
    Curr_value=0        # Current value extracted from numastat o/p
    Exp_incr=0          # 1 MB/ (PAGESIZE*num_of_nodes)
    col=0
    MB=$[1024*1024]

    # Increase in numastat o/p is interms of pages
    Exp_incr=$[$MB/$page_size]
    # Pages will be allocated using round robin on nodes.
    Exp_incr=$[$Exp_incr/$total_nodes]

    # Check whether the pages are equally distributed among available nodes
    numastat > $LTPTMP/numalog
    COUNTER=1
    for node in `echo $nodes_list`; do
        col=$[$COUNTER+1]              #Node number in numastat o/p
        extract_numastat interleave_hit $interleave_hit $col || return 1
        Prev_value=$RC
        parray[$COUNTER]=$Prev_value
        COUNTER=$[$COUNTER+1]
    done

    numactl --interleave=all support_numa $ALLOC_1MB
    sleep 2s        #In RHEL collection of statistics takes more time.

    numastat > $LTPTMP/numalog
    COUNTER=1
    for node in `echo $nodes_list`; do
        col=$[$COUNTER+1]              #Node number in numastat o/p
        extract_numastat interleave_hit $interleave_hit $col || return 1
        Curr_value=$RC
        comparelog ${parray[$COUNTER]} $Curr_value
        if [ $RC -lt $Exp_incr ]
        then
             tst_resm TFAIL \
                 "Test #3: NUMA interleave hit in node$node is less than expected"
            return 1
        fi
        COUNTER=$[$COUNTER+1]
    done
    tst_resm TPASS "NUMA interleave policy -TEST03 PASSED !!"
    return 0
}



# Function:     test04
#
# Description:  - Verification of physical cpu bind
#
# Return:       - zero on success.
#               - non-zero on failure.
test04()
{

    TCID=numa04
    TST_COUNT=4

    no_of_cpus=0	#no. of cpu's exist
    run_on_cpu=0
    running_on_cpu=0

    no_of_cpus=$(tst_ncpus)
    # not sure whether cpu's can't be in odd number
    run_on_cpu=$[$[$no_of_cpus+1]/2]
    numactl --physcpubind=$run_on_cpu support_numa $PAUSE & #just waits for sigint
    pid=$!
    var=`awk '{ print $2 }' /proc/$pid/stat`
    while [ $var = '(numactl)' ]; do
        var=`awk '{ print $2 }' /proc/$pid/stat`
    done
    # Warning !! 39 represents cpu number, on which process pid is currently running and
    # this may change if Some more fields are added in the middle, may be in future
    running_on_cpu=$(awk '{ print $39; }' /proc/$pid/stat)
    if [ $running_on_cpu -ne $run_on_cpu ]
    then
	 tst_resm TFAIL \
	     "Test #4: Process running on cpu$running_on_cpu but expected to run on cpu$run_on_cpu"
	 return 1
    fi
    RC=0
    kill -INT $pid || RC=$?
    if [ $RC -ne 0 ]
    then
        tst_brkm TBROK NULL "Kill on process $pid fails"
    fi
    tst_resm TPASS "NUMA phycpubind policy -TEST04 PASSED !!"
    return 0
}



# Function:     test05
#
# Description:  - Verification of local node allocation
#
# Return:       - zero on success.
#               - non-zero on failure.
test05()
{
    TCID=numa05
    TST_COUNT=5

    RC=0                # Return value from commands.
    Prev_value=0        # extracted from the numastat o/p
    Curr_value=0        # Current value extracted from numastat o/p
    Exp_incr=0          # 1 MB/ PAGESIZE
    col=0
    MB=$[1024*1024]

    # Increase in numastat o/p is interms of pages
    Exp_incr=$[$MB/$page_size]

    COUNTER=1
    for node in `echo $nodes_list`; do
        col=$[$COUNTER+1]               #Node number in numastat o/p
        numastat > $LTPTMP/numalog
        extract_numastat local_node $local_node $col || return 1
        Prev_value=$RC
        numactl --cpunodebind=$node --localalloc support_numa $ALLOC_1MB
        numastat > $LTPTMP/numalog
        extract_numastat local_node $local_node $col || return 1
        Curr_value=$RC
        comparelog $Prev_value $Curr_value
        if [ $RC -lt $Exp_incr ]
        then
             tst_resm TFAIL \
                 "Test #5: NUMA hit and localnode increase in node$node is less than expected"
            return 1
        fi
        COUNTER=$[$COUNTER+1]
    done
    tst_resm TPASS "NUMA local node allocation -TEST05 PASSED !!"
    return 0
}



# Function:     test06
#
# Description:  - Verification of shared memory interleaved on all nodes
#
# Return:       - zero on success.
#               - non-zero on failure.
test06()
{
    TCID=numa06
    TST_COUNT=6

    RC=0                # Return value from commands.
    Prev_value=0        # extracted from the numastat o/p
    declare -a parray   # array contains previous value of all nodes
    Curr_value=0        # Current value extracted from numastat o/p
    Exp_incr=0          # 1 MB/ (PAGESIZE*num_of_nodes)
    col=0
    MB=$[1024*1024]

    # Increase in numastat o/p is interms of pages
    Exp_incr=$[$MB/$page_size]
    # Pages will be allocated using round robin on nodes.
    Exp_incr=$[$Exp_incr/$total_nodes]

    # Check whether the pages are equally distributed among available nodes
    numastat > $LTPTMP/numalog
    COUNTER=1
    for node in `echo $nodes_list`; do
        col=$[$COUNTER+1]              #Node number in numastat o/p
        extract_numastat numa_hit $numa_hit $col || return 1
        Prev_value=$RC
        parray[$COUNTER]=$Prev_value
        COUNTER=$[$COUNTER+1]
    done

    numactl --length=1M --file /dev/shm/numa_shm --interleave=all --touch
    sleep 2s        #In RHEL collection of statistics takes more time.

    numastat > $LTPTMP/numalog
    COUNTER=1
    for node in `echo $nodes_list`; do
        col=$[$COUNTER+1]              #Node number in numastat o/p
        extract_numastat numa_hit $numa_hit $col || return 1
        Curr_value=$RC
        comparelog ${parray[$COUNTER]} $Curr_value
        if [ $RC -lt $Exp_incr ]
        then
             tst_resm TFAIL \
                 "Test #6: NUMA numa_hit for shm file numa_shm in node$node is less than expected"
            return 1
        fi
        COUNTER=$[$COUNTER+1]
    done
    tst_resm TPASS "NUMA interleave policy on shared memory -TEST06 PASSED !!"
    RC=0
    rm -r /dev/shm/numa_shm || RC=$?
    if [ $RC -ne 0 ]
    then
	tst_resm TINFO "Test #6: Failed removing shared memory file numa_shm"
        return 1
    fi
    return 0
}

# Function:     test07
#
# Description:  - Verification of numademo
#
# Return:       - zero on success.
#               - non-zero on failure.
test07()
{
    TCID=numa07
    TST_COUNT=7

    RC=0                # Return value from commands.
    Prev_value=0        # extracted from the numastat o/p
    declare -a parray   # array contains previous value of all nodes
    Curr_value=0        # Current value extracted from numastat o/p
    Exp_incr=0          # 1 MB/ (PAGESIZE*num_of_nodes)
    col=0
    msize=1000
    KB=1024
    # Increase in numastat o/p is interms of pages
     Exp_incr=$[($KB * $msize)/$page_size]
    # Pages will be allocated using round robin on nodes.
    Exp_incr=$[$Exp_incr/$total_nodes]

    # Check whether the pages are equally distributed among available nodes
    numastat > $LTPTMP/numalog
    COUNTER=1
    for node in `echo $nodes_list`; do
        col=$[$COUNTER+1]              #Node number in numastat o/p
        extract_numastat interleave_hit $interleave_hit $col || return 1
        Prev_value=$RC
        parray[$COUNTER]=$Prev_value
        COUNTER=$[$COUNTER+1]
    done

    numademo -c ${msize}k > $LTPTMP/demolog
    sleep 2s        #In RHEL collection of statistics takes more time.

    numastat > $LTPTMP/numalog
    COUNTER=1
    x=0
    for node in `echo $nodes_list`; do
        col=$[$COUNTER+1]              #Node number in numastat o/p
        extract_numastat interleave_hit $interleave_hit $col || return 1
        Curr_value=$RC
         comparelog ${parray[$COUNTER]} $Curr_value
        counter=$[$counter+1]
        if [ $RC -le $Exp_incr ]
        then
            x=1
            break;
        fi
        COUNTER=$[$COUNTER+1]
    done
    if [ $x -eq 0 ]
    then
        tst_resm TPASS "NUMADEMO policies  -TEST07 PASSED !!"
        return 0
    else
        tst_resm TFAIL "Test #7: NUMA interleave hit is less than expected"
    return 1
    fi
}

# Function:     test08
#
# Description:  - Verification of memhog with interleave policy
#
# Return:       - zero on success.
#               - non-zero on failure.
test08()
{
    TCID=numa08
    TST_COUNT=8

    RC=0                # Return value from commands.
    Prev_value=0        # extracted from the numastat o/p
    declare -a parray   # array contains previous value of all nodes
    Curr_value=0        # Current value extracted from numastat o/p
    Exp_incr=0          # 1 MB/ (PAGESIZE*num_of_nodes)
    col=0
    MB=$[1024*1024]

    # Increase in numastat o/p is interms of pages
    Exp_incr=$[$MB/$page_size]
    # Pages will be allocated using round robin on nodes.
    Exp_incr=$[$Exp_incr/$total_nodes]

    # Check whether the pages are equally distributed among available nodes
    numastat > $LTPTMP/numalog
    COUNTER=1
    for node in `echo $nodes_list`; do
        col=$[$COUNTER+1]              #Node number in numastat o/p
        extract_numastat interleave_hit $interleave_hit $col || return 1
        Prev_value=$RC
        parray[$COUNTER]=$Prev_value
        COUNTER=$[$COUNTER+1]
    done
    numactl --interleave=all memhog 1MB
    sleep 2s        #In RHEL collection of statistics takes more time.

    numastat > $LTPTMP/numalog
    COUNTER=1
    for node in `echo $nodes_list`; do
        col=$[$COUNTER+1]              #Node number in numastat o/p
        extract_numastat interleave_hit $interleave_hit $col || return 1
        Curr_value=$RC
        comparelog ${parray[$COUNTER]} $Curr_value
        if [ $RC -lt $Exp_incr ]
        then
             tst_resm TFAIL \
                 "Test #8: NUMA interleave hit in node$node is less than expected"
            return 1
        fi
        COUNTER=$[$COUNTER+1]
    done
    tst_resm TPASS "NUMA MEMHOG policy -TEST08 PASSED !!"
    return 0
}

# Function:     hardware cheking with numa_node_size api
#
# Description:  - Returns the size of available nodes if success.
#
# Input:        - o/p of numactl --hardware command which is expected in the format
#                 shown below
#               available: 2 nodes (0-1)
#               node 0 size: 7808 MB
#               node 0 free: 7457 MB
#               node 1 size: 5807 MB
#               node 1 free: 5731 MB
#               node distances:
#               node   0   1
#                 0:  10  20
#                 1:  20  10
#
# Return:       - zero on success.
#               - non-zero on failure.
#
test09()
{
    TCID=numa09
    TST_COUNT=9

    RC=0                # Return value from commands.
    Prev_value=0        # extracted from the numastat o/p
    Curr_value=0        # Current value extracted from numastat o/p
    Exp_incr=0          # 1 MB/ PAGESIZE
    col=0
    MB=$[1024*1024]
    # Increase in numastat o/p is interms of pages
    Exp_incr=$[$MB/$page_size]

    numactl --hardware > $LTPTMP/avail_nodes
    RC=$(awk '{ if ( NR == 1 ) {print $1;} }' $LTPTMP/avail_nodes)
    if [ $RC = "available:" ]
    then

        RC=$(awk '{ if ( NR == 1 ) {print $3;} }' $LTPTMP/avail_nodes)
        if [ $RC = "nodes" ]
        then
           RC=$(awk '{ if ( NR == 1 ) {print $2;} }' $LTPTMP/avail_nodes)

        tst_resm TPASS "NUMA policy on lib NUMA_NODE_SIZE API -TEST09 PASSED !!"
        else
                tst_resm TINFO "Test #9: Failed with numa policy"
        fi
    else
        tst_resm TINFO "Test #9: Failed with numa policy"
    fi
}
# Function:     test10
#
# Description:  - Verification of migratepages
#
# Return:       - zero on success.
#               - non-zero on failure.
test010()
{
    TCID=numa10
    TST_COUNT=10
    RC=0
    Prev_value=0
    Curr_value=0

    COUNTER=1
    for node in `echo $nodes_list`; do

        if [ $total_nodes -eq 1 ]
        then
            tst_brkm TBROK NULL "Preferred policy cant be applied for a single node machine"
            return 1
        fi

        if [ $COUNTER -eq $total_nodes ]; then
            Preferred_node=`echo $nodes_list | cut -d ' ' -f 1`
            col=2
        else
            Preferred_node=`echo $nodes_list | cut -d ' ' -f $[$COUNTER+1]`
            col=$[$COUNTER+2]
        fi

        numastat > $LTPTMP/numalog
        extract_numastat other_node $other_node $col || return 1
        Prev_value=$RC
        numactl --preferred=$node support_numa $PAUSE &
        pid=$!
        migratepages $pid $node $Preferred_node
        numastat > $LTPTMP/numalog
        extract_numastat other_node $other_node $col || return 1
        Curr_value=$RC
        kill -INT $pid
        if [ $RC -lt $Prev_value ]; then
             tst_resm TFAIL \
                 "Test #10: NUMA migratepages is not working fine"
            return 1
        fi
        COUNTER=$[$COUNTER+1]
    done
    tst_resm TPASS "NUMA MIGRATEPAGES policy -TEST10 PASSED !!"
    return 0
}

# Function:    main
#
# Description: - Execute all tests and report results.
#
# Exit:        - zero on success
#              - non-zero on failure.
    #WARNING!! Never use duplicate variables here...
    TCID=numa
    no_of_test=10	#total no. of testcases
    no_of_test_failed=0	#total no. of testcases failed
    numa_ret=0		#return value of main script

    init_ret=0
    init || init_ret=$?
    if [ $init_ret -ne 0 ]
    then
        tst_resm TFAIL "INIT NUMA FAILED !!"
        exit $RC
    fi

    total_nodes=0       # total no. of numa nodes
    # all availiable nodes id list
    nodes_list=`numactl --show | grep nodebind | cut -d ':' -f 2`
    for node in `echo $nodes_list`; do
        total_nodes=$[$total_nodes+1]
    done
    tst_resm TINFO "The system contains $total_nodes nodes: $nodes_list"
    if [ $total_nodes -le 1 ]; then
        tst_resm TCONF "your machine does not support numa policy or
                        your machine is not a NUMA machine"
        exit 0
    fi

    # call each testcases sequentially
    COUNT=1
    while [  $COUNT -le $no_of_test ]; do
	call_test=$(echo test0$COUNT)
        func_ret=0
	$call_test || func_ret=$?
        if [ $func_ret -ne 0 ]
        then
            no_of_test_failed=$[$no_of_test_failed+1]
        fi
        COUNT=$[$COUNT+1]
    done

    TCID=numa
    TST_COUNT=0

    if [ $no_of_test_failed -ne 0 ]
    then
        numa_ret=1	#set return value to non-zero if any one of the testcas got failed
        tst_resm TINFO "A total of $no_of_test_failed numa testcases FAILED !!"
    else
        numa_ret=0
        tst_resm TINFO "All numa testcases PASSED !!"
    fi

exit $numa_ret