Don't let your motivation go, save time with kworkflow

igalia 23 views 26 slides Mar 11, 2025
Slide 1
Slide 1 of 26
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26

About This Presentation

Another day, another custom kernel deployment on another Linux distribution, on
another hardware and on another architecture and you are about to create
another script that handles another system configuration... Wait! Stop now! Why
not use Kworkflow?

Kworkflow (kw) optimizes the Linux kernel devel...


Slide Content

Don’t let your motivation go,Don’t let your motivation go,
save time with kworkflowsave time with kworkflow
Melissa WenMelissa Wen
kernel GPU driver developer @ Igaliakernel GPU driver developer @ Igalia
11//2525

Spending your life compiling the kernelSpending your life compiling the kernel
So, you are a kernel developer…So, you are a kernel developer…
… or wanna be a kernel developer…… or wanna be a kernel developer…
… or don’t wanna be a kernel developer…… or don’t wanna be a kernel developer…
United by a single need: Validate a custom kernel with a given change.United by a single need: Validate a custom kernel with a given change.
22//2525

For a given distro:For a given distro:

33//2525

For a given device:For a given device:

44//2525

For a given subsystem:For a given subsystem:
Patch flow into the mainline
mainline
$KORG/davem/net-next
1812
$KORG/kvalo/wireless-drivers-next314
$KORG/iwlwifi/iwlwifi-next
73
$KORG/kvalo/wireless-drivers.git
1
$KORG/jkirsher/next-queue
64
$KORG/pablo/nf-next
61
$KORG/saeed/linux
47
$KORG/davem/net
12
$KORG/bluetooth/bluetooth-next38
$KORG/klassert/ipsec-next
12
$KORG/dhowells/linux-fs11
$KORG/mellanox/linux9
309
8
$KORG/pablo/nf26
$KORG/jberg/mac80211
24
$KORG/kvalo/wireless-drivers
22
$KORG/iwlwifi/iwlwifi-fixes
11
$KORG/jkirsher/net-queue
3
6
$KORG/klassert/ipsec
5
git.open-mesh.org/linux-merge
7
people.freedesktop.org/~airlied/linux
1193
anongit.freedesktop.org/git/drm-misc
349
anongit.freedesktop.org/git/drm-intel
18
281
github.com/01org/gvt-linux
19
people.freedesktop.org/~agd5f/linux
255
$KORG/tomba/linux
66
people.freedesktop.org/~gabbayo/linux
34
people.freedesktop.org/~robclark/linux
29
linuxtv.org/pinchartl/media
25
$KORG/daeinki/drm-exynos
23
anongit.freedesktop.org/tegra/linux
22
github.com/skeggsb/linux21
git.pengutronix.de/git/lst/linux
11
people.freedesktop.org/~syeh/repos_linux
10
$KORG/mripard/linux10
anongit.freedesktop.org/drm/drm-intel8
git.pengutronix.de/git/pza/linux
7
$KORG/arm/arm-soc
17
github.com/foss-for-synopsys-dwc-arc-processors/linux
6
anongit.freedesktop.org/drm/drm-misc3
$KORG/tip/tip
1038
$KORG/linusw/linux-gpio
8
$KORG/acme/linux
281
$KORG/paulmck/linux-rcu
65
$KORG/maz/arm-platforms
58
git.linaro.org/people/daniel.lezcano/linux
11
git.linaro.org/people/john.stultz/linux
7
863
$KORG/horms/renesas
127
$KORG/mmind/linux-rockchip
111
$KORG/clk/linux
21
$KORG/shawnguo/linux
77
$KORG/tmlind/linux-omap
71
$KORG/sunxi/linux52
17
github.com/Broadcom/stblinux
36
git.infradead.org/linux-mvebu
35
github.com/mbgg/linux-mediatek
34
$KORG/khilman/linux-amlogic
33
github.com/BayLibre/clk-meson
1
$KORG/agross/linux
32
$KORG/krzk/linux
29
$KORG/ssantosh/linux-keystone
29
github.com/Xilinx/linux-xlnx
26
github.com/hisilicon/linux-hisi24
$KORG/masahiroy/linux-uniphier20
$KORG/tegra/linux
18
$KORG/atorgue/stm32
16
$KORG/linusw/linux-nomadik
9
$KORG/abelloni/linux
41
9
git.linaro.org/people/jens.wiklander/linux-tee
8
$KORG/nsekhar/linux-davinci
6
$KORG/sudeep.holla/linux
5
$KORG/nferre/linux-at91
5
$KORG/joel/aspeed
5
github.com/sverdlin/linux
4
$KORG/gregkh/staging640
$KORG/jic23/iio141
$KORG/mchehab/linux-media625
$KORG/tiwai/sound557$KORG/broonie/sound
359
26
$KORG/dledford/rdma375$KORG/leon/linux-rdma
34
$KORG/powerpc/linux354$KORG/scottwood/linux
2
Applied by Linus352
$KORG/jejb/scsi304
git.kernel.dk/linux-block295
git.infradead.org/nvme
57
$KORG/gregkh/char-misc
266
$KORG/ash/stm
16
$KORG/chanwoo/extcon
15
$KORG/kees/linux
44
6
$KORG/gregkh/usb234
$KORG/balbi/usb
76
$KORG/kishon/linux-phy
28
$KORG/johan/usb-serial11
$KORG/peter.chen/usb
6
$KORG/rafael/linux-pm201
$KORG/mzx/devfreq
5
$KORG/helgaas/pci187
git.linux-mips.org/pub/scm/ralf/upstream-linus
181
$KORG/broonie/spi
71
2
$KORG/linusw/linux-pinctrl
163
$KORG/geert/renesas-drivers
38
12
$KORG/pinctrl/samsung
8
$KORG/ulfh/mmc160
$KORG/herbert/crypto-2.6145
1
141
github.com/baylibre/clk-meson
15
$KORG/snawrocki/clk
4
$KORG/kdave/linux126
$KORG/kvm/kvm126
$KORG/paulus/powerpc
15
$KORG/kvms390/linux
9
$KORG/kvmarm/kvmarm
6
$KORG/joro/iommu103$KORG/will/linux
4
$KORG/arm64/linux
8
$KORG/gregkh/tty101
95$KORG/mark/linux
23
$KORG/lpieralisi/linux3
$KORG/dtor/input92
$KORG/gregkh/driver-core
37
1
git.infradead.org/linux-mtd86git.infradead.org/l2-mtd
62
2
git.linux-nfs.org/projects/trondmy/linux-nfs
83
git.linux-nfs.org/projects/anna/linux-nfs
17
77
github.com/bzolnier/linux76
$KORG/shuah/linux-kselftest74
$KORG/s390/linux70$KORG/kvms390/vfio-ccw
1
$KORG/xfs/xfs-linux69
$KORG/viro/vfs68
$KORG/lee/mfd66
$KORG/jaegeuk/f2fs66
$KORG/wsa/linux63github.com/peda-r/i2c-mux
9
git.lwn.net/linux59
git.infradead.org/users/vkoul/slave-dma
58
github.com/andersson/remoteproc
56
$KORG/robh/linux55
$KORG/jikos/hid48
$KORG/jack/linux-fs
47
github.com/ceph/ceph-client
42
www.linux-watchdog.org/linux-watchdog
41
$KORG/sre/linux-power-supply
40
$KORG/deller/parisc-linux
40
$KORG/vgupta/arc
40
$KORG/xen/tip38
$KORG/groeck/linux-staging35
$KORG/davem/sparc-next
35
$KORG/davem/sparc
1
$KORG/thierry.reding/linux-pwm
33
$KORG/gfs2/linux-gfs2
32
$KORG/tj/percpu
32
$KORG/nvdimm/nvdimm
30
$KORG/rzhang/linux
28
git.infradead.org/linux-platform-drivers-x8626
$KORG/broonie/regulator
25
$KORG/j.anaszewski/linux-leds
25
$KORG/tj/cgroup
24
$KORG/jmorris/linux-security
23
git.samba.org/sfrench/cifs-2.6
22
$KORG/shli/md
21
$KORG/rostedt/linux-trace
21
$KORG/device-mapper/linux-dm
20
$KORG/jj/linux-apparmor
18
$KORG/teigland/linux-dlm
18
linux-nfs.org/~bfields/linux
18
$KORG/mszeredi/vfs
17
$KORG/tj/libata
17
$KORG/bp/bp
16
git.infradead.org/users/hch/dma-mapping
15
$KORG/jlayton/linux
15
$KORG/ebiederm/user-namespace
15
$KORG/pcmoore/selinux
14
$KORG/tytso/ext4
13
git.armlinux.org.uk/~rmk/linux-arm
12
$KORG/mattst88/alpha
11
$KORG/masahiroy/linux-kbuild
10
$KORG/hubcap/linux
10
$KORG/rw/uml
9
$KORG/tj/wq
7
git.linaro.org/landing-teams/working/fujitsu/integration
6
git.infradead.org/linux-ubifs
6
github.com/awilliam/linux-vfio
6
$KORG/pmladek/printk
5
$KORG/lee/backlight
5
$KORG/pcmoore/audit
5
$KORG/geert/linux-m68k
5
$KORG/mason/linux-btrfs
5
$KORG/mszeredi/fuse
4
$KORG/jeyu/linux
4
git.monstr.eu/linux-2.6-microblaze
4
$KORG/cmetcalf/linux-tile
3
$KORG/lftan/nios2
3
$KORG/gerg/m68knommu
3
git.infradead.org/users/hch/uuid
2
github.com/openrisc/linux
2
git.kvack.org/~bcrl/aio-next
2
$KORG/jikos/livepatching
2
$KORG/jdelvare/staging
2
55//2525

