return 0;
 }
 
-static void parse_setup_cpu_list(void)
+static int parse_setup_cpu_list(void)
 {
        struct thread_data *td;
        char *str0, *str;
        int t;
 
        if (!g->p.cpu_list_str)
-               return;
+               return 0;
 
        dprintf("g->p.nr_tasks: %d\n", g->p.nr_tasks);
 
 
                dprintf("CPUs: %d_%d-%d#%dx%d\n", bind_cpu_0, bind_len, bind_cpu_1, step, mul);
 
-               BUG_ON(bind_cpu_0 < 0 || bind_cpu_0 >= g->p.nr_cpus);
-               BUG_ON(bind_cpu_1 < 0 || bind_cpu_1 >= g->p.nr_cpus);
+               if (bind_cpu_0 >= g->p.nr_cpus || bind_cpu_1 >= g->p.nr_cpus) {
+                       printf("\nTest not applicable, system has only %d CPUs.\n", g->p.nr_cpus);
+                       return -1;
+               }
+
+               BUG_ON(bind_cpu_0 < 0 || bind_cpu_1 < 0);
                BUG_ON(bind_cpu_0 > bind_cpu_1);
 
                for (bind_cpu = bind_cpu_0; bind_cpu <= bind_cpu_1; bind_cpu += step) {
                printf("# NOTE: %d tasks bound, %d tasks unbound\n", t, g->p.nr_tasks - t);
 
        free(str0);
+       return 0;
 }
 
 static int parse_cpus_opt(const struct option *opt __maybe_unused,
        return 0;
 }
 
-static void parse_setup_node_list(void)
+static int parse_setup_node_list(void)
 {
        struct thread_data *td;
        char *str0, *str;
        int t;
 
        if (!g->p.node_list_str)
-               return;
+               return 0;
 
        dprintf("g->p.nr_tasks: %d\n", g->p.nr_tasks);
 
 
                dprintf("NODEs: %d-%d #%d\n", bind_node_0, bind_node_1, step);
 
-               BUG_ON(bind_node_0 < 0 || bind_node_0 >= g->p.nr_nodes);
-               BUG_ON(bind_node_1 < 0 || bind_node_1 >= g->p.nr_nodes);
+               if (bind_node_0 >= g->p.nr_nodes || bind_node_1 >= g->p.nr_nodes) {
+                       printf("\nTest not applicable, system has only %d nodes.\n", g->p.nr_nodes);
+                       return -1;
+               }
+
+               BUG_ON(bind_node_0 < 0 || bind_node_1 < 0);
                BUG_ON(bind_node_0 > bind_node_1);
 
                for (bind_node = bind_node_0; bind_node <= bind_node_1; bind_node += step) {
                printf("# NOTE: %d tasks mem-bound, %d tasks unbound\n", t, g->p.nr_tasks - t);
 
        free(str0);
+       return 0;
 }
 
 static int parse_nodes_opt(const struct option *opt __maybe_unused,
        init_thread_data();
 
        tprintf("#\n");
-       parse_setup_cpu_list();
-       parse_setup_node_list();
+       if (parse_setup_cpu_list() || parse_setup_node_list())
+               return -1;
        tprintf("#\n");
 
        print_summary();
        return 0;
 
 err:
-       usage_with_options(numa_usage, options);
        return -1;
 }
 
        BUG_ON(ret < 0);
 
        for (i = 0; i < nr; i++) {
-               if (run_bench_numa(tests[i][0], tests[i] + 1))
-                       return -1;
+               run_bench_numa(tests[i][0], tests[i] + 1);
        }
 
        printf("\n");