source: rtems/cpukit/score/src/cpuset.c @ bbd6d27a

5
Last change on this file since bbd6d27a was 190169fe, checked in by Sebastian Huber <sebastian.huber@…>, on 12/10/15 at 14:30:41

Optional CPU Set Handler initialization

Update #2408.

  • Property mode set to 100644
File size: 2.2 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup ScoreCpuset
5 *
6 * @brief Routines to Control a CPU Set.
7 */
8
9/*
10 *  COPYRIGHT (c) 2014.
11 *  On-Line Applications Research Corporation (OAR).
12 *
13 *  The license and distribution terms for this file may be
14 *  found in the file LICENSE in this distribution or at
15 *  http://www.rtems.org/license/LICENSE.
16 */
17
18#if HAVE_CONFIG_H
19#include "config.h"
20#endif
21
22#ifdef __RTEMS_HAVE_SYS_CPUSET_H__
23#include <sys/cpuset.h>
24#include <rtems/sysinit.h>
25#include <rtems/score/cpusetimpl.h>
26#include <rtems/score/assert.h>
27#include <rtems/score/percpu.h>
28
29static CPU_set_Control cpuset_default;
30
31/*
32 * _CPU_set_Handler_initialization
33 */
34static void _CPU_set_Handler_initialization()
35{
36  uint32_t cpu_count;
37  uint32_t cpu_index;
38
39  /* We do not support a cpu count over CPU_SETSIZE  */
40  cpu_count = _SMP_Get_processor_count();
41
42  /* This should never happen */
43  _Assert( cpu_count <= CPU_SETSIZE );
44
45  /*  Initialize the affinity to be the set of all available CPU's   */
46  cpuset_default.set     = &cpuset_default.preallocated;
47  cpuset_default.setsize = sizeof( *cpuset_default.set );
48  CPU_ZERO_S( cpuset_default.setsize, &cpuset_default.preallocated );
49
50  for ( cpu_index=0; cpu_index<cpu_count; cpu_index++ )
51    CPU_SET_S( (int) cpu_index, cpuset_default.setsize, cpuset_default.set );
52}
53
54RTEMS_SYSINIT_ITEM(
55  _CPU_set_Handler_initialization,
56  RTEMS_SYSINIT_CPU_SET,
57  RTEMS_SYSINIT_ORDER_MIDDLE
58);
59
60/**
61 * _CPU_set_Is_valid
62 *
63 * This routine validates a cpuset size corresponds to
64 * the system correct size, that at least one
65 * valid cpu is set and that no invalid cpus are set.
66 */
67bool _CPU_set_Is_valid( const cpu_set_t *cpuset, size_t setsize )
68{
69  cpu_set_t             temp;
70
71  if ( !cpuset )
72    return false;
73
74  if ( setsize != cpuset_default.setsize )
75    return false;
76
77  /* Validate at least 1 valid cpu is set in cpuset */
78  CPU_AND_S( cpuset_default.setsize, &temp, cpuset, cpuset_default.set );
79
80  if ( CPU_COUNT_S( setsize, &temp ) == 0 )
81    return false;
82
83  /* Validate that no invalid cpu's are set in cpuset */
84  if ( !CPU_EQUAL_S( setsize, &temp, cpuset ) )
85    return false;
86
87  return true;
88}
89
90/**
91 * _CPU_set_Default
92 *
93 * This routine returns the default cpuset.
94 */
95const CPU_set_Control *_CPU_set_Default()
96{
97  return &cpuset_default;
98}
99#endif
100
101
Note: See TracBrowser for help on using the repository browser.