$KORG/davem/net-next
1812
$KORG/kvalo/wireless-drivers-next314
$KORG/iwlwifi/iwlwifi-next
73
$KORG/kvalo/wireless-drivers.git
1
$KORG/jkirsher/next-queue
64
$KORG/pablo/nf-next
61
$KORG/saeed/linux
47
$KORG/davem/net
12
$KORG/bluetooth/bluetooth-next38
$KORG/klassert/ipsec-next
12
$KORG/dhowells/linux-fs11
$KORG/mellanox/linux9
309
8
$KORG/pablo/nf
26
$KORG/jberg/mac80211
24
$KORG/kvalo/wireless-drivers
22
$KORG/iwlwifi/iwlwifi-fixes
11
$KORG/jkirsher/net-queue
3
6
$KORG/klassert/ipsec
5
git.open-mesh.org/linux-merge
7
people.freedesktop.org/~airlied/linux
1193
anongit.freedesktop.org/git/drm-misc
349
anongit.freedesktop.org/git/drm-intel
18
281
github.com/01org/gvt-linux
19
people.freedesktop.org/~agd5f/linux
255
$KORG/tomba/linux
66
people.freedesktop.org/~gabbayo/linux
34
people.freedesktop.org/~robclark/linux
29
linuxtv.org/pinchartl/media
25
$KORG/daeinki/drm-exynos
23
anongit.freedesktop.org/tegra/linux
22
github.com/skeggsb/linux21
git.pengutronix.de/git/lst/linux
11
people.freedesktop.org/~syeh/repos_linux
10
$KORG/mripard/linux
10
anongit.freedesktop.org/drm/drm-intel8
git.pengutronix.de/git/pza/linux
7
$KORG/arm/arm-soc
17
github.com/foss-for-synopsys-dwc-arc-processors/linux
6
anongit.freedesktop.org/drm/drm-misc3
$KORG/tip/tip
1038
$KORG/linusw/linux-gpio
8
$KORG/acme/linux
281
$KORG/paulmck/linux-rcu
65
$KORG/maz/arm-platforms
58
git.linaro.org/people/daniel.lezcano/linux
11
git.linaro.org/people/john.stultz/linux
7
863
$KORG/horms/renesas
127
$KORG/mmind/linux-rockchip
111
$KORG/clk/linux
21
$KORG/shawnguo/linux
77
$KORG/tmlind/linux-omap
71
$KORG/sunxi/linux52
17
github.com/Broadcom/stblinux
36
git.infradead.org/linux-mvebu
35
github.com/mbgg/linux-mediatek
34
$KORG/khilman/linux-amlogic
33
github.com/BayLibre/clk-meson
1
$KORG/agross/linux
32
$KORG/krzk/linux
29
$KORG/ssantosh/linux-keystone
29
github.com/Xilinx/linux-xlnx
26
github.com/hisilicon/linux-hisi24
$KORG/masahiroy/linux-uniphier20
$KORG/tegra/linux
18
$KORG/atorgue/stm32
16
$KORG/linusw/linux-nomadik
9
$KORG/abelloni/linux
41
9
git.linaro.org/people/jens.wiklander/linux-tee
8
$KORG/nsekhar/linux-davinci
6
$KORG/sudeep.holla/linux
5
$KORG/nferre/linux-at91
5
$KORG/joel/aspeed
5
github.com/sverdlin/linux
4
$KORG/gregkh/staging640
$KORG/jic23/iio141
$KORG/mchehab/linux-media625
$KORG/tiwai/sound557$KORG/broonie/sound
359
26
$KORG/dledford/rdma375$KORG/leon/linux-rdma
34
$KORG/powerpc/linux354$KORG/scottwood/linux
2
Applied by Linus352
$KORG/jejb/scsi304
git.kernel.dk/linux-block295
git.infradead.org/nvme
57
$KORG/gregkh/char-misc
266
$KORG/ash/stm
16
$KORG/chanwoo/extcon
15
$KORG/kees/linux
44
6
$KORG/gregkh/usb234
$KORG/balbi/usb
76
$KORG/kishon/linux-phy
28
$KORG/johan/usb-serial11
$KORG/peter.chen/usb
6
$KORG/rafael/linux-pm201
$KORG/mzx/devfreq
5
$KORG/helgaas/pci187
git.linux-mips.org/pub/scm/ralf/upstream-linus
181
$KORG/broonie/spi
71
2
$KORG/linusw/linux-pinctrl
163
$KORG/geert/renesas-drivers
38
12
$KORG/pinctrl/samsung
8
$KORG/ulfh/mmc160
$KORG/herbert/crypto-2.6145
1
141
github.com/baylibre/clk-meson
15
$KORG/snawrocki/clk
4
$KORG/kdave/linux126
$KORG/kvm/kvm126
$KORG/paulus/powerpc
15
$KORG/kvms390/linux
9
$KORG/kvmarm/kvmarm
6
$KORG/joro/iommu103$KORG/will/linux
4
$KORG/arm64/linux
8
$KORG/gregkh/tty101
95$KORG/mark/linux
23
$KORG/lpieralisi/linux
3
$KORG/dtor/input92
$KORG/gregkh/driver-core
37
1
git.infradead.org/linux-mtd86git.infradead.org/l2-mtd
62
2
git.linux-nfs.org/projects/trondmy/linux-nfs
83
git.linux-nfs.org/projects/anna/linux-nfs
17
77
github.com/bzolnier/linux76
$KORG/shuah/linux-kselftest74
$KORG/s390/linux70$KORG/kvms390/vfio-ccw
1
66//2525

