1+ #! /bin/bash
2+
3+ # Setup script for RDMA support in CXLMemSim
4+ # This script installs necessary dependencies and configures RDMA
5+
6+ set -e
7+
8+ echo " ============================================"
9+ echo " CXLMemSim RDMA Setup Script"
10+ echo " ============================================"
11+
12+ # Check if running as root
13+ if [ " $EUID " -ne 0 ]; then
14+ echo " Please run as root (use sudo)"
15+ exit 1
16+ fi
17+
18+ # Detect OS
19+ if [ -f /etc/os-release ]; then
20+ . /etc/os-release
21+ OS=$ID
22+ VER=$VERSION_ID
23+ else
24+ echo " Cannot detect OS"
25+ exit 1
26+ fi
27+
28+ echo " Detected OS: $OS $VER "
29+
30+ # Install RDMA packages based on OS
31+ case $OS in
32+ ubuntu|debian)
33+ echo " Installing RDMA packages for Ubuntu/Debian..."
34+ apt-get update
35+ apt-get install -y \
36+ rdma-core \
37+ libibverbs-dev \
38+ librdmacm-dev \
39+ ibverbs-utils \
40+ perftest \
41+ infiniband-diags \
42+ opensm
43+ ;;
44+
45+ fedora|rhel|centos)
46+ echo " Installing RDMA packages for Fedora/RHEL/CentOS..."
47+ yum install -y \
48+ rdma-core \
49+ libibverbs-devel \
50+ librdmacm-devel \
51+ perftest \
52+ infiniband-diags \
53+ opensm
54+ ;;
55+
56+ arch)
57+ echo " Installing RDMA packages for Arch Linux..."
58+ pacman -S --noconfirm \
59+ rdma-core \
60+ perftest
61+ ;;
62+
63+ * )
64+ echo " Unsupported OS: $OS "
65+ echo " Please install RDMA packages manually:"
66+ echo " - rdma-core"
67+ echo " - libibverbs-dev/devel"
68+ echo " - librdmacm-dev/devel"
69+ exit 1
70+ ;;
71+ esac
72+
73+ # Load RDMA kernel modules
74+ echo " Loading RDMA kernel modules..."
75+ modprobe ib_core
76+ modprobe ib_umad
77+ modprobe ib_uverbs
78+ modprobe rdma_cm
79+ modprobe rdma_ucm
80+
81+ # For RoCE (RDMA over Converged Ethernet)
82+ modprobe mlx4_ib || true
83+ modprobe mlx5_ib || true
84+
85+ # For iWARP
86+ modprobe iw_cxgb4 || true
87+
88+ # For soft-RoCE (RXE) - software RDMA for testing
89+ modprobe rdma_rxe || true
90+
91+ # Check RDMA devices
92+ echo " Checking RDMA devices..."
93+ if command -v ibv_devices & > /dev/null; then
94+ ibv_devices
95+ else
96+ echo " ibv_devices command not found"
97+ fi
98+
99+ # Setup soft-RoCE if no hardware RDMA devices found
100+ if ! ibv_devices 2> /dev/null | grep -q " device" ; then
101+ echo " No hardware RDMA devices found. Setting up soft-RoCE..."
102+
103+ # Get primary network interface
104+ PRIMARY_IFACE=$( ip route | grep default | awk ' {print $5}' | head -n1)
105+
106+ if [ -z " $PRIMARY_IFACE " ]; then
107+ echo " Could not determine primary network interface"
108+ echo " Please set up soft-RoCE manually with: rdma link add rxe0 type rxe netdev <interface>"
109+ else
110+ echo " Using network interface: $PRIMARY_IFACE "
111+
112+ # Create soft-RoCE device
113+ rdma link add rxe0 type rxe netdev $PRIMARY_IFACE 2> /dev/null || true
114+
115+ # Verify soft-RoCE device
116+ if rdma link show | grep -q rxe0; then
117+ echo " Soft-RoCE device rxe0 created successfully"
118+ else
119+ echo " Failed to create soft-RoCE device"
120+ fi
121+ fi
122+ fi
123+
124+ # Set up hugepages for better RDMA performance
125+ echo " Setting up hugepages..."
126+ echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
127+
128+ # Configure RDMA limits
129+ echo " Configuring system limits for RDMA..."
130+ cat >> /etc/security/limits.conf << EOF
131+ * soft memlock unlimited
132+ * hard memlock unlimited
133+ EOF
134+
135+ # Create systemd service for RDMA setup (optional)
136+ cat > /etc/systemd/system/cxlmemsim-rdma.service << EOF
137+ [Unit]
138+ Description=CXLMemSim RDMA Setup
139+ After=network.target
140+
141+ [Service]
142+ Type=oneshot
143+ ExecStart=/bin/bash -c 'modprobe rdma_rxe; rdma link add rxe0 type rxe netdev $( ip route | grep default | awk " {print $5 }" | head -n1) || true'
144+ RemainAfterExit=yes
145+
146+ [Install]
147+ WantedBy=multi-user.target
148+ EOF
149+
150+ systemctl daemon-reload
151+ systemctl enable cxlmemsim-rdma.service
152+
153+ # Create configuration file
154+ echo " Creating RDMA configuration file..."
155+ mkdir -p /etc/cxlmemsim
156+ cat > /etc/cxlmemsim/rdma.conf << EOF
157+ # CXLMemSim RDMA Configuration
158+
159+ # Transport mode: tcp, shm, or rdma
160+ CXL_TRANSPORT_MODE=rdma
161+
162+ # RDMA server address (for client)
163+ CXL_MEMSIM_RDMA_SERVER=127.0.0.1
164+
165+ # RDMA server port
166+ CXL_MEMSIM_RDMA_PORT=5555
167+
168+ # Enable RDMA statistics
169+ CXL_RDMA_STATS=1
170+
171+ # RDMA buffer size (in KB)
172+ CXL_RDMA_BUFFER_SIZE=4096
173+
174+ # RDMA queue depth
175+ CXL_RDMA_QUEUE_DEPTH=512
176+ EOF
177+
178+ echo " ============================================"
179+ echo " RDMA setup complete!"
180+ echo " ============================================"
181+ echo " "
182+ echo " Configuration file: /etc/cxlmemsim/rdma.conf"
183+ echo " "
184+ echo " To test RDMA setup:"
185+ echo " 1. Check devices: ibv_devices"
186+ echo " 2. Check device info: ibv_devinfo"
187+ echo " 3. Test bandwidth: ib_write_bw (server) and ib_write_bw <server_ip> (client)"
188+ echo " "
189+ echo " To use RDMA with CXLMemSim:"
190+ echo " 1. Set environment variable: export CXL_TRANSPORT_MODE=rdma"
191+ echo " 2. Start server: ./cxlmemsim_server_rdma <tcp_port> [rdma_port]"
192+ echo " 3. Configure QEMU to use RDMA"
193+ echo " "
194+ echo " Note: You may need to reboot or re-login for limits to take effect"
0 commit comments