Skip to content

Commit 43f1f6c

Browse files
committed
deduplicate constant definitions
Change the linux{major}_{minor} files that contain handwritten bindings for constants that bindgen doesnt understand to be "incremental" (e.g. linux4_14 only contains constants that are new to 4_14 and just reexports the 4_11 constants for old ones), to avoid redefining an ever increasing set of constants with each version. Also adjust the test that checks the api features and available ioctl constants to only verify that the rust-defined set of features is a subset of the kernel available features. For example running the test on a 6.8 host kernel with the 5.7 feature means the kernel has more features than the uffd crate supports, but this does not mean that the crate definitions are _wrong_, just that they are incomplete. Signed-off-by: Patrick Roy <[email protected]>
1 parent 0975fe4 commit 43f1f6c

File tree

5 files changed

+60
-204
lines changed

5 files changed

+60
-204
lines changed

userfaultfd-sys/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@ cc = "1.0"
1919
[features]
2020
default = []
2121
linux4_14 = []
22-
linux5_7 = []
22+
linux5_7 = ["linux4_14"]

userfaultfd-sys/src/lib.rs

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,52 @@
99

1010
use cfg_if::cfg_if;
1111

12+
mod linux4_11;
13+
#[cfg(feature = "linux4_14")]
14+
mod linux4_14;
15+
#[cfg(feature = "linux5_7")]
16+
mod linux5_7;
17+
1218
cfg_if! {
1319
if #[cfg(feature = "linux5_7")] {
14-
mod linux5_7;
1520
pub use crate::linux5_7::*;
16-
}
17-
else if #[cfg(feature = "linux4_14")] {
18-
mod linux4_14;
21+
} else if #[cfg(feature = "linux4_14")] {
1922
pub use crate::linux4_14::*;
2023
} else {
21-
mod linux4_11;
2224
pub use crate::linux4_11::*;
2325
}
2426
}
2527

2628
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
29+
30+
#[cfg(test)]
31+
mod const_tests {
32+
use super::*;
33+
34+
extern "C" {
35+
static _const_UFFD_API_FEATURES: u64;
36+
static _const_UFFD_API_RANGE_IOCTLS: u64;
37+
static _const_UFFD_API_RANGE_IOCTLS_BASIC: u64;
38+
}
39+
40+
#[test]
41+
fn consts_correct() {
42+
unsafe {
43+
assert_eq!(
44+
UFFD_API_FEATURES & _const_UFFD_API_FEATURES,
45+
UFFD_API_FEATURES,
46+
"UFFD_API_FEATURES"
47+
);
48+
assert_eq!(
49+
UFFD_API_RANGE_IOCTLS & _const_UFFD_API_RANGE_IOCTLS,
50+
UFFD_API_RANGE_IOCTLS,
51+
"UFFD_API_RANGE_IOCTLS"
52+
);
53+
assert_eq!(
54+
UFFD_API_RANGE_IOCTLS_BASIC & _const_UFFD_API_RANGE_IOCTLS_BASIC,
55+
UFFD_API_RANGE_IOCTLS_BASIC,
56+
"UFFD_API_RANGE_IOCTLS_BASIC"
57+
);
58+
}
59+
}
60+
}

userfaultfd-sys/src/linux4_11.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub const UFFD_API_FEATURES: u64 = UFFD_FEATURE_EVENT_FORK
1414
pub const UFFD_API_IOCTLS: u64 = 1 << _UFFDIO_REGISTER | 1 << _UFFDIO_UNREGISTER | 1 << _UFFDIO_API;
1515
pub const UFFD_API_RANGE_IOCTLS: u64 =
1616
1 << _UFFDIO_WAKE | 1 << _UFFDIO_COPY | 1 << _UFFDIO_ZEROPAGE;
17+
pub const UFFD_API_RANGE_IOCTLS_BASIC: u64 = 0;
1718

