1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
/*
* Copyright (c) 2004-2008 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "opal_config.h"
#include <string.h>
#include <stddef.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include "opal/constants.h"
#include "opal/mca/maffinity/maffinity.h"
#include "opal/mca/maffinity/base/base.h"
#include "maffinity_first_use.h"
/*
* Local functions
*/
static int first_use_module_init(void);
static int first_use_module_set(opal_maffinity_base_segment_t *segments,
size_t num_segments);
/*
* First_Use maffinity module
*/
static const opal_maffinity_base_module_1_0_0_t loc_module = {
/* Initialization function */
first_use_module_init,
/* Module function pointers */
first_use_module_set,
NULL,
NULL
};
int opal_maffinity_first_use_component_query(mca_base_module_t **module, int *priority)
{
int param;
param = mca_base_param_find("maffinity", "first_use", "priority");
mca_base_param_lookup_int(param, priority);
*module = (mca_base_module_t *)&loc_module;
return OPAL_SUCCESS;
}
static int first_use_module_init(void)
{
/* Nothing to do */
return OPAL_SUCCESS;
}
static int first_use_module_set(opal_maffinity_base_segment_t *segments,
size_t num_segments)
{
size_t i;
uintptr_t pagesize = (uintptr_t)sysconf(_SC_PAGESIZE);
volatile char useless;
for (i = 0; i < num_segments; ++i) {
char* ptr = (char*)segments[i].mbs_start_addr;
char* end_ptr = ptr + segments[i].mbs_len;
/* Let's touch the first byte of the segment. If this is the
* first byte on the memory page, good. If not, at least it
* will not overwrite anything important.
*/
useless = ptr[0];
/* Compute the address of the first byte on the next page */
ptr = (char*)((uintptr_t)(ptr + pagesize) & ~pagesize);
while( ptr <= end_ptr) {
useless += ptr[0];
ptr += pagesize;
};
}
return OPAL_SUCCESS;
}
|