1362cc001SDavid Matlack // SPDX-License-Identifier: GPL-2.0 2362cc001SDavid Matlack #include "kvm_util.h" 3362cc001SDavid Matlack #include "test_util.h" 4362cc001SDavid Matlack #include "proc_util.h" 5362cc001SDavid Matlack 6362cc001SDavid Matlack static FILE *open_proc_interrupts(void) 7362cc001SDavid Matlack { 8362cc001SDavid Matlack FILE *fp; 9362cc001SDavid Matlack 10362cc001SDavid Matlack fp = fopen("/proc/interrupts", "r"); 11362cc001SDavid Matlack TEST_ASSERT(fp, "fopen(/proc/interrupts) failed"); 12362cc001SDavid Matlack 13362cc001SDavid Matlack return fp; 14362cc001SDavid Matlack } 15362cc001SDavid Matlack 16362cc001SDavid Matlack unsigned int vfio_msix_to_host_irq(const char *device_bdf, int msix) 17362cc001SDavid Matlack { 18362cc001SDavid Matlack char search_string[64]; 19362cc001SDavid Matlack char line[4096]; 20362cc001SDavid Matlack int irq = -1; 21362cc001SDavid Matlack FILE *fp; 22362cc001SDavid Matlack 23362cc001SDavid Matlack fp = open_proc_interrupts(); 24362cc001SDavid Matlack 25362cc001SDavid Matlack snprintf(search_string, sizeof(search_string), "vfio-msix[%d]", msix); 26362cc001SDavid Matlack 27362cc001SDavid Matlack while (fgets(line, sizeof(line), fp)) { 28362cc001SDavid Matlack if (strstr(line, device_bdf) && strstr(line, search_string)) { 29362cc001SDavid Matlack TEST_ASSERT_EQ(1, sscanf(line, "%d:", &irq)); 30362cc001SDavid Matlack break; 31362cc001SDavid Matlack } 32362cc001SDavid Matlack } 33362cc001SDavid Matlack 34362cc001SDavid Matlack fclose(fp); 35362cc001SDavid Matlack 36362cc001SDavid Matlack TEST_ASSERT(irq != -1, "Failed to locate IRQ for %s %s", device_bdf, 37362cc001SDavid Matlack search_string); 38362cc001SDavid Matlack return (unsigned int)irq; 39362cc001SDavid Matlack } 40362cc001SDavid Matlack 41*380b0e5eSJosh Hilke void proc_irq_set_smp_affinity(unsigned int irq, int cpu) 42*380b0e5eSJosh Hilke { 43*380b0e5eSJosh Hilke char path[PATH_MAX]; 44*380b0e5eSJosh Hilke int r, fd; 45*380b0e5eSJosh Hilke 46*380b0e5eSJosh Hilke snprintf(path, sizeof(path), "/proc/irq/%u/smp_affinity_list", irq); 47*380b0e5eSJosh Hilke fd = open(path, O_RDWR); 48*380b0e5eSJosh Hilke TEST_ASSERT(fd >= 0, "Failed to open %s", path); 49*380b0e5eSJosh Hilke 50*380b0e5eSJosh Hilke r = dprintf(fd, "%d\n", cpu); 51*380b0e5eSJosh Hilke TEST_ASSERT(r > 0, "Failed to affinitize IRQ-%u to CPU %d", irq, cpu); 52*380b0e5eSJosh Hilke 53*380b0e5eSJosh Hilke kvm_close(fd); 54*380b0e5eSJosh Hilke } 55