Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:26

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RTEMSScoreScheduler
0007  *
0008  * @brief This source file contains the implementation of
0009  *   _Scheduler_Set_affinity().
0010  */
0011 
0012 /*
0013  * Copyright (C) 2014, 2017 embedded brains GmbH & Co. KG
0014  *
0015  * Redistribution and use in source and binary forms, with or without
0016  * modification, are permitted provided that the following conditions
0017  * are met:
0018  * 1. Redistributions of source code must retain the above copyright
0019  *    notice, this list of conditions and the following disclaimer.
0020  * 2. Redistributions in binary form must reproduce the above copyright
0021  *    notice, this list of conditions and the following disclaimer in the
0022  *    documentation and/or other materials provided with the distribution.
0023  *
0024  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0025  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0026  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0027  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0028  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0029  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0030  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0031  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0032  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0033  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0034  * POSSIBILITY OF SUCH DAMAGE.
0035  */
0036 
0037 #ifdef HAVE_CONFIG_H
0038 #include "config.h"
0039 #endif
0040 
0041 #include <rtems/score/schedulerimpl.h>
0042 
0043 Status_Control _Scheduler_Set_affinity(
0044   Thread_Control       *the_thread,
0045   size_t                cpusetsize,
0046   const cpu_set_t      *cpuset
0047 )
0048 {
0049   Processor_mask             affinity;
0050   Processor_mask_Copy_status copy_status;
0051   const Scheduler_Control   *scheduler;
0052   Scheduler_Node            *node;
0053   ISR_lock_Context           lock_context;
0054   Status_Control             status;
0055 
0056   copy_status = _Processor_mask_From_cpu_set_t( &affinity, cpusetsize, cpuset );
0057   if ( !_Processor_mask_Is_at_most_partial_loss( copy_status ) ) {
0058     return STATUS_INVALID_NUMBER;
0059   }
0060 
0061   /*
0062    * Reduce affinity set to the online processors to be in line with
0063    * _Thread_Initialize() which sets the default affinity to the set of online
0064    * processors.
0065    */
0066   _Processor_mask_And( &affinity, _SMP_Get_online_processors(), &affinity );
0067 
0068   scheduler = _Thread_Scheduler_get_home( the_thread );
0069   _Scheduler_Acquire_critical( scheduler, &lock_context );
0070 
0071   node = _Thread_Scheduler_get_home_node( the_thread );
0072 #if defined(RTEMS_SMP)
0073   status = ( *scheduler->Operations.set_affinity )(
0074     scheduler,
0075     the_thread,
0076     node,
0077     &affinity
0078   );
0079 
0080   if ( status == STATUS_SUCCESSFUL ) {
0081     _Processor_mask_Assign( &the_thread->Scheduler.Affinity, &affinity );
0082   }
0083 #else
0084   status = _Scheduler_default_Set_affinity_body(
0085     scheduler,
0086     the_thread,
0087     node,
0088     &affinity
0089   );
0090 #endif
0091 
0092   _Scheduler_Release_critical( scheduler, &lock_context );
0093   return status;
0094 }