From 6cb3b77c7a990fcf215af6bd0f2fb954dbcfdbc5 Mon Sep 17 00:00:00 2001 From: Daniel Krebs Date: Wed, 14 Feb 2018 14:32:07 +0100 Subject: [PATCH] ips/intc: don't fail if setting IRQ affinity is not possible This is the case when the application is not executed as root which is now possible, with the drawback that we cannot set the IRQ affinity anymore. --- fpga/lib/ips/intc.cpp | 16 ++++++++++++++-- fpga/lib/kernel/kernel.c | 3 ++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fpga/lib/ips/intc.cpp b/fpga/lib/ips/intc.cpp index 6c841e4da..56d8f7877 100644 --- a/fpga/lib/ips/intc.cpp +++ b/fpga/lib/ips/intc.cpp @@ -21,6 +21,7 @@ *********************************************************************************/ #include +#include #include "config.h" #include "log.h" @@ -60,8 +61,19 @@ InterruptController::init() /* For each IRQ */ for (int i = 0; i < num_irqs; i++) { - /* Pin to core */ - if(kernel_irq_setaffinity(nos[i], card->affinity, nullptr) != 0) { + + /* Try pinning to core */ + int ret = kernel_irq_setaffinity(nos[i], card->affinity, nullptr); + + switch(ret) { + case 0: + // everything is fine + break; + case EACCES: + logger->warn("No permission to change affinity of VFIO-MSI interrupt. " + "This may degrade performance (increasing jitter)"); + break; + default: logger->error("Failed to change affinity of VFIO-MSI interrupt"); return false; } diff --git a/fpga/lib/kernel/kernel.c b/fpga/lib/kernel/kernel.c index dcac932db..a795c9f0f 100644 --- a/fpga/lib/kernel/kernel.c +++ b/fpga/lib/kernel/kernel.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -268,7 +269,7 @@ int kernel_irq_setaffinity(unsigned irq, uintmax_t affinity, uintmax_t *old) f = fopen(fn, "w+"); if (!f) - return -1; /* IRQ does not exist */ + return errno; if (old) ret = fscanf(f, "%jx", old);