tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Processor sets, affinity, real-time extensions



On Thu, Jan 10, 2008 at 02:21:24AM +0200, Mindaugas R. wrote:

> here is the implementation of processor-sets and CPU affinity calls. Also,
> this implements POSIX real-time extensions like: pthread_getschedparam(),
> pthread_setschedparam(), pthread_setschedprio(), sched_setscheduler(),
> sched_getscheduler(), etc. A userland utility schedctl(1) is provided too.
> 
>   http://www.netbsd.org/~rmind/psets_affinity_rt.tar.bz2
> 
> The processor-sets are compatible with Solaris API:
> 
>   int pset_assign(psetid_t, cpuid_t, psetid_t *);
>   int pset_bind(psetid_t, idtype_t, id_t, psetid_t *);
>   int pset_create(psetid_t *);
>   int pset_destroy(psetid_t);
> 
> Two non-portable pthread affinity calls (compatible with Linux):
> 
>   int pthread_getaffinity_np(pthread_t, size_t, cpuset_t *);
>   int pthread_setaffinity_np(pthread_t, size_t, cpuset_t *);
> 
> Unless nobody objects, I would like to start merging these sources.
> Few things to mention about the implementation:
> 
> 1. Instead of providing separate system calls for setting the priority and
> scheduling class (policy, as defined by POSIX), there is an internal system
> call _sched_setparam() to pass all parameters in a structure:
> 
> struct sched_param {
>       int     sched_class;
>       int     sched_priority;
> };
> 
> Is there anything potentially wrong with this?
> 
> 2. There is another internal system call:
> 
> int _pset_bind(idtype_t idtype, id_t first_id, id_t second_id,
>              psetid_t psid, psetid_t opsid);
> 
> It is reasonable to provide a possibility for administrator to bind any
> threads via userland utility. At this point, there is a need of two IDs (eg.
> one for PID, and other for LID). I do not like such design i.e. to use two ID
> arguments in syscall, however I am not sure about a better way. Thoughts?
> 
> 3. There is a kernel function lwp_migrate(), which might be used for generic
> migration of thread from one CPU to another. The problematic case when thread
> is on LSONPROC state. In such case lwp::l_target_cpu is set, and migration
> is performed in mi_switch(). However, this increases the complexity of
> mi_switch(). One of the alternatives would be migration queues, but it has
> few disadvantages:
> 1) this is needed only for SCHED_M2 scheduler because of per-CPU locks;
>    migration with SCHED_4BSD is trivial;
> 2) there is no easy way to abstract and close this in the scheduler.
> Comments?

Thanks for doing this, these are some pretty cool features to finally have!
I have some comments, which we discussed in private:

o 'nice' doesn't work with SCHED_M2, which is a regression. Asking people
  to use schedctl doesn't really wash, because nice is specified by POSIX,
  works on every other Unix type system and has been around for over 20
  years.

o SCHED_4BSD doesn't provide the new features and I'm strongly of the
  opinion that's a bug. By providing pluggable schedulers we gave people
  options. By fragmenting the feature set by scheduler we are taking those
  options away again.

o I mentioned that I don't like how we deal with on-processor migration
  in mi_switch() because it's complicated - and mi_switch() is already too
  complicated. I'll try to think of a better way to handle it.

Thanks,
Andrew



Home | Main Index | Thread Index | Old Index