6 votes

spin_lock_irqsave imbriqué

Si le code est le suivant

void test(void)
{
  spin_lock_irqsave(&lock1, flag);
  ...
  func1();
  ...
  spin_unlock_irqrestore(&lock1, flag);
}

void func1(void)
{
  spin_lock_irqsave(&lock2, flag);
  ...
  spin_unlock_irqrestore(&lock2, flag);
}

Y aura-t-il un problème avec le code ? lorsque le spin_unlock_irqrestore est appelé dans func1, l'interruption sera-t-elle déjà activée ? Ce que je veux réaliser est test() La routine peut être exécutée sans aucune interruption par le planificateur ou les interruptions. Merci beaucoup

6voto

Tony The Lion Points 28208

D'après ce que j'ai pu trouver dans la documentation, et je n'ai pas complètement épuisé mes recherches, la fonction flag sauvegardera l'état des bits qui activent les différents drapeaux, puis désactivera les interruptions, pour ensuite le restaurer à la fin. Si les interruptions ont été désactivées par le premier appel à la fonction test et que vous effectuez un autre appel, je supposerais (et rien n'indique le contraire à ma connaissance) qu'il laisserait les interruptions désactivées, stockerait le fichier flags et les restaurer à l'intérieur func() et ensuite les restaurer à l'état flag a en test .

Les interruptions ne doivent être réactivées qu'après que votre test fonction.

Je dirais que votre seul problème est que vous ne pouvez pas utiliser le même flag dans les deux fonctions, sinon vous écraserez la première dans votre appel interne et la réinitialiserez ensuite, et si un drapeau a changé entre vos deux appels, vous risquez de réinitialiser l'appel externe à un état incorrect.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X