Repository navigation
Switch DCE from NUSE (Linux 4.4) to LKL (Linux 6.12) - #150
Gabrielcarvfer wants to merge 37 commits into
Conversation
Run the GitHub Actions workflow on pushes to master and on every pull request, and drop the obsolete bake-based workflow (Ubuntu 20.04 runners and upload-artifact@v1 no longer exist). Add utils/build_kernel_deps.sh, which builds what bake used to provide: net-next-nuse (Linux 4.4 libos), freebsd-sim, DCE builds of ip, iperf, thttpd, wget, ping/ping6 and quagga, and the ns-3-dce-quagga module, patched for current ns-3 and toolchains (GCC 11-14, Make 4.4). The workflow caches its output and configures DCE with --enable-kernel-stack. Fix DCE for ns-3.46 and Linux semantics: - set the node on Ipv4Interfaces (Linux and FreeBSD glue) and give kernel-stack nodes an inert ArpL3Protocol for CSMA devices - notify connection success for connectionless kernel sockets - deliver multicast locally in Ipv4DceRouting (raw sockets, OSPF) - implement sigwait() - ns-3 stream sockets: connect() succeeds when the peer accepts and closes at once, and reports ECONNREFUSED when refused - ns-3 stack: IPv6 UDP sockets, IPV6_JOIN/LEAVE_GROUP, IPV6_RECVPKTINFO, ICMP6_FILTER, IPV6_PKTINFO on send, no IPv6 header on raw receive, delivery for raw-only IPv6 protocols such as OSPFv3 - netlink and pktinfo use Linux-style interface indexes consistently - reset glibc's getopt state for each simulated process - drop the NSC stacks from dce-tcp-ns3-nsc-comparison; use 802.11a in the MPTCP handoff examples Enable the disabled select/poll/tcp-socket/signal process-manager tests, all quagga test cases and the dce-xfrm example. 79/79 pass on Ubuntu 22.04, Ubuntu 24.04 and Debian trixie with ns-3.46. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Ipv4InterfaceAddress no longer has secondary addresses: drop the IsSecondary() checks in the Linux and FreeBSD IPv4 glue - Ipv4GlobalRouting moved to ns3/global-routing.h - Address::Register() now takes the address kind and its length - CI: build against ns-3.49; drop Ubuntu 22.04, whose CMake (3.22) is older than ns-3.49 requires 79/79 tests and examples pass on Ubuntu 24.04 and Debian trixie. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- TaskManager: - RunningTask(): the task whose fiber runs, ignoring the hi task of DceManager temporary tasks (only a fiber can block). - RunNow(): from the main fiber, run the ready tasks until a condition holds, without advancing time. - SetTaskEndNotifier(): called when a task exits or is stopped. - LinuxSocketImpl (ns-3 sockets backed by the kernel): - Uses the generic UnixFd, not the libos KernelSocketFd. - Delivers the data that arrived with the end of a connection before treating the socket as closed. - After a send failed with EAGAIN, notifies the application again only once time went on: DCCP reports sockets writable while its sends fail, and the failed send wakes the socket again (zero-time livelock). - getaddrinfo: ignore AI_ADDRCONFIG (also the default without hints), which checks the host's addresses, not the node's: without IPv6 on the host, IPv6 addresses did not resolve. - if_nametoindex/if_indextoname ask the kernel of LKL nodes too, and close the socket they open. - ns3waf: the headers copied to build/include/ns3 are outputs of the copy task, so that waf rebuilds what includes them when they change (stale example objects crashed after a class layout change). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
utils/build_lkl.sh builds LKL (Linux 6.12, pinned commit, shallow fetch) for DCE: it applies utils/lkl-patches, configures LKL's defconfig plus utils/lkl-dce.config, and relinks liblkl.so without default libraries (its libc references bind to the simulator's libc; DCE loads a copy per kernel instance) and stripped, with the debug information in liblkl.so.debug. It also copies LKL's headers: configure DCE with --with-lkl=<output>. utils/lkl-dce.config adds what the examples and tests use, as the libos kernel had it: SCTP, DCCP (CCID 3), MPTCP, AF_PACKET, IPsec and its crypto, Mobile IPv6, tunnels, multicast routing, more TCP congestion controls. Patch 0001 backports the upstream fix for the 6.12 deadline server counted in nr_running (52d15521eb75), which kept an idle kernel busy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 0002 lkl: stop the tick while the host is idle. The CPU idles in idle_host_task, a regular task, and after system calls while the host task stays current: the tick never stopped, and a simulator processes every tick (~100 per second per node). Enter NOHZ idle there and leave it when work resumes (system call, thread exit, woken task); re-stop the tick after interrupts that wake nothing, at the outermost level only; mark the clocksource valid for high resolution timers. - 0003 crypto: jitter - do not loop forever on a clock that does not advance. Outside FIPS mode, jent_gen_entropy() never gave up on stuck measurements: the kernel hung at boot on simulated time once the DRBG (pulled in by IPsec) was built in. - 0004 lkl: show_stack: stop at the first frame outside of the kernel. It followed the frame chain into host code without frame pointers and crashed the host on any kernel warning. TOUPSTREAM Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
configure --with-lkl=<utils/build_lkl.sh output> builds DCE with LKL, the Linux kernel as a library, as a node's network stack. Without --enable-kernel-stack (libos, Linux 4.4), LKL provides ns3::LinuxSocketFdFactory, so the existing kernel examples and tests run on Linux 6.12 unchanged (the libos library name liblinux.so selects liblkl.so); with it, libos stays ns3::LinuxSocketFdFactory and LKL is ns3::LklSocketFdFactory.
LklKernel (model/lkl/lkl-kernel.*): one kernel per node, its own copy of liblkl.so (a new one for each simulation in a process), with LKL's host operations on DCE:
- Threads are DCE tasks; semaphores and mutexes wait lists of tasks; thread-local storage per task, dropped when the task ends (destructors run in a task of their own).
- Time is the simulation time; timers are simulator events.
- System calls from the main fiber (ns-3 sockets of LinuxSocketImpl) run in a task, driven without advancing time.
- Kernel memory is released when the kernel object is destroyed.
LklSocketFdFactory (model/lkl/lkl-socket-fd-factory.*):
- Boots the kernel at simulation start, mounts procfs.
- Every ns-3 NetDevice becomes a virtio-net device sim<n> (found by MAC address), with the device's MTU; IFF_NOARP when the device cannot carry ARP (point-to-point). The netdev poll task does not re-report frames the kernel has no buffers for; at most 1024 wait.
- Sockets are LklSocketFd, whose operations are system calls; poll and select through a per-node epoll watcher (persistent, edge-triggered: a kernel wait queue).
- Set/Get: sysctls as libos names them (".net.ipv4.tcp_sack"), or any kernel file by absolute path (/proc/net/netstat); ScheduleTask; the Mptcp attribute makes applications' TCP sockets MPTCP sockets.
Build (wscript): LKL_STACK and, without libos, LKL_LINUX; LINUX_STACK (any Linux stack provides ns3::LinuxSocketFdFactory) for LinuxStackHelper, the Linux socket factories and the iperf examples; KERNEL_STACK keeps meaning libos; dce-freebsd is built only with libos.
Examples: dce-lkl-boot (kernels boot, exact 10 s sleep), dce-lkl-p2p (ip configuration, TCP and UDP between two kernels or over loopback; --stack=linux for libos). The cradle, process manager and quagga test suites look for liblkl.so in LKL-only builds (they skipped otherwise).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Routers enable IPv4 forwarding where the examples assumed it, with conf.all.forwarding (conf.default.forwarding only applies to interfaces created afterwards): dce-tcp-ns3-nsc-comparison received nothing on LKL. - The MPTCP test and examples were written for the out-of-tree MPTCP (v0) that libos never had: the test skipped itself, the examples ran single-path TCP if anything. Now on Linux MPTCP (v1), with LKL: - Applications get MPTCP sockets (LklSocketFdFactory::Mptcp); subflows come from "ip mptcp limits/endpoint" (v0's fullmesh path manager, "ip link set multipath" and the net.mptcp.mptcp_* sysctls are gone). - iperf servers no longer use -P 1: they stop listening after that many connections, and Linux MPTCP accepts subflows on the listener. - dce-mptcp test: runs when .net.mptcp.enabled is 1 and checks that packets from both client addresses reach the server. - dce-cradle-mptcp, dce-iperf-mptcp fail unless both paths carry data; the handoff examples report what each address carried. - build_kernel_deps.sh builds iproute2 6.12 (has "ip mptcp"; also works with libos); LIBOS=0 skips net-next-nuse and freebsd-sim. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ered - LKL is built (utils/build_lkl.sh, cached on the script, the patches and the kernel configuration) and installed with the DCE binaries. - Matrix: Ubuntu 24.04 and Debian trixie build DCE with LKL as ns3::LinuxSocketFdFactory (no --enable-kernel-stack, dependencies with LIBOS=0); Ubuntu 24.04 also builds the libos configuration (Linux 4.4 and FreeBSD, LKL as ns3::LklSocketFdFactory). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LKL (Linux 6.12) runs every kernel example and test the libos kernel did, so the libos kernel stack goes, and with it the FreeBSD stack, which was built on the same libos API (KernelSocketFdFactory and libos' sim.h headers). - configure: --enable-kernel-stack is gone; --with-lkl provides ns3::LinuxSocketFdFactory and defines LINUX_STACK (KERNEL_STACK, LKL_LINUX and LKL_STACK are gone). - LKL takes over the libos classes and files: LklSocketFdFactory and LklSocketFd become KernelSocketFdFactory and KernelSocketFd (model/kernel-socket-fd*), and the LKL LinuxSocketFdFactory moves to model/linux-socket-fd-factory.cc. - Removed: the libos KernelSocketFdFactory/KernelSocketFd and LinuxSocketFdFactory code, FreeBSDSocketFdFactory, Ipv4FreeBSD, FreeBSDStackHelper, the dce-freebsd and freebsd-iproute examples and the FreeBSD test cases, utils/freebsd-sim-dce.patch, utils/mptcp-build.sh (libos MPTCP kernel); the Python bindings drop their KERNEL_STACK switch. - utils/build_kernel_deps.sh builds only the programs (ip, iperf, ping, quagga, ...) and the quagga module; CI has one job per distribution. - Tests and examples drop their libos branches; the process manager test's stack masks are renamed (LINUX_STACK is the build's macro). - Documentation: the kernel guide, getting started and the subprojects page describe LKL; the FreeBSD page is removed; the kernel developer page is marked as describing the former kernel support. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
thanks ! I will look into detail. One immediate note for this: it would be great if you have CI tests, a simple integration with LKL and DCE in this PR. |
sorry, it is already. I allowed the permission of workflow and now it's running. anyway, thanks and will be back later. |
|
@cubic-dev-ai ultrareview |
|
Starting ultrareview. I'll post findings when complete. |
@thehajime Starting ultrareview. I'll post findings when complete. |
There was a problem hiding this comment.
Ultrareview took 11m 54s and investigated 55 possible issues.
All reported issues were addressed across 92 files
Reply to a comment to ask cubic a question or push back. It learns from your replies.
Click Fix with cubic on a comment, or reply @cubic-dev-ai fix this, and cubic writes the fix.
View guided diff | Re-trigger cubic
There was a problem hiding this comment.
Ultrareview took 14m 35s and investigated 58 possible issues.
All reported issues were addressed across 92 files
Requires human review: Auto-approval blocked because this review re-detected 33 unresolved issues already reported by Cubic.
View guided diff | Re-trigger cubic
|
cubic review gives us tons of comments, which I wasn't expected... there are labels, like P1, P2, P3, which I guess the priority number. please take this into account and not spending too much effort on lower prioriy issues. I'll also give a shot with my eyes to your patches. anyway, this is great. thank you for your patch ! |
A process still running when the simulation stops is deleted with it, and its finished callback then reported success: a program that hung passed. The programs that do not end today are listed explicitly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pthread_kill only woke a thread that did not block the signal, while sigwait callers block the signals they wait for: the thread slept forever. sigwait also consumed both the thread's and the process' pending instance of a signal, losing one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The timer host operation runs in the node's tasks, which run on threads of their own with PthreadFiberManager, the default: Simulator::Schedule must not be called there (ns-3 asserts it in debug builds). Use TaskManager::ScheduleMain, like the other events DCE tasks schedule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DCE deletes the tasks of a process it stops (e.g. ApplicationContainer Stop) at once, wherever they are. A task blocked in an LKL system call leaves the kernel referring to it: the entries on its stack in the socket's wait queues, its LKL wait lists. The next wake-up of the socket crashed the simulation (dce-lkl-p2p --stop). Blocking socket calls (read, recvmsg, sendmsg, accept, connect) are now made non-blocking, and wait in DCE for the socket's events, honoring SO_RCVTIMEO and SO_SNDTIMEO and DCE signals; a blocking send still returns once all its data is queued. The LKL wait lists forget stopped tasks, as do the thread identities of the tasks the kernel did not create, which leaked. The files of a stopped process are released without being closed: release their kernel socket then. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LTE devices do not support promiscuous mode, so the promiscuous protocol handler never got their packets: an LTE UE received nothing (the libos stack registered a non-promiscuous handler for them). The destination address of their frames was also converted from the device's Mac64Address; use the address of the kernel device instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The libos stack's LinuxSocketFdFactory enabled it, and scripts written for it rely on it: routers that set no sysctl did not forward (e.g. dce-mptcp-lte-wifi-v6). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
dce-mptcp-lte-wifi: the WiFi router was out of range (ns-3 no longer detects frames below -82 dBm), its route to node 1 pointed at its own address, and node 1 had no route back to the WiFi network for the subflow it gets on its LTE-side address. dce-mptcp-lte-wifi-v6: the mobile node's addresses were hardcoded from an older MAC address allocation; compute them from the devices. The connection starts over IPv4, so the IPv6 subflow needs an IPv6 socket (the IPv4-mapped server address) and the server's IPv6 address, which it now announces; the mobile node's address is configured before the announcement arrives. Both examples now fail unless the server receives TCP payload from every address of the client, and run with test.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
if_nametoindex returned the IPv4 interface index, while netlink messages and socket options now use NetDevice index + 1, like Linux with its loopback device first: a route added with "dev" could go to another device. Link messages also reported the previous device as the parent link (IFLA_LINK) of each device. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With a list of targets, its name became their comma-joined list, so the use of it by name did not resolve. (Headers were still generated first: their group is built before the modules'.) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tarballs are checked against pinned SHA-256 digests, and thttpd is downloaded over HTTPS. The iperf and ping DCE patches were applied with "|| true", which also accepted a patch that does not apply, building programs without the changes DCE needs; a patch is now skipped only if already applied. The quagga module patch is skipped the same way, which made a second run abort. A source tree from an earlier run must be at the requested revision (e.g. not a libos-era iproute2 without "ip mptcp"). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
dce-lkl-boot: reject --nodes=0, count a failed uname, fail if the sleep took host time, and run long enough for all the nodes. dce-lkl-p2p: check that tcp-server read all that tcp-client sent, not only that it stopped reading. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The check that every path carries data counted TCP headers, so a path with only a handshake or ACKs passed. The subflow limits were fixed at 4, while the fullmesh endpoints need nRtrs * nRtrs - 1 subflows: derive them, and reject the router counts Linux MPTCP's 8 subflows cannot cover (more than 3). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mobile node was out of the second access point's range (ns-3 no longer detects frames below -82 dBm): place it within reach of both. Its table 3 default route was added before sim1 was up, and failed; the address added at 15.2 s had no source routing rule, and its MPTCP endpoint was added while the address was still tentative, so no subflow was opened from it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With a static multicast route, Ipv4StaticRouting only forwards the packet, so raw sockets (e.g. a routing daemon's for 224.0.0.5) stopped receiving the group. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On EMFILE, dce_socket leaked the socket it had created: with LKL, its kernel socket, so that the kernel soon ran out of descriptors too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The interface selected with IPV6_PKTINFO was ignored when sending on a connected socket. Like Linux, sendmsg now fails with ENODEV for an interface that does not exist, instead of using the default route, and with EINVAL for a control message longer than the control buffer, instead of reading past it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The option was accepted and ignored, so the socket received the ICMPv6 types it blocked. ns-3 does not expose its raw socket's filter: DCE keeps it, drops the blocked messages when receiving, and returns it from getsockopt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After a send failed with EAGAIN, the poll loop notified the application again only once time went on, and then waited for the socket to wake: when the kernel had already reported the socket writable at the same time, nothing woke it, and the application stopped sending (DCCP bulk transfers ran at a fourth of their rate). Wait at most 1 ms then. dce-tcp-ns3-nsc-comparison now fails if a flow stalls or the flows use little of the bottleneck. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each node loads a copy of liblkl.so from elf-cache, where gdb did not find the liblkl.so.debug its debug link names: link it next to the copy when it is next to the library. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…odule The build instructions only mentioned build_kernel_deps.sh: run it, add its ns-3-dce-quagga module before configuring, and copy its programs and the kernel's debug information to build/bin_dce. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Drop an unused include from lkl-kernel.h, say that the loopback device gets no kernel device, and point dce-iperf-emulation to --with-lkl. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
WaitPoint dropped a wake-up that arrived while its thread was not waiting yet. dce_poll registers its waits as it polls each file, then waits: with LKL, polling a later file is a system call that can wait for the kernel's CPU, during which an event of an earlier file was lost, and poll slept until another event or its timeout. Remember such a wake-up, so that the next wait returns at once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
sctp-client passed its uninitialized flags to sctp_recvmsg, as the flags of recvmsg: every receive failed, and the client closed the association without reading anything. The example now fails unless the client receives messages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mobile node was out of range of the access points (ns-3 no longer detects frames below -82 dBm), so iperf could not even connect: place it within reach of both. Its sim1 routes were added before sim1 was up. With an IPv4 primary path, the client now uses the IPv4-mapped address, so that its MPTCP socket can also have IPv6 subflows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ut data With --bulk=1 and an IPv6 protocol, BulkSend sent to the sending node's own address, so the sink received nothing. The example now fails when a flow carries no data. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Updated with some fixes (see verdict below). Some open design issues for maintainers below. Decisions for maintainersPR #150 review: decisions left to the maintainersThe automated review of PR #150 (cubic-dev-ai ultrareview, 62 inline
The points below change behaviour or were left open, and are for the 1. Behaviour changes made by the fixes
2. Valid comments that were not fixed
3. Comments judged partly valid or invalidArgued one by one in Reviews verdict from Claude |
irq_enter() brings a stale jiffies up to date only when the idle task is current, but LKL idles in idle_host_task or in a host task that stays current after a system call. With the tick stopped by 0002, interrupts ran with an old jiffies, and the timers armed from them, such as the TCP retransmission timer armed on an incoming ACK, expired early: a transfer losing 10 segments retransmitted 84. Update jiffies on interrupt entry when another task is current, as the idle task would.
|
Additional fix found while running TCP calibration |
could you use the reply field of each comment made by reviewer (cubic)? since the number of comments are large, it's not easy to follow which comments you addressed your summary. I'm not going to blindly push the merge button without interpreting the contents of each of them. |
|
Done |
thehajime
left a comment
There was a problem hiding this comment.
I gave a shot to run-through whole patch.
I don't think I covered all this (great) contribution in this run, but hope this helps to improve.
anyway, thanks for the patch !
|
|
||
| diff --git a/crypto/jitterentropy.c b/crypto/jitterentropy.c | ||
| index 3b390bd6c..9025437f9 100644 | ||
| --- a/crypto/jitterentropy.c |
There was a problem hiding this comment.
i'm really not sure but UML has time-travel mode, which is similar to the situation of DCE and wondering how they (TT mode) solve this kind of things.
There was a problem hiding this comment.
I have zero idea of what you mean by that. 😅
There was a problem hiding this comment.
I tested this patch with UML in time-travel=inf-cpu mode (which I mean similar situation using virtual clocksource with DCE), using Linux v6.12 and v7.3-rc3 with CONFIG_CRYPTO_JITTERENTROPY=y and FIPS disabled. Without the patch, both versions hang in jent_gen_entropy(). With the patch, initialization proceeds. On v7.3-rc3, jent_mod_init() returns 0 and the jitterentropy RNG is registered, even though the measurements remain stuck.
This suggests that the current patch stops the hang but does not reliably reject an unsuitable entropy source: jent_gen_entropy() breaks after 1024 stuck measurements without reporting an error to its caller.
I would prefer to minimize the LKL patch set. Could you first check whether DCE needs the jitterentropy RNG? If it does not, disabling it in the LKL build configuration may let us remove this patch. If it is needed, I think the fix should propagate the collection failure so that initialization does not register the RNG and later reads cannot report success without collecting entropy. Since the same hang reproduces on UML, that would also be a candidate for an upstream kernel fix.
| @@ -0,0 +1,500 @@ | |||
| diff -ruN a/example/dce-quagga-bgpd-caida.cc b/example/dce-quagga-bgpd-caida.cc | |||
There was a problem hiding this comment.
can you propose a PR to the reposistory ? (sorry IIRC there is a repo for quagga dce).
There was a problem hiding this comment.
After you are happy with the patches here, yes.
There was a problem hiding this comment.
unlike the patches to LKL, this (ns-3-dce-quagga) is very close repository to this (ns-3-dce) so, instead of including the patch to ns-3-dce, I'd prefer to fix the repository.
There was a problem hiding this comment.
I just meant that when you are satisfied with all the changes here, then I will open MRs with the patches to external code. Otherwise it is additional MRs to manage, and I already have 40 something open, plus 3 journal papers in progress, etc. =x
|
hmm, this jiffies patch that entered last broke the applications. will retest it later with all applications again |
|
It is actually ok. :) |
| #include "linux-stack-helper.h" | ||
| #include "ipv4-linux.h" | ||
| #include "ipv6-linux.h" | ||
| #include "linux-socket-fd-factory.h" |
There was a problem hiding this comment.
This didn't build when I tried it. I added "#ifdef LINUX_STACK" around the include of linux-socket-fd-factory.h to get everything working for me.
There was a problem hiding this comment.
With this branch? Or without it?
There was a problem hiding this comment.
That was on pull request 151 branch and also before recent changes. I applied our patches on current state for this branch and it works without "#ifdef LINUX_STACK" around linux-socket-fd-factory.h.
So this was a false remark, from my side. All our tests pass with this pull request as base (we have commits on top of this branch that we can look at when this is merged (or after pull request 151)).
bed5971 to
7425f47
Compare
|
Consolidated a bit the changes to remove NUSE more thoroughly, and reuse existing filenames for LKL instead of creating all new files. |
7425f47 to
5212223
Compare
thehajime
left a comment
There was a problem hiding this comment.
@Gabrielcarvfer pls also confirm unresolved items in addition to this comment.
5212223 to
0594ecf
Compare
0594ecf to
7425f47
Compare
There is still an option to keep NUSE and FreeBSD by dropping the commit. But I wont't be the one making this call. :)
Requires #149