xref: /freebsd/lib/libthr/thread/thr_affinity.c (revision d54a7d337331d991e039e4f42f6b4dc64aedce08)
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 <sys/cdefs.h>
30  __FBSDID("$FreeBSD$");
31  
32  #include "namespace.h"
33  #include <pthread_np.h>
34  #include <sys/param.h>
35  #include <sys/cpuset.h>
36  #include "un-namespace.h"
37  
38  #include "thr_private.h"
39  
40  __weak_reference(_pthread_getaffinity_np, pthread_getaffinity_np);
41  __weak_reference(_pthread_setaffinity_np, pthread_setaffinity_np);
42  
43  int
44  _pthread_setaffinity_np(pthread_t td, size_t cpusetsize, const cpuset_t *cpusetp)
45  {
46  	struct pthread	*curthread = _get_curthread();
47  	lwpid_t		tid;
48  	int		error;
49  
50  	if (td == curthread) {
51  		error = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
52  			-1, cpusetsize, cpusetp);
53  		if (error == -1)
54  			error = errno;
55  	} else if ((error = _thr_find_thread(curthread, td, 0)) == 0) {
56  		tid = TID(td);
57  		error = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, tid,
58  			cpusetsize, cpusetp);
59  		if (error == -1)
60  			error = errno;
61  		THR_THREAD_UNLOCK(curthread, td);
62  	}
63  	return (error);
64  }
65  
66  int
67  _pthread_getaffinity_np(pthread_t td, size_t cpusetsize, cpuset_t *cpusetp)
68  {
69  	struct pthread	*curthread = _get_curthread();
70  	lwpid_t tid;
71  	int error;
72  
73  	if (td == curthread) {
74  		error = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
75  			-1, cpusetsize, cpusetp);
76  		if (error == -1)
77  			error = errno;
78  	} else if ((error = _thr_find_thread(curthread, td, 0)) == 0) {
79  		tid = TID(td);
80  		error = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, tid,
81  			    cpusetsize, cpusetp);
82  		if (error == -1)
83  			error = errno;
84  		THR_THREAD_UNLOCK(curthread, td);
85  	}
86  	return (error);
87  }
88