]> git.proxmox.com Git - mirror_lxcfs.git/blame - src/bindings.h
cpuview: paththrough personality when reading cpuinfo
[mirror_lxcfs.git] / src / bindings.h
CommitLineData
db0463bf 1/* SPDX-License-Identifier: LGPL-2.1+ */
1f5596dd 2
3b5a3233
CB
3#ifndef __LXCFS_BINDINGS_H
4#define __LXCFS_BINDINGS_H
5
2c6e12b7 6#include "config.h"
1f5596dd 7
285aea40 8#include <linux/types.h>
dee86006 9#include <signal.h>
2aa59b2e 10#include <stdbool.h>
1f5596dd
CB
11#include <stdio.h>
12#include <stdlib.h>
13#include <sys/stat.h>
14#include <sys/types.h>
15#include <unistd.h>
16
bb4e3c8f 17#include "lxcfs_fuse.h"
0a5da718 18
2aa59b2e 19#include "cgroup_fuse.h"
17e0e368 20#include "macro.h"
1f5596dd
CB
21#include "proc_cpuview.h"
22#include "proc_fuse.h"
23#include "proc_loadavg.h"
71f17cd2 24#include "sysfs_fuse.h"
17e0e368 25
237e200e 26/* directory under which we mount the controllers - /run/lxcfs/controllers */
cc97d34c 27#define BASEDIR RUNTIME_PATH "/lxcfs/controllers"
8cb31294 28#define ROOTDIR RUNTIME_PATH "/lxcfs/root"
237e200e 29
71f17cd2
YB
30/* Maximum number for 64 bit integer is a string with 21 digits: 2^64 - 1 = 21 */
31#define LXCFS_NUMSTRLEN64 21
32
71f17cd2
YB
33enum lxcfs_virt_t {
34 LXC_TYPE_CGDIR,
35 LXC_TYPE_CGFILE,
cbfc55fd 36
71f17cd2 37 LXC_TYPE_PROC_MEMINFO,
cbfc55fd
CB
38#define LXC_TYPE_PROC_MEMINFO_PATH "/proc/meminfo"
39
71f17cd2 40 LXC_TYPE_PROC_CPUINFO,
cbfc55fd
CB
41#define LXC_TYPE_PROC_CPUINFO_PATH "/proc/cpuinfo"
42
71f17cd2 43 LXC_TYPE_PROC_UPTIME,
cbfc55fd
CB
44#define LXC_TYPE_PROC_UPTIME_PATH "/proc/uptime"
45
71f17cd2 46 LXC_TYPE_PROC_STAT,
cbfc55fd
CB
47#define LXC_TYPE_PROC_STAT_PATH "/proc/stat"
48
71f17cd2 49 LXC_TYPE_PROC_DISKSTATS,
cbfc55fd
CB
50#define LXC_TYPE_PROC_DISKSTATS_PATH "/proc/diskstats"
51
71f17cd2 52 LXC_TYPE_PROC_SWAPS,
cbfc55fd
CB
53#define LXC_TYPE_PROC_SWAPS_PATH "/proc/swaps"
54
71f17cd2 55 LXC_TYPE_PROC_LOADAVG,
cbfc55fd
CB
56#define LXC_TYPE_PROC_LOADAVG_PATH "/proc/loadavg"
57
6cc153e6
FS
58 LXC_TYPE_PROC_SLABINFO,
59#define LXC_TYPE_PROC_SLABINFO_PATH "/proc/slabinfo"
60
26b717d0 61 LXC_TYPE_SYS,
71f17cd2
YB
62 LXC_TYPE_SYS_DEVICES,
63 LXC_TYPE_SYS_DEVICES_SYSTEM,
64 LXC_TYPE_SYS_DEVICES_SYSTEM_CPU,
26b717d0
ZL
65 LXC_TYPE_SYS_DEVICES_SYSTEM_CPU_SUBDIR,
66 LXC_TYPE_SYS_DEVICES_SYSTEM_CPU_SUBFILE,
cbfc55fd 67
71f17cd2 68 LXC_TYPE_SYS_DEVICES_SYSTEM_CPU_ONLINE,
cbfc55fd 69#define LXC_TYPE_SYS_DEVICES_SYSTEM_CPU_ONLINE_PATH "/sys/devices/system/cpu/online"
71f17cd2
YB
70};
71
72struct file_info {
73 char *controller;
74 char *cgroup;
75 char *file;
76 int type;
99b183fb 77 char *buf; /* unused */
71f17cd2 78 int buflen;
99b183fb 79 int size; /*actual data size */
71f17cd2
YB
80 int cached;
81};
82
7e60aa1b 83struct lxcfs_opts {
84 bool swap_off;
2aa59b2e 85 bool use_pidfd;
0274438c 86 bool use_cfs;
285aea40
CB
87 /*
88 * Ideally we'd version by size but because of backwards compatability
89 * and the use of bool instead of explicited __u32 and __u64 we can't.
90 */
91 __u32 version;
7e60aa1b 92};
93
84e184b1
CB
94typedef enum lxcfs_opt_t {
95 LXCFS_SWAP_ON = 0,
96 LXCFS_PIDFD_ON = 1,
97 LXCFS_CFS_ON = 2,
98 LXCFS_OPTS_MAX = LXCFS_CFS_ON,
99} lxcfs_opt_t;
100
101
71f17cd2 102extern pid_t lookup_initpid_in_store(pid_t qpid);
71f17cd2 103extern void prune_init_slice(char *cg);
2aa59b2e 104extern bool supports_pidfd(void);
cbfc55fd 105extern bool liblxcfs_functional(void);
c6805016 106extern bool liblxcfs_can_use_swap(void);
50f7faee 107extern bool liblxcfs_memory_is_cgroupv2(void);
285aea40
CB
108extern bool liblxcfs_can_use_sys_cpu(void);
109extern bool liblxcfs_has_versioned_opts(void);
096972f7 110extern __u32 liblxcfs_personality(void);
71f17cd2 111
84e184b1
CB
112static inline bool lxcfs_has_opt(struct lxcfs_opts *opts, lxcfs_opt_t opt)
113{
114 if (!opts)
115 return false;
116
117 if (opt > LXCFS_OPTS_MAX)
118 return false;
119
120 switch (opt) {
121 case LXCFS_SWAP_ON:
122 if (!opts->swap_off)
123 return liblxcfs_can_use_swap();
124 return false;
125 case LXCFS_PIDFD_ON:
126 return opts->use_pidfd;
127 case LXCFS_CFS_ON:
128 return opts->use_cfs;
129 }
130
131 return false;
132}
133
dee86006
CB
134static inline int install_signal_handler(int signo,
135 void (*handler)(int, siginfo_t *, void *))
136{
137 struct sigaction action = {
138 .sa_flags = SA_SIGINFO,
139 .sa_sigaction = handler,
140 };
141
142 return sigaction(signo, &action, NULL);
143}
144
1bdeec69
CB
145extern pid_t lxcfs_raw_clone(unsigned long flags, int *pidfd);
146
147static inline pid_t lxcfs_clone(int (*fn)(void *), void *arg, int flags)
148{
149 pid_t pid;
150
151 pid = lxcfs_raw_clone(flags, NULL);
152 if (pid < 0)
153 return -1;
154
155 if (pid == 0)
156 _exit(fn(arg));
157
158 return pid;
159}
6abff455 160
0d5383b7 161__visible extern void *lxcfs_fuse_init(struct fuse_conn_info *conn, void *data);
285aea40 162
17e0e368 163#endif /* __LXCFS_BINDINGS_H */