system: Add swap flags.
* gnu/system/file-systems.scm (swap-space)[priority, discard?]: Add them. * guix/build/syscalls.scm (SWAP_FLAG_PREFER, SWAP_FLAG_PRIO_MASK, SWAP_FLAG_PRIO_SHIFT, SWAP_FLAG_DISCARD): Add them. * gnu/build/file-systems.scm (swap-space->flags-bit-mask): Add it. * gnu/services/base.scm (swap-service-type): Use it. Signed-off-by: Ludovic Courtès <ludo@gnu.org>master
parent
f574dbd163
commit
0831dfab75
|
@ -29,6 +29,8 @@
|
|||
#:use-module (guix build bournish)
|
||||
#:use-module ((guix build syscalls)
|
||||
#:hide (file-system-type))
|
||||
#:use-module (guix diagnostics)
|
||||
#:use-module (guix i18n)
|
||||
#:use-module (rnrs io ports)
|
||||
#:use-module (rnrs bytevectors)
|
||||
#:use-module (ice-9 match)
|
||||
|
@ -54,7 +56,9 @@
|
|||
|
||||
mount-flags->bit-mask
|
||||
check-file-system
|
||||
mount-file-system))
|
||||
mount-file-system
|
||||
|
||||
swap-space->flags-bit-mask))
|
||||
|
||||
;;; Commentary:
|
||||
;;;
|
||||
|
@ -227,6 +231,36 @@ if DEVICE does not contain an linux-swap file system."
|
|||
"Return the label of Linux-swap superblock SBLOCK as a string."
|
||||
(null-terminated-latin1->string
|
||||
(sub-bytevector sblock (+ 1024 4 4 4 16) 16)))
|
||||
|
||||
(define (swap-space->flags-bit-mask swap)
|
||||
"Return the number suitable for the 'flags' argument of 'mount'
|
||||
that corresponds to the swap-space SWAP."
|
||||
(define prio-flag
|
||||
(let ((p (swap-space-priority swap))
|
||||
(max (ash SWAP_FLAG_PRIO_MASK (- SWAP_FLAG_PRIO_SHIFT))))
|
||||
(if p
|
||||
(logior SWAP_FLAG_PREFER
|
||||
(ash (cond
|
||||
((< p 0)
|
||||
(begin (warning
|
||||
(G_ "Given swap priority ~a is
|
||||
negative, defaulting to 0.~%") p)
|
||||
0))
|
||||
((> p max)
|
||||
(begin (warning
|
||||
(G_ "Limiting swap priority ~a to
|
||||
~a.~%")
|
||||
p max)
|
||||
max))
|
||||
(else p))
|
||||
SWAP_FLAG_PRIO_SHIFT))
|
||||
0)))
|
||||
(define delayed-flag
|
||||
(if (swap-space-discard? swap)
|
||||
SWAP_FLAG_DISCARD
|
||||
0))
|
||||
(logior prio-flag delayed-flag))
|
||||
|
||||
|
||||
|
||||
;;;
|
||||
|
|
|
@ -58,7 +58,8 @@
|
|||
#:use-module (gnu packages linux)
|
||||
#:use-module (gnu packages terminals)
|
||||
#:use-module ((gnu build file-systems)
|
||||
#:select (mount-flags->bit-mask))
|
||||
#:select (mount-flags->bit-mask
|
||||
swap-space->flags-bit-mask))
|
||||
#:use-module (guix gexp)
|
||||
#:use-module (guix records)
|
||||
#:use-module (guix modules)
|
||||
|
@ -2223,7 +2224,9 @@ instance."
|
|||
(let ((device #$device-lookup))
|
||||
(and device
|
||||
(begin
|
||||
(restart-on-EINTR (swapon device))
|
||||
(restart-on-EINTR (swapon device
|
||||
#$(swap-space->flags-bit-mask
|
||||
swap)))
|
||||
#t)))))
|
||||
(stop #~(lambda _
|
||||
(let ((device #$device-lookup))
|
||||
|
|
|
@ -102,7 +102,9 @@
|
|||
swap-space
|
||||
swap-space?
|
||||
swap-space-target
|
||||
swap-space-dependencies))
|
||||
swap-space-dependencies
|
||||
swap-space-priority
|
||||
swap-space-discard?))
|
||||
|
||||
;;; Commentary:
|
||||
;;;
|
||||
|
@ -726,6 +728,10 @@ subvolume name is unknown."))
|
|||
this-swap-space
|
||||
(target swap-space-target)
|
||||
(dependencies swap-space-dependencies
|
||||
(default '())))
|
||||
(default '()))
|
||||
(priority swap-space-priority
|
||||
(default #f))
|
||||
(discard? swap-space-discard?
|
||||
(default #f)))
|
||||
|
||||
;;; file-systems.scm ends here
|
||||
|
|
|
@ -71,6 +71,11 @@
|
|||
mounts
|
||||
mount-points
|
||||
|
||||
SWAP_FLAG_PREFER
|
||||
SWAP_FLAG_PRIO_MASK
|
||||
SWAP_FLAG_PRIO_SHIFT
|
||||
SWAP_FLAG_DISCARD
|
||||
|
||||
swapon
|
||||
swapoff
|
||||
|
||||
|
@ -685,6 +690,13 @@ current process."
|
|||
"Return the mounts points for currently mounted file systems."
|
||||
(map mount-point (mounts)))
|
||||
|
||||
;; Pulled from glibc's sysdeps/unix/sysv/linux/sys/swap.h
|
||||
|
||||
(define SWAP_FLAG_PREFER #x8000) ;; Set if swap priority is specified.
|
||||
(define SWAP_FLAG_PRIO_MASK #x7fff)
|
||||
(define SWAP_FLAG_PRIO_SHIFT 0)
|
||||
(define SWAP_FLAG_DISCARD #x10000) ;; Discard swap cluster after use.
|
||||
|
||||
(define swapon
|
||||
(let ((proc (syscall->procedure int "swapon" (list '* int))))
|
||||
(lambda* (device #:optional (flags 0))
|
||||
|
|
Reference in New Issue