* [Cluster-devel] [PATCH dlm-tool 0/6] dlm: debian patches and python
@ 2021-12-02 20:20 Alexander Aring
2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 1/6] init: Enable systemctl help dlm to show relevant man pages Alexander Aring
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Alexander Aring @ 2021-12-02 20:20 UTC (permalink / raw)
To: cluster-devel.redhat.com
Hi,
this patch contains patches from the debian dlm package which I want to
sync to upstream. Also I resend the python bindings for libdlm again and
add an example for make some histogram latency tracing between dlm_lock()
and ast callback by using ebpf. You need the recent dlm tracepoint patches
to use those examples.
- Alex
Alexander Aring (6):
init: Enable systemctl help dlm to show relevant man pages
dlm_controld: man: Fix typo: specfic => specific
stonith_helper: Fix gcc build warnings
stonith_helper: Don't link dlm_stonith against libxml2
python: add bindings and test example
python: add ebpf histogram example
dlm_controld/dlm.conf.5 | 2 +-
fence/Makefile | 2 -
fence/stonith_helper.c | 3 +-
init/dlm.service | 1 +
python/README | 7 +
python/bindings/__init__.py | 0
python/bindings/dlm.py | 244 ++++++++++++++++++++++++++++++++
python/ebpf/README | 6 +
python/ebpf/dlmhist.py | 78 ++++++++++
python/tests/dlm.py | 1 +
python/tests/recovery_interrupt | 60 ++++++++
11 files changed, 399 insertions(+), 5 deletions(-)
create mode 100644 python/README
create mode 100644 python/bindings/__init__.py
create mode 100644 python/bindings/dlm.py
create mode 100644 python/ebpf/README
create mode 100755 python/ebpf/dlmhist.py
create mode 120000 python/tests/dlm.py
create mode 100755 python/tests/recovery_interrupt
--
2.27.0
^ permalink raw reply [flat|nested] 7+ messages in thread* [Cluster-devel] [PATCH dlm-tool 1/6] init: Enable systemctl help dlm to show relevant man pages 2021-12-02 20:20 [Cluster-devel] [PATCH dlm-tool 0/6] dlm: debian patches and python Alexander Aring @ 2021-12-02 20:20 ` Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 2/6] dlm_controld: man: Fix typo: specfic => specific Alexander Aring ` (4 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: Alexander Aring @ 2021-12-02 20:20 UTC (permalink / raw) To: cluster-devel.redhat.com Took it from the debian patches. This patch adds entries to the systemd unit file to reference relevant man pages. Reported-by: Ferenc W?gner <wferi@debian.org> --- init/dlm.service | 1 + 1 file changed, 1 insertion(+) diff --git a/init/dlm.service b/init/dlm.service index 1db59251..6def985b 100644 --- a/init/dlm.service +++ b/init/dlm.service @@ -2,6 +2,7 @@ Description=dlm control daemon Requires=corosync.service sys-kernel-config.mount After=corosync.service sys-kernel-config.mount +Documentation=man:dlm_controld man:dlm.conf man:dlm_stonith [Service] OOMScoreAdjust=-1000 -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Cluster-devel] [PATCH dlm-tool 2/6] dlm_controld: man: Fix typo: specfic => specific 2021-12-02 20:20 [Cluster-devel] [PATCH dlm-tool 0/6] dlm: debian patches and python Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 1/6] init: Enable systemctl help dlm to show relevant man pages Alexander Aring @ 2021-12-02 20:20 ` Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 3/6] stonith_helper: Fix gcc build warnings Alexander Aring ` (3 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: Alexander Aring @ 2021-12-02 20:20 UTC (permalink / raw) To: cluster-devel.redhat.com Took it from the debian patches. This patch fixes a typo in the dlm.conf man page. Reported-by: Ferenc W?gner <wferi@debian.org> --- dlm_controld/dlm.conf.5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlm_controld/dlm.conf.5 b/dlm_controld/dlm.conf.5 index 0eb22635..164b5b70 100644 --- a/dlm_controld/dlm.conf.5 +++ b/dlm_controld/dlm.conf.5 @@ -413,7 +413,7 @@ pairs. .B mark The mark key can be used to set a specific mark value which is then used by the in-kernel DLM socket creation. This can be used to match for DLM -specfic packets for e.g. routing. +specific packets for e.g. routing. Example of setting a per socket value for nodeid 1 and a mark value of 42: -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Cluster-devel] [PATCH dlm-tool 3/6] stonith_helper: Fix gcc build warnings 2021-12-02 20:20 [Cluster-devel] [PATCH dlm-tool 0/6] dlm: debian patches and python Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 1/6] init: Enable systemctl help dlm to show relevant man pages Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 2/6] dlm_controld: man: Fix typo: specfic => specific Alexander Aring @ 2021-12-02 20:20 ` Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 4/6] stonith_helper: Don't link dlm_stonith against libxml2 Alexander Aring ` (2 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: Alexander Aring @ 2021-12-02 20:20 UTC (permalink / raw) To: cluster-devel.redhat.com Took it from the debian patches. The return value of getopt() is int not char. This patch switches the return value which is stored in variable c to int. Reported-by: Valentin Vidic <vvidic@debian.org> --- fence/stonith_helper.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fence/stonith_helper.c b/fence/stonith_helper.c index b1db352a..92fe0e5d 100644 --- a/fence/stonith_helper.c +++ b/fence/stonith_helper.c @@ -25,8 +25,7 @@ static int get_options(int argc, char *argv[]) char arg[MAX_ARG_LEN]; char key[MAX_ARG_LEN]; char val[MAX_ARG_LEN]; - char c; - int rv; + int rv, c; if (argc > 1) { while ((c = getopt(argc, argv, "n:t:")) != -1) { -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Cluster-devel] [PATCH dlm-tool 4/6] stonith_helper: Don't link dlm_stonith against libxml2 2021-12-02 20:20 [Cluster-devel] [PATCH dlm-tool 0/6] dlm: debian patches and python Alexander Aring ` (2 preceding siblings ...) 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 3/6] stonith_helper: Fix gcc build warnings Alexander Aring @ 2021-12-02 20:20 ` Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 5/6] python: add bindings and test example Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 6/6] python: add ebpf histogram example Alexander Aring 5 siblings, 0 replies; 7+ messages in thread From: Alexander Aring @ 2021-12-02 20:20 UTC (permalink / raw) To: cluster-devel.redhat.com Took it from the debian patches. There is no need to link against libxml2 for the stonith_helper tool. Reported-by: Ferenc W?gner <wferi@debian.org> --- fence/Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/fence/Makefile b/fence/Makefile index 2b080468..547f7ba9 100644 --- a/fence/Makefile +++ b/fence/Makefile @@ -18,12 +18,10 @@ CFLAGS += -D_GNU_SOURCE -O2 -ggdb \ -fstack-clash-protection -Wl,-z,now CFLAGS += -fPIE -DPIE -CFLAGS += `xml2-config --cflags` CFLAGS += -I../include CFLAGS += $(shell pkg-config --cflags pacemaker-fencing) LDFLAGS += -Wl,-z,relro -Wl,-z,defs -pie -LDFLAGS += `xml2-config --libs` LDFLAGS += -ldl all: $(BIN_TARGET) -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Cluster-devel] [PATCH dlm-tool 5/6] python: add bindings and test example 2021-12-02 20:20 [Cluster-devel] [PATCH dlm-tool 0/6] dlm: debian patches and python Alexander Aring ` (3 preceding siblings ...) 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 4/6] stonith_helper: Don't link dlm_stonith against libxml2 Alexander Aring @ 2021-12-02 20:20 ` Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 6/6] python: add ebpf histogram example Alexander Aring 5 siblings, 0 replies; 7+ messages in thread From: Alexander Aring @ 2021-12-02 20:20 UTC (permalink / raw) To: cluster-devel.redhat.com This patch introduces a python directory with some python examples. This is still in some experimental state to provide some dlm testing framework by using libdlm. --- python/README | 7 + python/bindings/__init__.py | 0 python/bindings/dlm.py | 244 ++++++++++++++++++++++++++++++++ python/tests/dlm.py | 1 + python/tests/recovery_interrupt | 60 ++++++++ 5 files changed, 312 insertions(+) create mode 100644 python/README create mode 100644 python/bindings/__init__.py create mode 100644 python/bindings/dlm.py create mode 120000 python/tests/dlm.py create mode 100755 python/tests/recovery_interrupt diff --git a/python/README b/python/README new file mode 100644 index 00000000..b598a53d --- /dev/null +++ b/python/README @@ -0,0 +1,7 @@ +This directory contains python bindings to libdlm and short written tests in python to test dlm functionality. +NOTE: the bindings are still experimental and only used for testing now. + +Future work: + - look into pytest + - add ebpf examples + - look into MPI for barrier() diff --git a/python/bindings/__init__.py b/python/bindings/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python/bindings/dlm.py b/python/bindings/dlm.py new file mode 100644 index 00000000..b77d374c --- /dev/null +++ b/python/bindings/dlm.py @@ -0,0 +1,244 @@ +from enum import IntEnum, IntFlag +import sys, os, errno, platform +import ctypes, ctypes.util + +#bindings + +if platform.system() != "Linux": + sys.exit("Not supported") + +c_path_libdlm = ctypes.util.find_library("dlm_lt") +if not c_path_libdlm: + print("Unable to find the specified library.") + sys.exit() + +try: + c_libdlm = ctypes.CDLL(c_path_libdlm) +except OSError: + print("Unable to load the system C library") + sys.exit() + +class C_DLM_LSHANDLE(ctypes.c_void_p): + pass + +class C_DLM_LKSB(ctypes.Structure): + _fields_ = [('sb_status', ctypes.c_int), + ('sb_lkid', ctypes.c_uint32), + ('sb_flags', ctypes.c_char), + ('sb_lvbptr', ctypes.c_char_p)] + +C_BAST_CB = ctypes.CFUNCTYPE(None, ctypes.py_object) + +#dlm_create_lockspace +c_dlm_create_lockspace = c_libdlm.dlm_create_lockspace +c_dlm_create_lockspace.argtypes = [ctypes.c_char_p, #name + ctypes.c_uint, #mode + ] +c_dlm_create_lockspace.restype = C_DLM_LSHANDLE + +#dlm_release_lockspace +c_dlm_release_lockspace = c_libdlm.dlm_release_lockspace +c_dlm_release_lockspace.argtypes = [ctypes.c_char_p, #name + C_DLM_LSHANDLE, #ls + ctypes.c_int, #force + ] +c_dlm_release_lockspace.restype = ctypes.c_int + +#dlm_ls_lock_wait +c_dlm_ls_lock_wait = c_libdlm.dlm_ls_lock_wait +c_dlm_ls_lock_wait.argtypes = [C_DLM_LSHANDLE, #ls + ctypes.c_uint32, #mode + ctypes.POINTER(C_DLM_LKSB), #lksb + ctypes.c_uint32, #flags + ctypes.c_char_p, #name + ctypes.c_uint, #namelen + ctypes.c_uint32, #parent + ctypes.py_object, #bastarg + C_BAST_CB, #bastaddr + ctypes.c_void_p, #range + ] +c_dlm_ls_lock_wait.restype = ctypes.c_int + +#dlm_ls_unlock_wait +c_dlm_ls_unlock_wait = c_libdlm.dlm_ls_unlock_wait +c_dlm_ls_unlock_wait.argtypes = [C_DLM_LSHANDLE, #ls + ctypes.c_uint32, #lkid + ctypes.c_uint32, #flags + ctypes.POINTER(C_DLM_LKSB), #lksb + ] +c_dlm_ls_unlock_wait.restype = ctypes.c_int + +#classes + +class LockMode(IntEnum): + IV = -1 + NL = 0 + CR = 1 + CW = 2 + PR = 3 + PW = 4 + EX = 5 + +class LockFlag(IntFlag): + NOQUEUE = 0x00000001 + CANCEL = 0x00000002 + CONVERT = 0x00000004 + VALBLK = 0x00000008 + QUECVT = 0x00000010 + IVVALBLK = 0x00000020 + CONVDEADLK = 0x00000040 + PERSISTENT = 0x00000080 + NODLCKWT = 0x00000100 + NODLCKBLK = 0x00000200 + EXPEDITE = 0x00000400 + NOQUEUEBAST = 0x00000800 + HEADQUE = 0x00001000 + NOORDER = 0x00002000 + ORPHAN = 0x00004000 + ALTPR = 0x00008000 + ALTCW = 0x00010000 + FORCEUNLOCK = 0x00020000 + TIMEOUT = 0x00040000 + +class LockSBFlag(IntFlag): + DEMOTED = 0x01 + VALNOTVALID = 0x02 + ALTMODE = 0x04 + +class DLMError(OSError): + + def __init__(self, errno): + if not errno < 0: + raise ValueError() + + errno = abs(errno) + super().__init__(errno, os.strerror(errno)) + +DLM_LOCK_TO_STR_FORMAT = \ +"""name: {} +last_mode: {} +last_flags: {} +local_locked: {} +last_sb: status: {}, lkid: {}, flags: {}, lvb: {}""" + +class Lockspace: + + def __init__(self, name="default", mode=0o600): + self.__lsname = name + self.__ls = c_dlm_create_lockspace(self.__lsname.encode(), mode) + if not self.__ls: + raise DLMError(-errno.ENOMEM) + + def release(self, force=0): + if not self.__ls: + return + + rc = c_dlm_release_lockspace(self.__lsname.encode(), self.__ls, + force) + if rc: + raise DLMError(rc) + + self.__ls = None + + def __del__(self): + self.release() + + def __str__(self): + return "Lockspace: {}".format(self.__lsname) + + def get_name(self): + return self.__lsname + + # lockspace lock factory + def create_lock(self, name): + class Lock: + + #note name should be 8 byte aligned for now + def __init__(self, ls, c_ls, name): + self.__local_locked = False + self.__last_mode = LockMode.IV + self.__last_flags = LockFlag(0) + + self.__lk = C_DLM_LKSB() + self.__lk.sb_status = 0 + self.__lk.sb_lkid = 0 + self.__lk.sb_flags = LockSBFlag(0) + self.__lk.sb_lvbptr = None + + self.__ls = ls + self.__c_ls = c_ls + self.__name = name + + def __del__(self): + if self.__local_locked: + self.unlock_wait() + + def __str__(self): + sb = self.get_sb() + return DLM_LOCK_TO_STR_FORMAT.format( + self.__name, + str(self.__last_mode), + str(self.__last_flags), + self.__local_locked, + str(sb.status), + sb.lkid, str(sb.flags), + str(sb.lvb)) + + def get_name(self): + return self.__name + + def get_ls(self): + return self.__ls + + # get a copy of current sb state in high-level python + def get_sb(self): + class LockSB: + + def __init__(self, status, lkid, + flags, lvb): + self.status = status + self.lkid = lkid + self.flags = LockSBFlag(flags[0]) + self.lvb = lvb + + return LockSB(self.__lk.sb_status, + self.__lk.sb_lkid, + self.__lk.sb_flags, + self.__lk.sb_lvbptr) + + def lock_wait(self, mode=LockMode.EX, + flags=LockFlag(0), bast=None, + bastarg=None): + if bast: + bast = C_BAST_CB(bast) + else: + bast = ctypes.cast(None, C_BAST_CB) + + rc = c_dlm_ls_lock_wait(self.__c_ls, mode, + ctypes.byref(self.__lk), + flags, + self.__name.encode(), + len(self.__name), 0, + bastarg, bast, None) + if rc: + raise DLMError(rc) + + self.__last_mode = mode + self.__last_flags = flags + self.__local_locked = True + + def unlock_wait(self, flags=0): + rc = c_dlm_ls_unlock_wait(self.__c_ls, + self.__lk.sb_lkid, + flags, + ctypes.byref(self.__lk)) + if rc: + raise DLMError(rc) + + self.__last_flags = flags + self.__local_locked = False + + lock = Lock(self, self.__ls, name) + return lock + +# vim: tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab diff --git a/python/tests/dlm.py b/python/tests/dlm.py new file mode 120000 index 00000000..057a99c5 --- /dev/null +++ b/python/tests/dlm.py @@ -0,0 +1 @@ +../bindings/dlm.py \ No newline@end of file diff --git a/python/tests/recovery_interrupt b/python/tests/recovery_interrupt new file mode 100755 index 00000000..de9d2600 --- /dev/null +++ b/python/tests/recovery_interrupt @@ -0,0 +1,60 @@ +#!/bin/env python3 + +from signal import signal, SIGINT +from dlm import Lockspace +import argparse +import logging +import time + +parser = argparse.ArgumentParser() + +parser.add_argument('-l', '--lock', + action='store_true', + help='do lock activity between ls start/stop') +parser.add_argument('-w', '--wait', + help='wait time for contention', + type=int, default=1) +parser.add_argument("-d", "--debug", default="info", + help=("logging debug level"), + choices=["debug", "info", "warning"]) + +args = parser.parse_args() + +debug_levels = {"debug": logging.DEBUG, "info": logging.INFO, "warning": logging.WARNING} +debug_level = debug_levels[args.debug.lower()] + +logging.basicConfig(level=debug_level, format="%(asctime)s:%(levelname)s: %(message)s") + +def handler(signal, frame): + global end + end = True + +signal(SIGINT, handler) +end = False +while not end: + ls = Lockspace() + lsname = ls.get_name() + logging.info("lockspace {} created".format(lsname)) + + if args.lock: + lock = ls.create_lock("fooobaar") + lockname = lock.get_name() + logging.info("lock {} created".format(lockname)) + + lock.lock_wait() + logging.info("lock {} lock()".format(lockname)) + + #contention + logging.info("lock {} wait for {} secs".format(lockname, args.wait)) + time.sleep(args.wait) + + lock.unlock_wait() + logging.info("lock {} unlock()".format(lockname)) + + del lock + logging.info("lock {} removed".format(lockname)) + + del ls + logging.info("lockspace {} removed".format(lsname)) + +# vim: tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Cluster-devel] [PATCH dlm-tool 6/6] python: add ebpf histogram example 2021-12-02 20:20 [Cluster-devel] [PATCH dlm-tool 0/6] dlm: debian patches and python Alexander Aring ` (4 preceding siblings ...) 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 5/6] python: add bindings and test example Alexander Aring @ 2021-12-02 20:20 ` Alexander Aring 5 siblings, 0 replies; 7+ messages in thread From: Alexander Aring @ 2021-12-02 20:20 UTC (permalink / raw) To: cluster-devel.redhat.com This patch adds an example how a measurement between a kernel dlm_lock() and their ast callback can be captured to get at the end a histogram. This is hopefully a start of more useful dlm tracing collection with use of ebpf. --- python/ebpf/README | 6 ++++ python/ebpf/dlmhist.py | 78 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 python/ebpf/README create mode 100755 python/ebpf/dlmhist.py diff --git a/python/ebpf/README b/python/ebpf/README new file mode 100644 index 00000000..dec59ed0 --- /dev/null +++ b/python/ebpf/README @@ -0,0 +1,6 @@ +In this directory are some ebpf tracing examples. It requires bcc toolchain +(usually known as bcc package name) and the python bcc module (usually known +as python3-bcc package name). + +Also the current kernel headers need to be available or activate +CONFIG_IKHEADERS in your kernel configuration. diff --git a/python/ebpf/dlmhist.py b/python/ebpf/dlmhist.py new file mode 100755 index 00000000..ed1eab4f --- /dev/null +++ b/python/ebpf/dlmhist.py @@ -0,0 +1,78 @@ +#!/usr/bin/python +# +# This example shows how to capture latency between a dlm_lock() kernel +# call for DLM_LOCK_EX requests with flag DLM_LKF_NOQUEUE and the ast +# response. +# +# You will probably see two line peaks, one in case of that the current +# node is the lock master and another one which requires network +# communication. There is currently no way to filter them out, so the +# second peak is interessting to get an idea what time it takes to +# call dlm_lock() and get a response back. + +from bcc import BPF + +import threading + +b = BPF(text=""" +#include <uapi/linux/ptrace.h> +#include <uapi/linux/dlm.h> + +BPF_HASH(start, u32); +BPF_HISTOGRAM(dist, u64); + +#define DLM_HASH(args) (args->ls_id ^ args->lkb_id) + +TRACEPOINT_PROBE(dlm, dlm_lock_start) +{ + u64 ts = bpf_ktime_get_ns(); + u32 hash = DLM_HASH(args); + + if (args->flags & DLM_LKF_NOQUEUE && + args->mode == DLM_LOCK_EX) + start.update(&hash, &ts); + + return 0; +} + +TRACEPOINT_PROBE(dlm, dlm_lock_end) +{ + u32 hash = DLM_HASH(args); + + if (args->error != 0) + start.delete(&hash); + + return 0; +} + +TRACEPOINT_PROBE(dlm, dlm_ast) +{ + u32 hash = DLM_HASH(args); + u64 *tsp, delta; + + tsp = start.lookup(&hash); + if (tsp != 0) { + start.delete(&hash); + delta = bpf_ktime_get_ns() - *tsp; + + if (args->sb_status != 0) + return 0; + + dist.increment(bpf_log2l(delta)); + } + + return 0; +} +""") + +print("Tracing... Hit Ctrl-C anytime to end.") + +forever = threading.Event() +try: + forever.wait() +except KeyboardInterrupt: + print() + +print("log2 histogram") +print("--------------") +b["dist"].print_log2_hist("ns") -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-12-02 20:20 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-12-02 20:20 [Cluster-devel] [PATCH dlm-tool 0/6] dlm: debian patches and python Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 1/6] init: Enable systemctl help dlm to show relevant man pages Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 2/6] dlm_controld: man: Fix typo: specfic => specific Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 3/6] stonith_helper: Fix gcc build warnings Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 4/6] stonith_helper: Don't link dlm_stonith against libxml2 Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 5/6] python: add bindings and test example Alexander Aring 2021-12-02 20:20 ` [Cluster-devel] [PATCH dlm-tool 6/6] python: add ebpf histogram example Alexander Aring
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).