Being or not being a kernel developerBeing or not being a kernel developer
Issue tracker: reporter vs kernel developerIssue tracker: reporter vs kernel developer
<Source: freepik/catalyststuff><Source: freepik/catalyststuff>
77//2525

Once upon a time there was aOnce upon a time there was a
userspace developer who reported auserspace developer who reported a
kernel issue…kernel issue…
Reporter:Reporter: “There is an issue in your driver only reproducible when running this distribution.” “There is an issue in your driver only reproducible when running this distribution.”
Kernel developer:Kernel developer: “Can you check if this issue still happens using this kernel branch?” “Can you check if this issue still happens using this kernel branch?”
ReporterReporter never compiled and installed a custom kernelnever compiled and installed a custom kernel before. Read many kernel before. Read many kernel
tutorials to tutorials to create a build & deploy kernel script.create a build & deploy kernel script.
Reporter:Reporter: “Sorry for delaying, it’s my first time deploying a custom kernel. I’m not sure I did “Sorry for delaying, it’s my first time deploying a custom kernel. I’m not sure I did
it right, but the issue is still present in this kernel branch”it right, but the issue is still present in this kernel branch”
Kernel developerKernel developer needs to reproduce the issue on their side, but needs to reproduce the issue on their side, but never used thisnever used this
distributiondistribution so also so also created almost the same script created by the reporter.created almost the same script created by the reporter.
88//2525

