diff --git a/hosts/skydick/datapool.nix b/hosts/skydick/datapool.nix index d6e85ec..e7a5aa6 100644 --- a/hosts/skydick/datapool.nix +++ b/hosts/skydick/datapool.nix @@ -366,6 +366,36 @@ # NFS — primary protocol for all datasets services.rpcbind.enable = true; + # NFS-over-RDMA listener (additive to TCP — clients pick one transport + # per mount). skydick's ConnectX-5 / mlx5_bond_0 RoCEv2 fabric is the + # transport; nfsd binds to UDP/TCP 2049 by default plus RDMA 20049 + # when this oneshot writes to /proc/fs/nfsd/portlist. Clients use + # the RDMA path with `proto=rdma,port=20049` mount options. Saves a + # TCP/IP stack traversal + uses native NIC parallelism (no nconnect + # equivalent needed — RDMA QPs are intrinsically parallel). + boot.kernelModules = [ "rpcrdma" ]; + + systemd.services.nfsd-rdma-listener = { + description = "Enable NFS-over-RDMA listener on port 20049"; + after = [ "nfs-server.service" ]; + wants = [ "nfs-server.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + }; + # If the listener is already added (re-run after rebuild), nfsd + # returns EINVAL — that's fine, the listener stays up. + script = '' + ${pkgs.gnugrep}/bin/grep -q "^rdma 20049$" /proc/fs/nfsd/portlist && { + echo "rdma 20049 already listening" + exit 0 + } + echo "rdma 20049" > /proc/fs/nfsd/portlist + echo "added RDMA listener on 20049" + ''; + }; + services.nfs.server = { enable = true; nproc = 64;