Уведомление о прерывании Linux в пространстве пользователя - PullRequest
0 голосов
/ 30 октября 2019

Я использую ядро ​​Linux с патчем preempt-rt, я провел простой тест для измерения времени между прерыванием и уведомлением о прерывании в пространстве пользователя. Идея довольно проста, у меня есть модуль, который реализует чтение:

static ssize_t my_read(struct file *filp, char __user *buf, size_t count,loff_t *f_pos)
{
   atomic_set(&intflag, 0);
   if (wait_event_interruptible(my_hack, atomic_read(&intflag) != 0))
        return -ERESTARTSYS;
   do_gettimeofday(&tv2);
   trace_printk("wait_event_interruptible% d\n",(int) (tv2.tv_usec - tv1.tv_usec));
    return 0;
}

, затем из процедуры прерывания я запускаю чтение:

static irqreturn_t

my_interrupt(int irq, void *dev_id)
{
 ...
 atomic_set(&intflag,1);
 do_gettimeofday(&tv1);
 wake_up_interruptible(&mm_fec_hack);

return IRQ_HANDLED;
}

Напечатанное значение составляет около 65 и 70, например

myproc-532 [002] ....... 8049.789350: 0xbf0c81f0: wake_up_interruptible 65

Мой ЦП является 4-ядерным:

название модели: ARMv7 Processor rev 10 (v7l) BogoMIPS: 7.54

и частота

cat / sys / devices / system / cpu/ cpu0 / cpufreq / scaling_cur_freq 996000

Я думаю, что 65-70 нас - это в значительной степени для пробуждения процесса.

Я пытался изменить irq и приоритет процесса с помощью chrt и вынести внизIRQ для конкретного ядра с smp_affinity и процесс на том же ядре или другом ядре с набором задач, но результаты в основном не меняются.

Что я делаю не так?

...