The Problem: You keep creating newThe Problem: You keep creating new
scripts!scripts!
Every time you:Every time you:
Change distroChange distro
Change architectureChange architecture
Change hardwareChange hardware
Change projectChange project
You create You create anotheranother script for your new kernel development workflow! script for your new kernel development workflow!
99//2525

My precious scriptMy precious script
1010//2525

The Repetitive Developer CycleThe Repetitive Developer Cycle
Instead of creating and accumulating scripts, Instead of creating and accumulating scripts, save your life timesave your life time with kworkflow! with kworkflow!
# Your script
# Your script
$ make ARCH=$ARCH_64 CROSS_COMPILE=$CROSS_COMPILE_64 $DEFCONFIG
$ make ARCH=$ARCH_64 CROSS_COMPILE=$CROSS_COMPILE_64 $DEFCONFIG
$ make -j$(nproc) ARCH=$ARCH_64 CROSS_COMPILE=$CROSS_COMPILE_64
$ make -j$(nproc) ARCH=$ARCH_64 CROSS_COMPILE=$CROSS_COMPILE_64
$ make ARCH=$ARCH_64 CROSS_COMPILE=$CROSS_COMPILE_64 INSTALL_MOD_PATH=$TMP modules_install
$ make ARCH=$ARCH_64 CROSS_COMPILE=$CROSS_COMPILE_64 INSTALL_MOD_PATH=$TMP modules_install
$ ssh $RPI4 mkdir -p /tmp/new_modules /tmp/new_kernel /tmp/new_kernel/overlays
$ ssh $RPI4 mkdir -p /tmp/new_modules /tmp/new_kernel /tmp/new_kernel/overlays
$ rsync -av $TMP/ $RPI4:/tmp/new_modules/
$ rsync -av $TMP/ $RPI4:/tmp/new_modules/
$ scp arch/$ARCH_64/boot/Image $RPI4:/tmp/new_kernel/Image-$KERNEL.img
$ scp arch/$ARCH_64/boot/Image $RPI4:/tmp/new_kernel/Image-$KERNEL.img
$ scp arch/$ARCH_64/boot/$DTB_PATH/*.dtb $RPI4:/tmp/new_kernel
$ scp arch/$ARCH_64/boot/$DTB_PATH/*.dtb $RPI4:/tmp/new_kernel
$ scp arch/$ARCH_64/boot/dts/overlays/*.dtb* $RPI4:/tmp/new_kernel/overlays
$ scp arch/$ARCH_64/boot/dts/overlays/*.dtb* $RPI4:/tmp/new_kernel/overlays
$ ssh $RPI4 sudo rsync -av /tmp/new_modules/lib/modules/ /lib/modules/
$ ssh $RPI4 sudo rsync -av /tmp/new_modules/lib/modules/ /lib/modules/
$ ssh $RPI4 sudo rsync -av /tmp/new_kernel/ /boot/
$ ssh $RPI4 sudo rsync -av /tmp/new_kernel/ /boot/
$ rm -rf $TMP
$ rm -rf $TMP
# With kworkflow
# With kworkflow
$ kw k --fetch --remote root@localhost:2222
$ kw k --fetch --remote root@localhost:2222
$ kw bd
$ kw bd
1111//2525

What is kworkflow? (kw)What is kworkflow? (kw)
A collection of tools and software combined to:A collection of tools and software combined to:
Optimizes Linux kernel development workflow.Optimizes Linux kernel development workflow.
Reduces time spent on repetitive tasks.Reduces time spent on repetitive tasks.
Standardizes best practices.Standardizes best practices.
Ensures reliable data exchange across kernel workflows.Ensures reliable data exchange across kernel workflows.
1212//2525

What is kworkflow? (kw)What is kworkflow? (kw)
<Source: <Source: >>powerrangers.fandom.compowerrangers.fandom.com
1313//2525

Key Features of kworkflowKey Features of kworkflow
Build & deploy custom kernels Build & deploy custom kernels across devices & distrosacross devices & distros..
Handle Handle cross-compilation seamlesslycross-compilation seamlessly..
Manage Manage multiple architecture, settings and target devicesmultiple architecture, settings and target devices in the same work tree. in the same work tree.
Organize Organize kernel configuration fileskernel configuration files..
Facilitate Facilitate remote debugging & code inspectionremote debugging & code inspection..
Standardize Linux kernel patch submission guidelinesStandardize Linux kernel patch submission guidelines..
Upcoming:Upcoming: Interface to bookmark, apply and “reviewed-by” patches from mailing lists ( Interface to bookmark, apply and “reviewed-by” patches from mailing lists (
).).lore.kernel.orglore.kernel.org
1414//2525

kworkflow Command Overviewkworkflow Command Overview
# Manage kw and kw configurations
# Manage kw and kw configurations
kw init - Initialize kw config file
kw init - Initialize kw config file
kw self-update (u) - Update kw
kw self-update (u) - Update kw
kw config (g) - Manage kernel .config files
kw config (g) - Manage kernel .config files
[...]
[...]
# Build & Deploy custom kernels
# Build & Deploy custom kernels
kw kernel-config-manager (k) - Manage kernel .config files
kw kernel-config-manager (k) - Manage kernel .config files
kw build (b) - Build kernel
kw build (b) - Build kernel
kw deploy (d) - Deploy kernel image (local/remote)
kw deploy (d) - Deploy kernel image (local/remote)
kw bd - Build and deploy kernel
kw bd - Build and deploy kernel
# Manage and interact with target machines
# Manage and interact with target machines
kw ssh (s) - SSH support
kw ssh (s) - SSH support
kw remote (r) - Manage machines available via ssh
kw remote (r) - Manage machines available via ssh
kw vm - QEMU support
kw vm - QEMU support
# Inspect and debug
# Inspect and debug
kw device - Show basic hardware information
kw device - Show basic hardware information
kw explore (e) - Explore string patterns in the work tree and git logs
kw explore (e) - Explore string patterns in the work tree and git logs
kw debug - Linux kernel debug utilities
kw debug - Linux kernel debug utilities
kw drm - Set of commands to work with DRM drivers
kw drm - Set of commands to work with DRM drivers
# Automatize best practices for patch submission
# Automatize best practices for patch submission
kw codestyle (c) - Check code style
kw codestyle (c) - Check code style
kw maintainers (m) - Get maintainers/mailing list
kw maintainers (m) - Get maintainers/mailing list
kw send-patch - Send patches via email
kw send-patch - Send patches via email
# Upcoming
# Upcoming
kw patch-hub - Interact with patches (lore.kernel.org)
kw patch-hub - Interact with patches (lore.kernel.org)
1515//2525

Save time on: building and deployingSave time on: building and deploying
custom kernelscustom kernels
Before:Before:
Manually extract and manage .config files from different targetsManually extract and manage .config files from different targets
Sometimes renaming .config files with some descriptive suffixSometimes renaming .config files with some descriptive suffix
copy&paste (ofc)copy&paste (ofc)
After:After: kw kernel-config-manager (k)kw kernel-config-manager (k) - Fetch and manage kernel - Fetch and manage kernel .config.config files easily. files easily.
# Extract and copy .config file from a given device
# Extract and copy .config file from a given device
kw k --fetch (--remote root@localhost:2222 | --local)
kw k --fetch (--remote root@localhost:2222 | --local)
# Store and manage .config files
# Store and manage .config files
kw k --save <my_current_config_name> --description <perfect_for_device1>
kw k --save <my_current_config_name> --description <perfect_for_device1>
kw k --list
kw k --list
kw k --get <my_current_config_name>
kw k --get <my_current_config_name>
1616//2525

Save time on: building and deployingSave time on: building and deploying
custom kernelscustom kernels
Before:Before: Memorize combinations of make commands and options Memorize combinations of make commands and options
After:After: kw build (b)kw build (b) - Build the kernel - Build the kernel
kw b # Build kernel with settings for cross-compilation, cflags, llvm, ccache, cpu scaling factor
kw b # Build kernel with settings for cross-compilation, cflags, llvm, ccache, cpu scaling factor
kw b --menu # Open menuconfig
kw b --menu # Open menuconfig
kw b -i # Show name/version and module count
kw b -i # Show name/version and module count
kw b -w # Enable compilation warnings
kw b -w # Enable compilation warnings
1717//2525

Save time on: building and deployingSave time on: building and deploying
custom kernelscustom kernels
Before:Before:
SSHSSH
Copy or remove files according to distro and architectureCopy or remove files according to distro and architecture
Manually update bootloader by distro.Manually update bootloader by distro.
After:After: kw deploy (d)kw deploy (d) - Deploy the custom kernel in a target machine - Deploy the custom kernel in a target machine
kw d # Deploy kernel
kw d # Deploy kernel
kw d --setup # Prepare target machine
kw d --setup # Prepare target machine
kw d --list # List available kernels
kw d --list # List available kernels
kw d --uninstall # Remove kernel(s)
kw d --uninstall # Remove kernel(s)
kw d --create-package # Create sharable kw package
kw d --create-package # Create sharable kw package
kw d --reboot # Reboot after deploy
kw d --reboot # Reboot after deploy
kw bd # Build and deploy kernel
kw bd # Build and deploy kernel
1818//2525

Save time on: debugging kernels locallySave time on: debugging kernels locally
or remotelyor remotely
Before:Before:
SSHSSH
Manually setup and enable tracesManually setup and enable traces
Copy&Paste (again)Copy&Paste (again)
After:After: kw debugkw debug - simplify kernel debug utilities: events, ftrace, dmesg. - simplify kernel debug utilities: events, ftrace, dmesg.
kw debug # Debug utilities
kw debug # Debug utilities
kw debug -c "cmd" # Trace log for a command
kw debug -c "cmd" # Trace log for a command
kw debug -k # Store trace logs
kw debug -k # Store trace logs
kw debug -f # Follow traces in real-time
kw debug -f # Follow traces in real-time
Supports local & remote debugging.Supports local & remote debugging.
1919//2525

Save time on: managing multiple kernelSave time on: managing multiple kernel
images in the same work treeimages in the same work tree
Before:Before:
Clone multiple times the same branch(?)Clone multiple times the same branch(?)
Lose compiled files when changing kernel config or compilation optionsLose compiled files when changing kernel config or compilation options
Manually manage deployment scripts.Manually manage deployment scripts.
After:After: kw envkw env - isolating multiple contexts in the same work tree as environments - isolating multiple contexts in the same work tree as environments
kw config # Manage kernel environment settings
kw config # Manage kernel environment settings
kw env # Create isolated kernel environments
kw env # Create isolated kernel environments
Maintain different setups in the Maintain different setups in the same work treesame work tree..
2020//2525

Save time on: submitting patches toSave time on: submitting patches to
mailing listsmailing lists
kw code-style # Check kernel coding style
kw code-style # Check kernel coding style
kw maintainer # Get maintainers & mailing lists
kw maintainer # Get maintainers & mailing lists
kw send-patch # Automatically create the list of recipients and send patches via email
kw send-patch # Automatically create the list of recipients and send patches via email
kw patch-hub # Terminal UI for interacting with patches in lore mailing lists
kw patch-hub # Terminal UI for interacting with patches in lore mailing lists
Automate patch submission rules on sending patchesAutomate patch submission rules on sending patches, via , via git send-emailgit send-email..
Ensure patches Ensure patches reach the right people (maintainers and ML)reach the right people (maintainers and ML)..
2121//2525

2222//2525

Call to ActionCall to Action
Stop writing redundant scripts!Stop writing redundant scripts!
Save everybody’s time and effort with kworkflow.Save everybody’s time and effort with kworkflow.
Try kworkflow today:Try kworkflow today:
Contribute to kworkflow: it’s 100% volunteering work.Contribute to kworkflow: it’s 100% volunteering work.
Challenge:Challenge:
Replace one of your scripts with kworkflow this week!Replace one of your scripts with kworkflow this week!
Make a new kworkflow feature with one of your scripts.Make a new kworkflow feature with one of your scripts.
https://kworkflow.orghttps://kworkflow.org
2323//2525

Demo setup:Demo setup:
Setup: Three devices:Setup: Three devices:
laptop (debian|x86|intel|local)laptop (debian|x86|intel|local)
SteamDeck (steamos|x86|amd|remote)SteamDeck (steamos|x86|amd|remote)
RaspberryPi 4 (raspbian|arm64|broadcomm|remote)RaspberryPi 4 (raspbian|arm64|broadcomm|remote)
Goal: To validate a change on DRM/VKMS using a single kernel tree.Goal: To validate a change on DRM/VKMS using a single kernel tree.
Kworkflow commands:Kworkflow commands:
kw envkw env
kw dkw d
kw bdkw bd
kw devicekw device
kw debugkw debug
kw drmkw drm
2424//2525

2525//2525