1819
pub const UFFDIO_REGISTER_MODE_MISSING: u64 = 1 << 0;
1920
pub const UFFDIO_REGISTER_MODE_WP: u64 = 1 << 1;
@@ -36,7 +37,6 @@ mod const_tests {
3637

3738
extern "C" {
3839
static _const_UFFD_API: u64;
39-
static _const_UFFD_API_FEATURES: u64;
4040
static _const_UFFD_API_IOCTLS: u64;
4141
static _const_UFFD_API_RANGE_IOCTLS: u64;
4242
static _const_UFFDIO_REGISTER_MODE_MISSING: u64;
@@ -56,15 +56,7 @@ mod const_tests {
5656
fn consts_correct() {
5757
unsafe {
5858
assert_eq!(UFFD_API, _const_UFFD_API, "UFFD_API");
59-
assert_eq!(
60-
UFFD_API_FEATURES, _const_UFFD_API_FEATURES,
61-
"UFFD_API_FEATURES"
62-
);
6359
assert_eq!(UFFD_API_IOCTLS, _const_UFFD_API_IOCTLS, "UFFD_API_IOCTLS");
64-
assert_eq!(
65-
UFFD_API_RANGE_IOCTLS, _const_UFFD_API_RANGE_IOCTLS,
66-
"UFFD_API_RANGE_IOCTLS"
67-
);
6860
assert_eq!(
6961
UFFDIO_REGISTER_MODE_MISSING, _const_UFFDIO_REGISTER_MODE_MISSING,
7062
"UFFDIO_REGISTER_MODE_MISSING"

userfaultfd-sys/src/linux4_14.rs

Lines changed: 11 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,16 @@
11
use super::*;
22

3+
pub use linux4_11::{
4+
UFFDIO_API, UFFDIO_COPY, UFFDIO_COPY_MODE_DONTWAKE, UFFDIO_COPY_MODE_WP, UFFDIO_REGISTER,
5+
UFFDIO_REGISTER_MODE_MISSING, UFFDIO_REGISTER_MODE_WP, UFFDIO_UNREGISTER, UFFDIO_WAKE,
6+
UFFDIO_ZEROPAGE, UFFDIO_ZEROPAGE_MODE_DONTWAKE, UFFD_API, UFFD_API_IOCTLS,
7+
UFFD_API_RANGE_IOCTLS,
8+
};
9+
310
// The following are preprocessor constants that bindgen can't figure out, so we enter them manually
411
// from <linux/userfaultfd.h>, and have tests to make sure they're accurate.
512

6-
pub const UFFD_API: u64 = 0xAA;
7-
8-
pub const UFFD_API_FEATURES: u64 = UFFD_FEATURE_EVENT_FORK
9-
| UFFD_FEATURE_EVENT_REMAP
10-
| UFFD_FEATURE_EVENT_REMOVE
11-
| UFFD_FEATURE_EVENT_UNMAP
12-
| UFFD_FEATURE_MISSING_HUGETLBFS
13-
| UFFD_FEATURE_MISSING_SHMEM
14-
| UFFD_FEATURE_SIGBUS
15-
| UFFD_FEATURE_THREAD_ID;
16-
pub const UFFD_API_IOCTLS: u64 = 1 << _UFFDIO_REGISTER | 1 << _UFFDIO_UNREGISTER | 1 << _UFFDIO_API;
17-
pub const UFFD_API_RANGE_IOCTLS: u64 =
18-
1 << _UFFDIO_WAKE | 1 << _UFFDIO_COPY | 1 << _UFFDIO_ZEROPAGE;
19-
pub const UFFD_API_RANGE_IOCTLS_BASIC: u64 = 1 << _UFFDIO_WAKE | 1 << _UFFDIO_COPY;
20-
21-
pub const UFFDIO_REGISTER_MODE_MISSING: u64 = 1 << 0;
22-
pub const UFFDIO_REGISTER_MODE_WP: u64 = 1 << 1;
23-
24-
pub const UFFDIO_COPY_MODE_DONTWAKE: u64 = 1 << 0;
25-
pub const UFFDIO_COPY_MODE_WP: u64 = 1 << 1;
26-
27-
pub const UFFDIO_ZEROPAGE_MODE_DONTWAKE: u64 = 1 << 0;
28-
29-
pub const UFFDIO_API: u32 = 0xc018aa3f;
30-
pub const UFFDIO_REGISTER: u32 = 0xc020aa00;
31-
pub const UFFDIO_UNREGISTER: u32 = 0x8010aa01;
32-
pub const UFFDIO_WAKE: u32 = 0x8010aa02;
33-
pub const UFFDIO_COPY: u32 = 0xc028aa03;
34-
pub const UFFDIO_ZEROPAGE: u32 = 0xc020aa04;
35-
36-
#[cfg(test)]
37-
mod const_tests {
38-
use super::*;
39-
40-
extern "C" {
41-
static _const_UFFD_API: u64;
42-
static _const_UFFD_API_FEATURES: u64;
43-
static _const_UFFD_API_IOCTLS: u64;
44-
static _const_UFFD_API_RANGE_IOCTLS: u64;
45-
static _const_UFFD_API_RANGE_IOCTLS_BASIC: u64;
46-
static _const_UFFDIO_REGISTER_MODE_MISSING: u64;
47-
static _const_UFFDIO_REGISTER_MODE_WP: u64;
48-
static _const_UFFDIO_COPY_MODE_DONTWAKE: u64;
49-
static _const_UFFDIO_COPY_MODE_WP: u64;
50-
static _const_UFFDIO_ZEROPAGE_MODE_DONTWAKE: u64;
51-
static _const_UFFDIO_API: u32;
52-
static _const_UFFDIO_REGISTER: u32;
53-
static _const_UFFDIO_UNREGISTER: u32;
54-
static _const_UFFDIO_WAKE: u32;
55-
static _const_UFFDIO_COPY: u32;
56-
static _const_UFFDIO_ZEROPAGE: u32;
57-
}
58-
59-
#[test]
60-
fn consts_correct() {
61-
unsafe {
62-
assert_eq!(UFFD_API, _const_UFFD_API, "UFFD_API");
63-
assert_eq!(
64-
UFFD_API_FEATURES, _const_UFFD_API_FEATURES,
65-
"UFFD_API_FEATURES"
66-
);
67-
assert_eq!(UFFD_API_IOCTLS, _const_UFFD_API_IOCTLS, "UFFD_API_IOCTLS");
68-
assert_eq!(
69-
UFFD_API_RANGE_IOCTLS, _const_UFFD_API_RANGE_IOCTLS,
70-
"UFFD_API_RANGE_IOCTLS"
71-
);
72-
assert_eq!(
73-
UFFD_API_RANGE_IOCTLS_BASIC, _const_UFFD_API_RANGE_IOCTLS_BASIC,
74-
"UFFD_API_RANGE_IOCTLS_BASIC"
75-
);
76-
assert_eq!(
77-
UFFDIO_REGISTER_MODE_MISSING, _const_UFFDIO_REGISTER_MODE_MISSING,
78-
"UFFDIO_REGISTER_MODE_MISSING"
79-
);
80-
assert_eq!(
81-
UFFDIO_REGISTER_MODE_WP, _const_UFFDIO_REGISTER_MODE_WP,
82-
"UFFDIO_REGISTER_MODE_WP"
83-
);
84-
assert_eq!(
85-
UFFDIO_COPY_MODE_DONTWAKE, _const_UFFDIO_COPY_MODE_DONTWAKE,
86-
"UFFDIO_COPY_MODE_DONTWAKE"
87-
);
88-
assert_eq!(
89-
UFFDIO_COPY_MODE_WP, _const_UFFDIO_COPY_MODE_WP,
90-
"UFFDIO_COPY_MODE_WP"
91-
);
92-
assert_eq!(
93-
UFFDIO_ZEROPAGE_MODE_DONTWAKE, _const_UFFDIO_ZEROPAGE_MODE_DONTWAKE,
94-
"UFFDIO_ZEROPAGE_MODE_DONTWAKE"
95-
);
96-
assert_eq!(UFFDIO_API, _const_UFFDIO_API, "UFFDIO_API");
97-
assert_eq!(UFFDIO_REGISTER, _const_UFFDIO_REGISTER, "UFFDIO_REGISTER");
98-
assert_eq!(
99-
UFFDIO_UNREGISTER, _const_UFFDIO_UNREGISTER,
100-
"UFFDIO_UNREGISTER"
101-
);
102-
assert_eq!(UFFDIO_WAKE, _const_UFFDIO_WAKE, "UFFDIO_WAKE");
103-
assert_eq!(UFFDIO_COPY, _const_UFFDIO_COPY, "UFFDIO_COPY");
104-
assert_eq!(UFFDIO_ZEROPAGE, _const_UFFDIO_ZEROPAGE, "UFFDIO_ZEROPAGE");
105-
}
106-
}
107-
}
13+
pub const UFFD_API_FEATURES: u64 =
14+
linux4_11::UFFD_API_FEATURES | UFFD_FEATURE_SIGBUS | UFFD_FEATURE_THREAD_ID;
15+
pub const UFFD_API_RANGE_IOCTLS_BASIC: u64 =
16+
linux4_11::UFFD_API_RANGE_IOCTLS_BASIC | 1 << _UFFDIO_WAKE | 1 << _UFFDIO_COPY;

userfaultfd-sys/src/linux5_7.rs

Lines changed: 8 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,105 +1,35 @@
11
use super::*;
22

3+
pub use linux4_14::{
4+
UFFDIO_API, UFFDIO_COPY, UFFDIO_COPY_MODE_DONTWAKE, UFFDIO_COPY_MODE_WP, UFFDIO_REGISTER,
5+
UFFDIO_REGISTER_MODE_MISSING, UFFDIO_REGISTER_MODE_WP, UFFDIO_UNREGISTER, UFFDIO_WAKE,
6+
UFFDIO_ZEROPAGE, UFFDIO_ZEROPAGE_MODE_DONTWAKE, UFFD_API, UFFD_API_FEATURES, UFFD_API_IOCTLS,
7+
UFFD_API_RANGE_IOCTLS_BASIC,
8+
};
9+
310
// The following are preprocessor constants that bindgen can't figure out, so we enter them manually
411
// from <linux/userfaultfd.h>, and have tests to make sure they're accurate.
512

6-
pub const UFFD_API: u64 = 0xAA;
7-
8-
pub const UFFD_API_FEATURES: u64 = UFFD_FEATURE_PAGEFAULT_FLAG_WP
9-
| UFFD_FEATURE_EVENT_FORK
10-
| UFFD_FEATURE_EVENT_REMAP
11-
| UFFD_FEATURE_EVENT_REMOVE
12-
| UFFD_FEATURE_EVENT_UNMAP
13-
| UFFD_FEATURE_MISSING_HUGETLBFS
14-
| UFFD_FEATURE_MISSING_SHMEM
15-
| UFFD_FEATURE_SIGBUS
16-
| UFFD_FEATURE_THREAD_ID;
17-
pub const UFFD_API_IOCTLS: u64 = 1 << _UFFDIO_REGISTER | 1 << _UFFDIO_UNREGISTER | 1 << _UFFDIO_API;
18-
19-
pub const UFFD_API_RANGE_IOCTLS: u64 =
20-
1 << _UFFDIO_WAKE | 1 << _UFFDIO_COPY | 1 << _UFFDIO_ZEROPAGE | 1 << _UFFDIO_WRITEPROTECT;
13+
pub const UFFD_API_RANGE_IOCTLS: u64 = linux4_14::UFFD_API_RANGE_IOCTLS | 1 << _UFFDIO_WRITEPROTECT;
2114

22-
pub const UFFD_API_RANGE_IOCTLS_BASIC: u64 = 1 << _UFFDIO_WAKE | 1 << _UFFDIO_COPY;
23-
24-
pub const UFFDIO_REGISTER_MODE_MISSING: u64 = 1 << 0;
25-
pub const UFFDIO_REGISTER_MODE_WP: u64 = 1 << 1;
26-
pub const UFFDIO_COPY_MODE_DONTWAKE: u64 = 1 << 0;
27-
pub const UFFDIO_COPY_MODE_WP: u64 = 1 << 1;
28-
pub const UFFDIO_ZEROPAGE_MODE_DONTWAKE: u64 = 1 << 0;
2915
pub const UFFDIO_WRITEPROTECT_MODE_WP: u64 = 1 << 0;
3016
pub const UFFDIO_WRITEPROTECT_MODE_DONTWAKE: u64 = 1 << 1;
3117

32-
pub const UFFDIO_API: u32 = 0xc018aa3f;
33-
pub const UFFDIO_REGISTER: u32 = 0xc020aa00;
34-
pub const UFFDIO_UNREGISTER: u32 = 0x8010aa01;
35-
pub const UFFDIO_WAKE: u32 = 0x8010aa02;
36-
pub const UFFDIO_COPY: u32 = 0xc028aa03;
37-
pub const UFFDIO_ZEROPAGE: u32 = 0xc020aa04;
3818
pub const UFFDIO_WRITEPROTECT: u32 = 0xc018aa06;
3919

4020
#[cfg(test)]
4121
mod const_tests {
4222
use super::*;
4323

4424
extern "C" {
45-
static _const_UFFD_API: u64;
46-
static _const_UFFD_API_FEATURES: u64;
47-
static _const_UFFD_API_IOCTLS: u64;
48-
static _const_UFFD_API_RANGE_IOCTLS: u64;
49-
static _const_UFFD_API_RANGE_IOCTLS_BASIC: u64;
50-
static _const_UFFDIO_REGISTER_MODE_MISSING: u64;
51-
static _const_UFFDIO_REGISTER_MODE_WP: u64;
52-
static _const_UFFDIO_COPY_MODE_DONTWAKE: u64;
53-
static _const_UFFDIO_COPY_MODE_WP: u64;
54-
static _const_UFFDIO_ZEROPAGE_MODE_DONTWAKE: u64;
5525
static _const_UFFDIO_WRITEPROTECT_MODE_WP: u64;
5626
static _const_UFFDIO_WRITEPROTECT_MODE_DONTWAKE: u64;
57-
static _const_UFFDIO_API: u32;
58-
static _const_UFFDIO_REGISTER: u32;
59-
static _const_UFFDIO_UNREGISTER: u32;
60-
static _const_UFFDIO_WAKE: u32;
61-
static _const_UFFDIO_COPY: u32;
62-
static _const_UFFDIO_ZEROPAGE: u32;
6327
static _const_UFFDIO_WRITEPROTECT: u32;
6428
}
6529

6630
#[test]
6731
fn consts_correct() {
6832
unsafe {
69-
assert_eq!(UFFD_API, _const_UFFD_API, "UFFD_API");
70-
assert_eq!(
71-
UFFD_API_FEATURES, _const_UFFD_API_FEATURES,
72-
"UFFD_API_FEATURES"
73-
);
74-
assert_eq!(UFFD_API_IOCTLS, _const_UFFD_API_IOCTLS, "UFFD_API_IOCTLS");
75-
assert_eq!(
76-
UFFD_API_RANGE_IOCTLS, _const_UFFD_API_RANGE_IOCTLS,
77-
"UFFD_API_RANGE_IOCTLS"
78-
);
79-
assert_eq!(
80-
UFFD_API_RANGE_IOCTLS_BASIC, _const_UFFD_API_RANGE_IOCTLS_BASIC,
81-
"UFFD_API_RANGE_IOCTLS_BASIC"
82-
);
83-
assert_eq!(
84-
UFFDIO_REGISTER_MODE_MISSING, _const_UFFDIO_REGISTER_MODE_MISSING,
85-
"UFFDIO_REGISTER_MODE_MISSING"
86-
);
87-
assert_eq!(
88-
UFFDIO_REGISTER_MODE_WP, _const_UFFDIO_REGISTER_MODE_WP,
89-
"UFFDIO_REGISTER_MODE_WP"
90-
);
91-
assert_eq!(
92-
UFFDIO_COPY_MODE_DONTWAKE, _const_UFFDIO_COPY_MODE_DONTWAKE,
93-
"UFFDIO_COPY_MODE_DONTWAKE"
94-
);
95-
assert_eq!(
96-
UFFDIO_COPY_MODE_WP, _const_UFFDIO_COPY_MODE_WP,
97-
"UFFDIO_COPY_MODE_WP"
98-
);
99-
assert_eq!(
100-
UFFDIO_ZEROPAGE_MODE_DONTWAKE, _const_UFFDIO_ZEROPAGE_MODE_DONTWAKE,
101-
"UFFDIO_ZEROPAGE_MODE_DONTWAKE"
102-
);
10333
assert_eq!(
10434
UFFDIO_WRITEPROTECT_MODE_WP, _const_UFFDIO_WRITEPROTECT_MODE_WP,
10535
"UFFDIO_WRITEPROTECT_MODE_WP"
@@ -108,15 +38,6 @@ mod const_tests {
10838
UFFDIO_WRITEPROTECT_MODE_DONTWAKE, _const_UFFDIO_WRITEPROTECT_MODE_DONTWAKE,
10939
"UFFDIO_WRITEPROTECT_MODE_DONTWAKE"
11040
);
111-
assert_eq!(UFFDIO_API, _const_UFFDIO_API, "UFFDIO_API");
112-
assert_eq!(UFFDIO_REGISTER, _const_UFFDIO_REGISTER, "UFFDIO_REGISTER");
113-
assert_eq!(
114-
UFFDIO_UNREGISTER, _const_UFFDIO_UNREGISTER,
115-
"UFFDIO_UNREGISTER"
116-
);
117-
assert_eq!(UFFDIO_WAKE, _const_UFFDIO_WAKE, "UFFDIO_WAKE");
118-
assert_eq!(UFFDIO_COPY, _const_UFFDIO_COPY, "UFFDIO_COPY");
119-
assert_eq!(UFFDIO_ZEROPAGE, _const_UFFDIO_ZEROPAGE, "UFFDIO_ZEROPAGE");
12041
assert_eq!(
12142
UFFDIO_WRITEPROTECT, _const_UFFDIO_WRITEPROTECT,
12243
"UFFDIO_WRITEPROTECT"

0 commit comments

Comments
 (0)