Linux compatible setaffinity.

Daniel Eischen deischen at freebsd.org
Wed Feb 20 13:06:57 UTC 2008


On Tue, 19 Feb 2008, Jeff Roberson wrote:

> On Sat, 12 Jan 2008, Jeff Roberson wrote:
>
>> On Sat, 12 Jan 2008, Daniel Eischen wrote:
>> 
>>> On Sat, 12 Jan 2008, Jeff Roberson wrote:
>>> 
>>>> Now, there is one problem with the linux api that I want to discuss 
>>>> before I commit it.  The current patch always works on curthread. 
>>>> However, the api allows for setting the binding of a pid.  I believe, 
>>>> although I'm not certain, that pids and tids in linux are in the same 
>>>> number space.  It's not clear to me whether you can set an affinity for 
>>>> an entire process and have it effect an individual thread or whether you 
>>>> set it on a thread by thread basis.  When supplying a non-curproc pid do 
>>>> you bind all threads in the target process?
>>>> 
>>>> Are our tids and pids in the same number space?  And are they available 
>>>> to application programmers?  I haven't followed that very carefully.
>>> 
>>> I believe marcel made tids and pids disjoint so that any pid is
>>> never equal to any tid.  But regardless, I don't think we want
>>> to rely on that.  I would prefer the Solaris approach of specifying
>>> what we want (pid, tid, jail id, etc) as an argument in the API
>>> so there is no confusion.
>> 
>> Yes, I would prefer that as well I believe.  So I'll add an extra parameter 
>> and in the linux code we'll use whatever their default is.  Of course the 
>> initial implementation will still only support curthread but I plan on 
>> finishing the rest before 8.0 is done.
>
> So what does everyone think of something like this:
>
> int cpuaffinity(int cmd, long which, int masksize, unsigned *mask);
>
> #define AFFINITY_GET	0x1
> #define	AFFINITY_SET	0x2
> #define	AFFINITY_PID	0x4
> #define	AFFINITY_TID	0x8
>
> I'm not married to any of these names.  If you know of something that would 
> be more regular please comment.

I take it 'cmd' is either AFFINITY_GET or AFFINITY_SET, and which
is AFFINITY_PID or AFFINITY_TID.  Is there a reason why, for 2 different
arguments to cpuaffinity(), the flags are disjoint?  It almost seems
like you wanted:

 	int cpuaffinity(int flags, int masksize, unsigned *mask)

I prefer the API you specified, keeping 'cmd' and 'which' as
separate arguments.

Is masksize in bytes or in units of unsigned?  Do we need helper
functions/macros for the mask?  Like sigemptyset, sigaddset, etc?

-- 
DE


More information about the freebsd-arch mailing list