Patch for pthread get and set affinity

Sebastian Huber sebastian.huber at embedded-brains.de
Wed Mar 5 07:25:07 UTC 2014


On 2014-02-27 14:28, Jennifer Averett wrote:
> +int pthread_setaffinity_np(
> +  pthread_t          id,
> +  size_t             cpusetsize,
> +  const cpu_set_t   *cpuset)
> +{
> +  Objects_Locations        location;
> +  POSIX_API_Control       *api;
> +  Thread_Control          *the_thread;
> +  int                      error;
> +
> +  if ( !cpuset )
> +    return EFAULT;
> +
> +  error = _CPU_set_Is_valid( cpuset, cpusetsize );
> +  if ( error != 0 )
> +    return EINVAL;
> +
> +  the_thread = _Thread_Get( id, &location );
> +  switch ( location ) {
> +
> +    case OBJECTS_LOCAL:
> +      api = the_thread->API_Extensions[ THREAD_API_POSIX ];
> +      CPU_COPY( the_thread->affinity.set, cpuset );
> +      CPU_COPY( api->Attributes.affinityset, cpuset );
> +      _Objects_Put( &the_thread->Object );
> +      return 0;
> +      break;
> +
> +#if defined(RTEMS_MULTIPROCESSING)
> +    case OBJECTS_REMOTE:
> +#endif
> +    case OBJECTS_ERROR:
> +      break;
> +  }
> +
> +  return ESRCH;
> +}

Sorry, for the late answer, but I think this approach makes no sense.

Your pthread_setaffinity_np() implementation just copies some bits from A to B. 
  I think that the thread processor affinity is independent of the API 
(Classic, POSIX, Internal).  So the storage space for the affinity set should 
not be in "api->Attributes".  The scheduler should know about an affinity set 
change, so here we need a scheduler operation invocation.

http://www.rtems.org/wiki/index.php?title=SMP#Scheduler_Implementation

Since the scheduler knows best what do it should also store the affinity set in 
its per-thread control block, e.g. in the stuff allocated via

/**
  * @brief Scheduler allocate.
  *
  * This routine allocates @a the_thread->scheduler
  */
RTEMS_INLINE_ROUTINE void* _Scheduler_Allocate(
   Thread_Control    *the_thread
)
{
   return _Scheduler.Operations.allocate( the_thread );
}

The scheduler can then use the optimal data structure for its algorithms. 
Since all currently implemented schedulers in RTEMS don't support thread 
affinity this is particularly easy, they only have to check the affinity set 
and need to store nothing.

This makes also _CPU_set_Is_valid() superfluous since the scheduler is then 
responsible to check the affinity set.

-- 
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.



More information about the devel mailing list