Sei sfortunato con l'invocazione delle funzioni dello spazio utente dal kernel poiché il kernel non lo fa e non dovrebbe conoscere le funzioni e la logica delle singole applicazioni dello spazio utente, per non parlare del fatto che ogni applicazione dello spazio utente ha la propria memoria layout, che nessun altro processo né il kernel possono invadere in quel modo (gli oggetti condivisi sono l'eccezione qui, ma non puoi comunque attingere a quello dallo spazio del kernel). Per quanto riguarda il modello di sicurezza, non dovresti eseguire il codice dello spazio utente (che è automaticamente considerato codice non sicuro nel contesto del kernel) nel contesto del kernel in primo luogo poiché ciò interromperà il modello di sicurezza di un kernel proprio lì in quell'istante. Ora, considerando tutto quanto sopra menzionato, oltre a molti altri motivi, potresti voler riconsiderare il tuo approccio e concentrarti su Kernel <-> IPC e interfacce dello spazio utente del kernel, il file system o l'API helper in modalità utente (leggi sotto).
Tuttavia, puoi richiamare le app dello spazio utente dal kernel, utilizzando l'API usermode-helper. Il seguente articolo di IBM DeveloperWorks dovrebbe iniziare a utilizzare l'API del kernel Linux usermode-helper:
API del kernel, parte 1:richiamo di applicazioni in spazio utente dal kernel
Penso che il modo più semplice sia registrare un dispositivo a caratteri che diventa pronto quando il dispositivo ha dei dati.
Qualsiasi processo che tenta di leggere da questo dispositivo viene quindi messo in sospensione finché il dispositivo non è pronto, quindi riattivato, a quel punto può fare la cosa appropriata.
Se vuoi solo segnalare la disponibilità, un lettore potrebbe semplicemente leggere un singolo byte nullo.
Il programma in spazio utente dovrebbe quindi solo eseguire una chiamata di blocco read() e verrebbe bloccato in modo appropriato fino a quando non lo riattivi.
Dovrai conoscere il meccanismo della coda di attesa dello scheduler del kernel per usarlo.
Sembra che la tua linea di interruzione sia già disponibile per lo spazio utente tramite gpiolib? (/sys/class/gpio/...)
Hai verificato se gpio edge triggering e poll() sono abbastanza veloci per te? In questo modo non è necessario eseguire il polling dello stato dall'applicazione dello spazio utente, ma l'edge triggering lo riporterà tramite poll(). Vedi Documentation/gpio.txt nei sorgenti del kernel.
Se l'edge triggering tramite sysfs non è abbastanza buono, allora il modo corretto è sviluppare un driver del kernel che si occupi della parte critica in termini di tempo ed esporti i risultati nello spazio utente tramite un'API (sysfs, device node, ecc.).