source: trunk/sys/libphoenix/locality.c @ 269

Last change on this file since 269 was 1, checked in by alain, 8 years ago

First import

File size: 2.7 KB
RevLine 
[1]1/* Copyright (c) 2007-2009, Stanford University
2* All rights reserved.
3*
4* Redistribution and use in source and binary forms, with or without
5* modification, are permitted provided that the following conditions are met:
6*     * Redistributions of source code must retain the above copyright
7*       notice, this list of conditions and the following disclaimer.
8*     * Redistributions in binary form must reproduce the above copyright
9*       notice, this list of conditions and the following disclaimer in the
10*       documentation and/or other materials provided with the distribution.
11*     * Neither the name of Stanford University nor the names of its
12*       contributors may be used to endorse or promote products derived from
13*       this software without specific prior written permission.
14*
15* THIS SOFTWARE IS PROVIDED BY STANFORD UNIVERSITY ``AS IS'' AND ANY
16* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18* DISCLAIMED. IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE FOR ANY
19* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*/ 
26
27#include <assert.h>
28#include <unistd.h>
29#include <sys/mman.h>
30#include "locality.h"
31#include "stddefines.h"
32#include "processor.h"
33
34static int num_cluster = 0;
35
36/* Retrieve the number of processors that belong to the locality
37   group of the calling LWP. */
38int loc_get_lgrp_size ()
39{
40    /* XXX smarter implementation? have all cpus local to this thread */
41    return proc_get_num_cpus () / loc_get_num_lgrps();
42}
43
44/* Retrieve the number of total locality groups on system. */
45int loc_get_num_lgrps ()
46{
47  if(num_cluster == 0)
48  {
49    num_cluster = sysconf(_SC_NCLUSTERS_ONLN);
50   
51    if(num_cluster < 1)
52      num_cluster = 1;
53  }
54
55  return num_cluster;
56}
57
58/* Retrieve the locality group of the calling LWP. */
59int loc_get_lgrp ()
60{
61    int cpuid = proc_get_cpuid();
62
63    assert(cpuid != -1);
64
65    if (cpuid == -1)
66       return 0;
67    else
68       return cpuid % loc_get_num_lgrps();
69}
70
71/* Retrieve the locality group of the physical memory that backs
72   the virtual address ADDR. */
73int loc_mem_to_lgrp (void *addr)
74{
75  minfo_t info;
76  int err;
77
78  err = mcntl(MCNTL_READ, addr, 1, &info);
79
80  assert(err == 0);
81
82  if(err != 0) return 0;
83
84  return info.mi_cid;
85}
Note: See TracBrowser for help on using the repository browser.