Re: getaffinity/setaffinity and cpu sets.
- From: Jeff Roberson <jroberson@xxxxxxxxxxxxxx>
- Date: Fri, 22 Feb 2008 13:10:00 -1000 (HST)
On Fri, 22 Feb 2008, Daniel Eischen wrote:
On Fri, 22 Feb 2008, Jeff Roberson wrote:
On Thu, 21 Feb 2008, Robert Watson wrote:
On Wed, 20 Feb 2008, Jeff Roberson wrote:
I also have a 'cpuset' command which can run a new program with a given cpu set, view and modify sets of arbitrary pids. This is all working and I can supply patches if anyone is interested. I have to implement 4BSD support before I can commit.
I have a proposal for solaris style processor sets which I think is simple and sufficient for most cases. It involves the following new syscalls:
int cpuset(void); int setcpuset(pid_t pid, int setid); int getcpuset(pid_t pid);
The notion would be that you can create a new numbered cpuset with cpuset(). You can modify or inspect its affinity with get/setaffinity above and the CPU_WHICH_SET argument. The cpuset exists as long as there are members of the set. Sort of like a process group or session. The {get,set}cpuset calls can inspect or modify the state.
This set would not be modifiable by user processes or by processes in a jail. It would create the restriction that differs between 'avail' and 'sys' above. Processors would be able to directly bind to any processor within the set. Changing the set would apply to all processes in the set. The cpuset would be per-process while the mask is per-thread. Sets involvement is inherited on fork().
In solaris sets can be named and have a more complete management api. I'm not really interested in implementing all of that but I believe what I have outlined here would be subset of this and no code/syscalls would be wasted.
Comments? Objections? I'm fairly pleased with this arrangement now.
Just to put a few notes from our conversation on IRC in e-mail:
- I think I'd prefer int cpuset(cpuset_t *set), int getcpuset(pid_t, cpuset_t
*) so that we don't mix up ID's and return values. More recent interfaces
tend to do this, I believe, and it means that the prototype, even if not the
ABI, remains the same if the set identifier changes in the future.
Ok, this is a good suggestion and I did this. This is actually my preferred method as well but most syscalls don't follow this pattern and I was trying to make it look syscallish.
I would probably use cpuset_create(), cpuset_get(), cpuset_set()...
Don't know if you need cpuset_destroy()...
In the solaris model sets are explicitly created and destroyed. In my model they are transient and only exist as long as they have members. So I don't have a destroy. fwiw it looks like linux also does a persistent thing that you modify via a filesystem.
If we later want to add some attributes which we'd like to persist it'd be as simple as adding a destroy call and adding an extra ref on create. We should decide that before 8.0 however when the api becomes more entrenched.
_______________________________________________
--
DE
freebsd-arch@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-arch
To unsubscribe, send any mail to "freebsd-arch-unsubscribe@xxxxxxxxxxx"
- References:
- Re: Linux compatible setaffinity.
- From: Jeff Roberson
- Re: Linux compatible setaffinity.
- From: Robert Watson
- Re: Linux compatible setaffinity.
- From: Jeff Roberson
- Re: Linux compatible setaffinity.
- From: Robert Watson
- Re: Linux compatible setaffinity.
- From: David Xu
- Re: Linux compatible setaffinity.
- From: Jeff Roberson
- getaffinity/setaffinity and cpu sets.
- From: Jeff Roberson
- Re: getaffinity/setaffinity and cpu sets.
- From: Robert Watson
- Re: getaffinity/setaffinity and cpu sets.
- From: Jeff Roberson
- Re: getaffinity/setaffinity and cpu sets.
- From: Daniel Eischen
- Re: Linux compatible setaffinity.
- Prev by Date: Re: getaffinity/setaffinity and cpu sets.
- Next by Date: Re: getaffinity/setaffinity and cpu sets.
- Previous by thread: Re: getaffinity/setaffinity and cpu sets.
- Next by thread: Re: getaffinity/setaffinity and cpu sets.
- Index(es):
Relevant Pages
|