xref: /linux/tools/testing/selftests/kvm/lib/proc_util.c (revision 67f8bc848ee31831336bd478e57d2f993551902e)
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