54 lines · 1.2 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0#include "kvm_util.h"#include "test_util.h"#include "proc_util.h" static FILE *open_proc_interrupts(void){	FILE *fp; 	fp = fopen("/proc/interrupts", "r");	TEST_ASSERT(fp, "fopen(/proc/interrupts) failed"); 	return fp;} unsigned int vfio_msix_to_host_irq(const char *device_bdf, int msix){	char search_string[64];	char line[4096];	int irq = -1;	FILE *fp; 	fp = open_proc_interrupts(); 	snprintf(search_string, sizeof(search_string), "vfio-msix[%d]", msix); 	while (fgets(line, sizeof(line), fp)) {		if (strstr(line, device_bdf) && strstr(line, search_string)) {			TEST_ASSERT_EQ(1, sscanf(line, "%d:", &irq));			break;		}	} 	fclose(fp); 	TEST_ASSERT(irq != -1, "Failed to locate IRQ for %s %s", device_bdf,		    search_string);	return (unsigned int)irq;} void proc_irq_set_smp_affinity(unsigned int irq, int cpu){	char path[PATH_MAX];	int r, fd; 	snprintf(path, sizeof(path), "/proc/irq/%u/smp_affinity_list", irq);	fd = open(path, O_RDWR);	TEST_ASSERT(fd >= 0, "Failed to open %s", path); 	r = dprintf(fd, "%d\n", cpu);	TEST_ASSERT(r > 0, "Failed to affinitize IRQ-%u to CPU %d", irq, cpu); 	kvm_close(fd);}