~ruther/guix-local

0831dfab75b4db9c8bcbc9b2d1e52d8db54d0ad9 — Josselin Poiret 4 years ago f574dbd
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>
M gnu/build/file-systems.scm => gnu/build/file-systems.scm +35 -1
@@ 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))



;;;

M gnu/services/base.scm => gnu/services/base.scm +5 -2
@@ 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))

M gnu/system/file-systems.scm => gnu/system/file-systems.scm +8 -2
@@ 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

M guix/build/syscalls.scm => guix/build/syscalls.scm +12 -0
@@ 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))