diff --git a/scripts/sosp24-experiments/vm_flows_exp.sh b/scripts/sosp24-experiments/vm_flows_exp.sh index aeb374320..11fee66b2 100755 --- a/scripts/sosp24-experiments/vm_flows_exp.sh +++ b/scripts/sosp24-experiments/vm_flows_exp.sh @@ -35,31 +35,32 @@ CLIENT_SSH_PASSWORD="saksham" CLIENT_USE_PASS_AUTH=0 # 1 to use password, 0 to use identity file CLIENT_SSH_IDENTITY_FILE="/home/schai/.ssh/id_rsa" -# off, shadow or nested -VIRT_TECH="nested" - -function verify_virt_tech() { - local tech="$1" - # Check if we can connect to virsh - - # bash -l -c is required here to load the right env - virsh_out=$(ssh -i "$CLIENT_SSH_IDENTITY_FILE" "${HOST_UNAME}@${HOST_IP}" 'bash -l -c "virsh list --all"') - running_vms=$(echo "$virsh_out" | grep running | awk '{print $2}') - # running_vms=$(ssh -i "$CLIENT_SSH_IDENTITY_FILE" "${HOST_UNAME}@${HOST_IP}" "bash -c 'virsh list --all | grep running'") - +function detect_virt_tech() { + local virsh_out=$(ssh -i "$CLIENT_SSH_IDENTITY_FILE" "${HOST_UNAME}@${HOST_IP}" 'bash -l -c "virsh list --all"') + local running_vms=$(echo "$virsh_out" | grep running | awk '{print $2}') + if [ -z "$running_vms" ]; then - echo "No VMs are currently running" - exit 1 - else - echo "Found running VMs: $running_vms" + echo "ERROR: No VMs are currently running" >&2 + return 1 fi - if [[ "$running_vms" == *"$tech"* ]]; then - echo "Matched: VMname=$running_vms and virt_tech=$tech" + echo "Found running VMs: $running_vms" >&2 + + local detected_tech="" + if [[ "$running_vms" == *"nested"* ]]; then + detected_tech="nested" + elif [[ "$running_vms" == *"shadow"* ]]; then + detected_tech="shadow" + elif [[ "$running_vms" == *"off"* ]]; then + detected_tech="off" else - echo "ERROR Inconsistent virtualization tech: $running_vms and $tech" - exit 1 + echo "ERROR: Could not detect virtualization technology from VM name: $running_vms" >&2 + echo "Expected VM name to contain 'nested', 'shadow', or 'off'" >&2 + return 1 fi + + echo "$detected_tech" + return 0 } parse_iommu_mode() { @@ -105,8 +106,6 @@ parse_iommu_mode() { echo strict } -verify_virt_tech $VIRT_TECH - if [ "$CLIENT_USE_PASS_AUTH" -eq 1 ]; then SSH_CLIENT_CMD="sshpass -p $CLIENT_SSH_PASSWORD ssh ${CLIENT_SSH_UNAME}@${CLIENT_SSH_HOST}" else @@ -114,11 +113,17 @@ else fi guest_cmdline=$(cat /proc/cmdline) -guest_iommu_config=$(parse_iommu_mode $guest_cmdline) +guest_iommu_config=$(parse_iommu_mode "$guest_cmdline") host_cmdline=$(ssh -i "$CLIENT_SSH_IDENTITY_FILE" "${HOST_UNAME}@${HOST_IP}" 'cat /proc/cmdline') -host_iommu_config=$(parse_iommu_mode $host_cmdline) +host_iommu_config=$(parse_iommu_mode "$host_cmdline") + +virt_tech=$(detect_virt_tech) +if [ $? -ne 0 ]; then + echo "Failed to detect virtualization technology" + exit 1 +fi -iommu_config="host-${guest_iommu_config}-guest-${host_iommu_config}-$VIRT_TECH" +iommu_config="host-${guest_iommu_config}-guest-${host_iommu_config}-$virt_tech" echo "iommu_config: $iommu_config" # exit 0 @@ -142,7 +147,7 @@ for socket_buf in 1; do server_cores_mask=($(echo $server_cores | tr ',' '\n' | head -n $num_cores | tr '\n' ',')) format_i=$(printf "%02d\n" $i) - exp_name="${timestamp}-$(uname -r)-flow${format_i}-${iommu_config}-ringbuf-${ring_buffer}_sokcetbuf1_${num_cores}cores" + exp_name="${timestamp}-$(uname -r)-flow${format_i}-${iommu_config}-${num_cores}cores" echo $exp_name if [ "$DRY_RUN" -eq 1 ]; then diff --git a/scripts/vm-run-dctcp-tput-experiment.sh b/scripts/vm-run-dctcp-tput-experiment.sh index ab582cd0c..b21aa4b55 100755 --- a/scripts/vm-run-dctcp-tput-experiment.sh +++ b/scripts/vm-run-dctcp-tput-experiment.sh @@ -317,6 +317,82 @@ cleanup() { log_info "--- Cleanup Phase Finished ---" } +save_config_to_report_json() { + local report_dir="${1:-$current_guest_reports_dir}" + local config_file="$report_dir/config.json" + + local guest_cmdline=$(cat /proc/cmdline) + local guest_kernel=$(uname -r) + local host_cmdline=$($SSH_HOST_CMD 'cat /proc/cmdline') + local host_kernel=$($SSH_HOST_CMD 'uname -r') + local client_cmdline=$($SSH_CLIENT_CMD 'cat /proc/cmdline') + local client_kernel=$($SSH_CLIENT_CMD 'uname -r') + + cat > "$config_file" << EOF +{ + "timestamp": "$(date -Iseconds)", + "test_params": { + "core_duration_s": "$CORE_DURATION_S", + "mtu": "$MTU", + "ddio_enabled": "$DDIO_ENABLED", + "ring_buffer_size": "$RING_BUFFER_SIZE", + "tcp_socket_buf_mb": "$TCP_SOCKET_BUF_MB", + "mlc_cores": "$MLC_CORES" + }, + "guest": { + "ip": "$GUEST_IP", + "interface": "$GUEST_INTF", + "num_servers": "$GUEST_NUM_SERVERS", + "cpu_mask": "$GUEST_CPU_MASK", + "nic_bus": "$GUEST_NIC_BUS", + "kernel": "$guest_kernel", + "cmdline": "$guest_cmdline" + }, + "client": { + "ip": "$CLIENT_IP", + "interface": "$CLIENT_INTF", + "num_clients": "$CLIENT_NUM_CLIENTS", + "cpu_mask": "$CLIENT_CPU_MASK", + "bandwidth": "$CLIENT_BANDWIDTH", + "kernel": "$client_kernel", + "cmdline": "$client_cmdline" + }, + "host": { + "kernel": "$host_kernel", + "cmdline": "$host_cmdline" + } +} +EOF +} + +save_vm_config_to_report() { + local report_dir="${1:-$current_guest_reports_dir}" + + log_info "Fetching running VM configurations..." + + local virsh_out=$($SSH_HOST_CMD 'bash -l -c "virsh list --all"') + local running_vms=$(echo "$virsh_out" | grep running | awk '{print $2}') + + if [ -z "$running_vms" ]; then + log_error "Warning: No VMs are currently running" + return 1 + fi + + log_info "Found running VMs: $running_vms" + + for vm in $running_vms; do + log_info "Dumping XML for: $vm" + local xml_file="$report_dir/${vm}_domain.xml" + + $SSH_HOST_CMD "bash -l -c \"virsh dumpxml $vm\"" > "$xml_file" 2>&1 + + if [ $? -eq 0 ]; then + log_info "Saved to: ${vm}_domain.xml" + else + log_error "Failed to dump XML for $vm" + fi + done +} log_info "Starting experiment: $EXP_NAME" log_info "Number of runs: $NUM_RUNS" @@ -350,6 +426,10 @@ for ((j = 0; j < NUM_RUNS; j += 1)); do # --- Pre-run cleanup --- cleanup + # --- Add config to reports --- + save_config_to_report_json "$current_guest_reports_dir" + save_vm_config_to_report "$current_guest_reports_dir" + # --- Start MLC (Memory Latency Checker) if configured --- if [ "$MLC_CORES" != "none" ]; then log_info "Starting MLC on cores: $MLC_CORES; logs at $guest_mlc_log_file..." diff --git a/tracing/guest_loader.c b/tracing/guest_loader.c index 9cd08225f..a29b666df 100644 --- a/tracing/guest_loader.c +++ b/tracing/guest_loader.c @@ -126,24 +126,24 @@ probe_def_t probes_to_attach[] = { {"kretprobe_qi_submit_sync", "qi_submit_sync", PROBE_TYPE_KRETPROBE, QI_SUBMIT_SYNC,NULL}, {"kprobe_page_pool_dma_map", "page_pool_dma_map", PROBE_TYPE_KPROBE, PAGE_POOL_DMA_MAP,NULL}, {"kretprobe_page_pool_dma_map", "page_pool_dma_map", PROBE_TYPE_KRETPROBE, PAGE_POOL_DMA_MAP,NULL}, - // {"kprobe_trace_mlx5e_tx_dma_unmap_ktls_hook", "mlx5_core:trace_mlx5e_tx_dma_unmap_ktls_hook", PROBE_TYPE_KPROBE, TRACE_MLX5E_TX_DMA_UNMAP_KTLS_HOOK,"mlx5_core"}, - // {"kretprobe_trace_mlx5e_tx_dma_unmap_ktls_hook", "mlx5_core:trace_mlx5e_tx_dma_unmap_ktls_hook", PROBE_TYPE_KRETPROBE, TRACE_MLX5E_TX_DMA_UNMAP_KTLS_HOOK,"mlx5_core"}, - // {"kprobe_trace_mlx5e_dma_push_build_single_hook", "mlx5_core:trace_mlx5e_dma_push_build_single_hook", PROBE_TYPE_KPROBE, TRACE_MLX5E_DMA_PUSH_BUILD_SINGLE_HOOK,"mlx5_core"}, - // {"kretprobe_trace_mlx5e_dma_push_build_single_hook", "mlx5_core:trace_mlx5e_dma_push_build_single_hook", PROBE_TYPE_KRETPROBE, TRACE_MLX5E_DMA_PUSH_BUILD_SINGLE_HOOK,"mlx5_core"}, - // {"kprobe_trace_mlx5e_dma_push_xmit_single_hook", "mlx5_core:trace_mlx5e_dma_push_xmit_single_hook", PROBE_TYPE_KPROBE, TRACE_MLX5E_DMA_PUSH_XMIT_SINGLE_HOOK,"mlx5_core"}, - // {"kretprobe_trace_mlx5e_dma_push_xmit_single_hook", "mlx5_core:trace_mlx5e_dma_push_xmit_single_hook", PROBE_TYPE_KRETPROBE, TRACE_MLX5E_DMA_PUSH_XMIT_SINGLE_HOOK,"mlx5_core"}, - // {"kprobe_trace_mlx5e_dma_push_page_hook", "mlx5_core:trace_mlx5e_dma_push_page_hook", PROBE_TYPE_KPROBE, TRACE_MLX5E_DMA_PUSH_PAGE_HOOK,"mlx5_core"}, - // {"kretprobe_trace_mlx5e_dma_push_page_hook", "mlx5_core:trace_mlx5e_dma_push_page_hook", PROBE_TYPE_KRETPROBE, TRACE_MLX5E_DMA_PUSH_PAGE_HOOK,"mlx5_core"}, - // {"kprobe_trace_mlx5e_tx_dma_unmap_hook", "mlx5_core:trace_mlx5e_tx_dma_unmap_hook", PROBE_TYPE_KPROBE, TRACE_MLX5E_TX_DMA_UNMAP_HOOK,"mlx5_core"}, - // {"kretprobe_trace_mlx5e_tx_dma_unmap_hook", "mlx5_core:trace_mlx5e_tx_dma_unmap_hook", PROBE_TYPE_KRETPROBE, TRACE_MLX5E_TX_DMA_UNMAP_HOOK,"mlx5_core"}, - // {"kprobe_trace_qi_submit_sync_cs", "trace_qi_submit_sync_cs", PROBE_TYPE_KPROBE, TRACE_QI_SUBMIT_SYNC_CS,NULL}, - // {"kretprobe_trace_qi_submit_sync_cs", "trace_qi_submit_sync_cs", PROBE_TYPE_KRETPROBE, TRACE_QI_SUBMIT_SYNC_CS,NULL}, - // {"kprobe_trace_qi_submit_sync_lock_wrapper", "trace_qi_submit_sync_lock_wrapper", PROBE_TYPE_KPROBE, TRACE_QI_SUBMIT_SYNC_LOCK_WRAPPER,NULL}, - // {"kretprobe_trace_qi_submit_sync_lock_wrapper", "trace_qi_submit_sync_lock_wrapper", PROBE_TYPE_KRETPROBE, TRACE_QI_SUBMIT_SYNC_LOCK_WRAPPER,NULL}, - // {"kprobe_trace_iommu_flush_write_buffer_cs", "trace_iommu_flush_write_buffer_cs", PROBE_TYPE_KPROBE, TRACE_IOMMU_FLUSH_WRITE_BUFFER_CS,NULL}, - // {"kretprobe_trace_iommu_flush_write_buffer_cs", "trace_iommu_flush_write_buffer_cs", PROBE_TYPE_KRETPROBE, TRACE_IOMMU_FLUSH_WRITE_BUFFER_CS,NULL}, - // {"kprobe_trace_iommu_flush_write_buffer_lock_wrapper", "trace_iommu_flush_write_buffer_lock_wrapper", PROBE_TYPE_KPROBE, TRACE_IOMMU_FLUSH_WRITE_BUFFER_LOCK_WRAPPER,NULL}, - // {"kretprobe_trace_iommu_flush_write_buffer_lock_wrapper", "trace_iommu_flush_write_buffer_lock_wrapper", PROBE_TYPE_KRETPROBE, TRACE_IOMMU_FLUSH_WRITE_BUFFER_LOCK_WRAPPER,NULL}, + {"kprobe_trace_mlx5e_tx_dma_unmap_ktls_hook", "mlx5_core:trace_mlx5e_tx_dma_unmap_ktls_hook", PROBE_TYPE_KPROBE, TRACE_MLX5E_TX_DMA_UNMAP_KTLS_HOOK,"mlx5_core"}, + {"kretprobe_trace_mlx5e_tx_dma_unmap_ktls_hook", "mlx5_core:trace_mlx5e_tx_dma_unmap_ktls_hook", PROBE_TYPE_KRETPROBE, TRACE_MLX5E_TX_DMA_UNMAP_KTLS_HOOK,"mlx5_core"}, + {"kprobe_trace_mlx5e_dma_push_build_single_hook", "mlx5_core:trace_mlx5e_dma_push_build_single_hook", PROBE_TYPE_KPROBE, TRACE_MLX5E_DMA_PUSH_BUILD_SINGLE_HOOK,"mlx5_core"}, + {"kretprobe_trace_mlx5e_dma_push_build_single_hook", "mlx5_core:trace_mlx5e_dma_push_build_single_hook", PROBE_TYPE_KRETPROBE, TRACE_MLX5E_DMA_PUSH_BUILD_SINGLE_HOOK,"mlx5_core"}, + {"kprobe_trace_mlx5e_dma_push_xmit_single_hook", "mlx5_core:trace_mlx5e_dma_push_xmit_single_hook", PROBE_TYPE_KPROBE, TRACE_MLX5E_DMA_PUSH_XMIT_SINGLE_HOOK,"mlx5_core"}, + {"kretprobe_trace_mlx5e_dma_push_xmit_single_hook", "mlx5_core:trace_mlx5e_dma_push_xmit_single_hook", PROBE_TYPE_KRETPROBE, TRACE_MLX5E_DMA_PUSH_XMIT_SINGLE_HOOK,"mlx5_core"}, + {"kprobe_trace_mlx5e_dma_push_page_hook", "mlx5_core:trace_mlx5e_dma_push_page_hook", PROBE_TYPE_KPROBE, TRACE_MLX5E_DMA_PUSH_PAGE_HOOK,"mlx5_core"}, + {"kretprobe_trace_mlx5e_dma_push_page_hook", "mlx5_core:trace_mlx5e_dma_push_page_hook", PROBE_TYPE_KRETPROBE, TRACE_MLX5E_DMA_PUSH_PAGE_HOOK,"mlx5_core"}, + {"kprobe_trace_mlx5e_tx_dma_unmap_hook", "mlx5_core:trace_mlx5e_tx_dma_unmap_hook", PROBE_TYPE_KPROBE, TRACE_MLX5E_TX_DMA_UNMAP_HOOK,"mlx5_core"}, + {"kretprobe_trace_mlx5e_tx_dma_unmap_hook", "mlx5_core:trace_mlx5e_tx_dma_unmap_hook", PROBE_TYPE_KRETPROBE, TRACE_MLX5E_TX_DMA_UNMAP_HOOK,"mlx5_core"}, + {"kprobe_trace_qi_submit_sync_cs", "trace_qi_submit_sync_cs", PROBE_TYPE_KPROBE, TRACE_QI_SUBMIT_SYNC_CS,NULL}, + {"kretprobe_trace_qi_submit_sync_cs", "trace_qi_submit_sync_cs", PROBE_TYPE_KRETPROBE, TRACE_QI_SUBMIT_SYNC_CS,NULL}, + {"kprobe_trace_qi_submit_sync_lock_wrapper", "trace_qi_submit_sync_lock_wrapper", PROBE_TYPE_KPROBE, TRACE_QI_SUBMIT_SYNC_LOCK_WRAPPER,NULL}, + {"kretprobe_trace_qi_submit_sync_lock_wrapper", "trace_qi_submit_sync_lock_wrapper", PROBE_TYPE_KRETPROBE, TRACE_QI_SUBMIT_SYNC_LOCK_WRAPPER,NULL}, + {"kprobe_trace_iommu_flush_write_buffer_cs", "trace_iommu_flush_write_buffer_cs", PROBE_TYPE_KPROBE, TRACE_IOMMU_FLUSH_WRITE_BUFFER_CS,NULL}, + {"kretprobe_trace_iommu_flush_write_buffer_cs", "trace_iommu_flush_write_buffer_cs", PROBE_TYPE_KRETPROBE, TRACE_IOMMU_FLUSH_WRITE_BUFFER_CS,NULL}, + {"kprobe_trace_iommu_flush_write_buffer_lock_wrapper", "trace_iommu_flush_write_buffer_lock_wrapper", PROBE_TYPE_KPROBE, TRACE_IOMMU_FLUSH_WRITE_BUFFER_LOCK_WRAPPER,NULL}, + {"kretprobe_trace_iommu_flush_write_buffer_lock_wrapper", "trace_iommu_flush_write_buffer_lock_wrapper", PROBE_TYPE_KRETPROBE, TRACE_IOMMU_FLUSH_WRITE_BUFFER_LOCK_WRAPPER,NULL}, {"kprobe_page_pool_return_page", "page_pool_return_page", PROBE_TYPE_KPROBE, PAGE_POOL_RETURN_PAGE,NULL}, {"kretprobe_page_pool_return_page", "page_pool_return_page", PROBE_TYPE_KRETPROBE, PAGE_POOL_RETURN_PAGE,NULL}, {"kprobe_page_pool_put_unrefed_netmem", "page_pool_put_unrefed_netmem", PROBE_TYPE_KPROBE, PAGE_POOL_PUT_NETMEM,NULL}, @@ -155,12 +155,12 @@ probe_def_t probes_to_attach[] = { // {"kprobe_after_writel_while_wrapper", "after_writel_while_wrapper", PROBE_TYPE_KPROBE, AFTER_WRITEL_WHILE_WRAPPER,NULL}, // {"kretprobe_after_writel_while_wrapper", "after_writel_while_wrapper", PROBE_TYPE_KRETPROBE, AFTER_WRITEL_WHILE_WRAPPER,NULL}, // --- Additions for count functions --- - // {"kprobe_count_mlx5e_alloc_rx_mpwqe_perpage_hook", "mlx5_core:count_mlx5e_alloc_rx_mpwqe_perpage_hook", PROBE_TYPE_KPROBE, COUNT_MLX5E_RX_MPWQE_PER_PAGE,"mlx5_core"}, - // {"kretprobe_count_mlx5e_alloc_rx_mpwqe_perpage_hook", "mlx5_core:count_mlx5e_alloc_rx_mpwqe_perpage_hook", PROBE_TYPE_KRETPROBE, COUNT_MLX5E_RX_MPWQE_PER_PAGE,"mlx5_core"}, - // {"kprobe_count_page_pool_release_page_dma_hook", "count_page_pool_release_page_dma_hook", PROBE_TYPE_KPROBE, COUNT_PAGE_POOL_RELEASE, NULL}, - // {"kretprobe_count_page_pool_release_page_dma_hook", "count_page_pool_release_page_dma_hook", PROBE_TYPE_KRETPROBE, COUNT_PAGE_POOL_RELEASE, NULL}, - // {"kprobe_count_page_pool_recycle_in_cache_hook", "count_page_pool_recycle_in_cache_hook", PROBE_TYPE_KPROBE, COUNT_PAGE_POOL_RECYCLE, NULL}, - // {"kretprobe_count_page_pool_recycle_in_cache_hook", "count_page_pool_recycle_in_cache_hook", PROBE_TYPE_KRETPROBE, COUNT_PAGE_POOL_RECYCLE, NULL}, + {"kprobe_count_mlx5e_alloc_rx_mpwqe_perpage_hook", "mlx5_core:count_mlx5e_alloc_rx_mpwqe_perpage_hook", PROBE_TYPE_KPROBE, COUNT_MLX5E_RX_MPWQE_PER_PAGE,"mlx5_core"}, + {"kretprobe_count_mlx5e_alloc_rx_mpwqe_perpage_hook", "mlx5_core:count_mlx5e_alloc_rx_mpwqe_perpage_hook", PROBE_TYPE_KRETPROBE, COUNT_MLX5E_RX_MPWQE_PER_PAGE,"mlx5_core"}, + {"kprobe_count_page_pool_release_page_dma_hook", "count_page_pool_release_page_dma_hook", PROBE_TYPE_KPROBE, COUNT_PAGE_POOL_RELEASE, NULL}, + {"kretprobe_count_page_pool_release_page_dma_hook", "count_page_pool_release_page_dma_hook", PROBE_TYPE_KRETPROBE, COUNT_PAGE_POOL_RELEASE, NULL}, + {"kprobe_count_page_pool_recycle_in_cache_hook", "count_page_pool_recycle_in_cache_hook", PROBE_TYPE_KPROBE, COUNT_PAGE_POOL_RECYCLE, NULL}, + {"kretprobe_count_page_pool_recycle_in_cache_hook", "count_page_pool_recycle_in_cache_hook", PROBE_TYPE_KRETPROBE, COUNT_PAGE_POOL_RECYCLE, NULL}, }; const int num_probes_to_attach = sizeof(probes_to_attach) / sizeof(probes_to_attach[0]); struct bpf_link *attached_links[MAX_PROBES];