xref: /freebsd/lib/libthr/thread/thr_affinity.c (revision a2fda816eb054d5873be223ef2461741dfcc253c)
1  /*-
2   * SPDX-License-Identifier: BSD-2-Clause
3   *
4   * Copyright (c) 2008, David Xu <davidxu@freebsd.org>
5   * All rights reserved.
6   *
7   * Redistribution and use in source and binary forms, with or without
8   * modification, are permitted provided that the following conditions
9   * are met:
10   * 1. Redistributions of source code must retain the above copyright
11   *    notice unmodified, this list of conditions, and the following
12   *    disclaimer.
13   * 2. Redistributions in binary form must reproduce the above copyright
14   *    notice, this list of conditions and the following disclaimer in the
15   *    documentation and/or other materials provided with the distribution.
16   *
17   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20   * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27   */
28  
29  #include "namespace.h"
30  #include <pthread_np.h>
31  #include <sys/param.h>
32  #include <sys/cpuset.h>
33  #include "un-namespace.h"
34  
35  #include "thr_private.h"
36  
37  __weak_reference(_pthread_getaffinity_np, pthread_getaffinity_np);
38  __weak_reference(_pthread_setaffinity_np, pthread_setaffinity_np);
39  
40  int
41  _pthread_setaffinity_np(pthread_t td, size_t cpusetsize, const cpuset_t *cpusetp)
42  {
43  	struct pthread	*curthread = _get_curthread();
44  	lwpid_t		tid;
45  	int		error;
46  
47  	if (td == curthread) {
48  		error = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
49  			-1, cpusetsize, cpusetp);
50  		if (error == -1)
51  			error = errno;
52  	} else if ((error = _thr_find_thread(curthread, td, 0)) == 0) {
53  		tid = TID(td);
54  		error = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, tid,
55  			cpusetsize, cpusetp);
56  		if (error == -1)
57  			error = errno;
58  		THR_THREAD_UNLOCK(curthread, td);
59  	}
60  	return (error);
61  }
62  
63  int
64  _pthread_getaffinity_np(pthread_t td, size_t cpusetsize, cpuset_t *cpusetp)
65  {
66  	struct pthread	*curthread = _get_curthread();
67  	lwpid_t tid;
68  	int error;
69  
70  	if (td == curthread) {
71  		error = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
72  			-1, cpusetsize, cpusetp);
73  		if (error == -1)
74  			error = errno;
75  	} else if ((error = _thr_find_thread(curthread, td, 0)) == 0) {
76  		tid = TID(td);
77  		error = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, tid,
78  			    cpusetsize, cpusetp);
79  		if (error == -1)
80  			error = errno;
81  		THR_THREAD_UNLOCK(curthread, td);
82  	}
83  	return (error);
84  }
85