can the scheduler decide to schedule an interrupted but runnable thread on another CPU core? What are the implications for code?
John Baldwin
jhb at freebsd.org
Tue Feb 18 19:58:24 UTC 2014
On Friday, February 14, 2014 9:30:38 pm Andrey Chernov wrote:
> On 15.02.2014 4:11, John-Mark Gurney wrote:
> >>> This is code example from cpuminer port, in case you are interested, it is very simple:
> >>>
> >>> static inline void affine_to_cpu(int id, int cpu)
> >>> {
> >>> cpuset_t set;
> >>> CPU_ZERO(&set);
> >>> CPU_SET(cpu, &set);
> >>> cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_CPUSET, -1, sizeof(cpuset_t), &set);
> >>
> >> I think that CPU_WHICH_TID should have been used here.
> >
> > I agree... cpuset(2):
> > The which argument determines how the value of id is interpreted and is
> > of type cpuwhich_t. The which argument may have the following values:
> >
> > CPU_WHICH_TID id is lwpid_t (thread id)
> > CPU_WHICH_PID id is pid_t (process id)
> > CPU_WHICH_CPUSET id is a cpusetid_t (cpuset id)
> > CPU_WHICH_IRQ id is an irq number
> >
> > An id of '-1' may be used with a which of CPU_WHICH_TID, CPU_WHICH_PID,
> > or CPU_WHICH_CPUSET to mean the current thread, process, or current
> > thread's cpuset. All cpuset syscalls allow this usage.
>
> The question still remains: why SCHED_ULE and SCHED_4BSD do different
> things here on CPU_WHICH_CPUSET == -1 (current thread's cpuset)? It
> looks like SCHED_ULE changes per/process mask while SCHED_4BSD change
> per/thread mask in that case.
Eh, no. CPU_WHICH_CPUSET changes the global set that the thread belongs to.
t is not per proceses or per thread. Unless you are explicitly creating
new global sets, your thread belongs to the default set (set 1), and this
call is changing the default set (set 1) to only use a single CPU. This
affects all processes in the machine that do not have their own sets.
--
John Baldwin
More information about the freebsd-arch
mailing list