Package: zram-tools
Version: 0.3.3.1-1.1
Severity: normal

Dear Maintainer,

I was testing an Ansible role that would setup zramswap, using a Vagrant-VM 
backed by Virtualbox (image version "debian/bookworm64 (virtualbox, 
12.20241217.1, (amd64))") in the Molecule test framework. Initial installation 
of zramswap worked well, and after that, my system was running zramswap as 
confirmed by `sudo zramctl` and `sudo systemctl status zramswap.service`.
```
$ sudo zramctl
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lz4         480.3M   4K   65B    4K       2 [SWAP]

sudo systemctl status zramswap.service
● zramswap.service - Linux zramswap setup
     Loaded: loaded (/lib/systemd/system/zramswap.service; enabled; preset: 
enabled)
     Active: active (exited) since Tue 2025-01-14 15:37:14 UTC; 16h ago
       Docs: man:zramswap(8)
    Process: 2716 ExecStart=/usr/sbin/zramswap start (code=exited, 
status=0/SUCCESS)
   Main PID: 2716 (code=exited, status=0/SUCCESS)
        CPU: 59ms

Jan 14 15:37:13 vm-runner-bookworm systemd[1]: Starting zramswap.service - 
Linux zramswap setup...
Jan 14 15:37:13 vm-runner-bookworm root[2717]: Starting Zram
Jan 14 15:37:13 vm-runner-bookworm zramswap[2717]: <13>Jan 14 15:37:13 root: 
Starting Zram
Jan 14 15:37:14 vm-runner-bookworm zramswap[2720]: Setting up swapspace version 
1, size = 480.3 MiB (503595008 bytes)
Jan 14 15:37:14 vm-runner-bookworm zramswap[2720]: no label, 
UUID=e256c7aa-e90b-47af-a2de-67850a34dd1b
Jan 14 15:37:14 vm-runner-bookworm systemd[1]: Finished zramswap.service - 
Linux zramswap setup.
```

After changing the zwarmswap default config to what you can see below, I tried 
to restart the `zramswap.service` SystemD service. To do that, ...
... I first triggered the restart using Ansible's 
`ansible.builtin.systemd_service module` with `state: restarted`, but after 
that failed, 
... I tried to restart the service manually using `sudo systemctl restart 
zramswap.service`, and when that also failed,
... I ran the `ExecStop=` stance from `zramswap.service`.
All of these variants do basically the same, so the result was the same as well:

```
sudo systemctl stop zramswap
sudo systemctl status zramswap
× zramswap.service - Linux zramswap setup
     Loaded: loaded (/lib/systemd/system/zramswap.service; enabled; preset: 
enabled)
     Active: failed (Result: exit-code) since Wed 2025-01-15 09:30:19 CET; 6s 
ago
   Duration: 17h 7min 53.334s
       Docs: man:zramswap(8)
    Process: 606 ExecStart=/usr/sbin/zramswap start (code=exited, 
status=0/SUCCESS)
    Process: 48503 ExecStop=/usr/sbin/zramswap stop (code=exited, 
status=1/FAILURE)
   Main PID: 606 (code=exited, status=0/SUCCESS)
        CPU: 11ms

Jan 15 09:30:19 sdvlzasubappamdev systemd[1]: Stopping zramswap.service - Linux 
zramswap setup...
Jan 15 09:30:19 sdvlzasubappamdev zramswap[48504]: <13>Jan 15 09:30:19 root: 
Stopping Zram
Jan 15 09:30:19 sdvlzasubappamdev root[48507]: disabling swap device: /dev/zram0
Jan 15 09:30:19 sdvlzasubappamdev zramswap[48507]: <13>Jan 15 09:30:19 root: 
disabling swap device: /dev/zram0
Jan 15 09:30:19 sdvlzasubappamdev zramswap[48508]: modprobe: ERROR: 
../libkmod/libkmod-module.c:856 kmod_module_remove_module() could not remove 
'zram': Device or resource busy
Jan 15 09:30:19 sdvlzasubappamdev root[48509]: Error: removing zram module from 
kernel
Jan 15 09:30:19 sdvlzasubappamdev zramswap[48509]: <13>Jan 15 09:30:19 root: 
Error: removing zram module from kernel
Jan 15 09:30:19 sdvlzasubappamdev systemd[1]: zramswap.service: Control process 
exited, code=exited, status=1/FAILURE
Jan 15 09:30:19 sdvlzasubappamdev systemd[1]: zramswap.service: Failed with 
result 'exit-code'.
Jan 15 09:30:19 sdvlzasubappamdev systemd[1]: Stopped zramswap.service - Linux 
zramswap setup.
```

The service is set to "failed" status, because the removal of the zram kernel 
module failed. After that, I cannot start the zramswap service, and only a 
reboot resolves the issue.

`/usr/sbin/zramswap` is a Bash script, so I took a look at the `stop()` 
function that is called, but I can't see anything out of the ordinary. I 
suspected that the commands are called in the wrong order, but everything seems 
to make sense. The implemented algorithm is:
1. Test if "/dev/zram0" is a block device
2. Disable swap for that swap device, because it can only be removed when it's 
empty.
3. Remove the zram kernel module.

I executed the steps manually and found that `swapoff` works as expected and 
the zram device is no longer mounted, but `modprobe -r` doesn't:
```
$ sudo modprobe -r zram
Killed
$ echo $?
137
```

I'm not sure how to proceed here. One option would be to keep the Kernel module 
loaded and rely on the fact that it will be unloaded together with the rest of 
the Kernel during shutdown/reboot, but that's not very clean. Also, it would 
require modifications in the `start()` function to first check if the `zram` 
module is already loaded, and if it is, to skip the `modprobe` there as well.

Yeah, so, that's all I've got. If you need anything else to resolve this, I'll 
try my best to help you out.

Thank you and have a nice day,
Jörg



-- System Information:
Debian Release: 12.8
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable-security'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 6.1.0-27-amd64 (SMP w/2 CPU threads; PREEMPT)
Kernel taint flags: TAINT_WARN, TAINT_SOFTLOCKUP
Locale: LANG=C.UTF-8, LC_CTYPE=C.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages zram-tools depends on:
ii  bc  1.07.1-3+b1

zram-tools recommends no packages.

zram-tools suggests no packages.

-- Configuration Files:
/etc/default/zramswap changed:
ALGO=lz4
PERCENT=50


-- no debconf information

Reply via email to