2013-01-16 3 views
4

La situation est que j'ai 2 cartes connectées ensemble via le bus PCIE. Un conseil est le rootport et un conseil est le point final. Le côté du point de terminaison a exporté une région de mémoire vers le côté du rootport.protéger la zone de mémoire partagée dans les multiprocesseurs

La communication entre deux cartes est implémentée via une file d'attente de messages logicielle. Les méta-données et le tampon de la file d'attente sont tous situés dans la région de mémoire exportée.

Les deux côtés peuvent accéder à la zone mémoire en même temps (port racine via son bus PCIE et point de terminaison via son bus local). Cela peut poser problème lorsque les deux parties tentent de mettre à jour les méta-données de la file d'attente.

Au début, j'ai essayé d'allouer un spinlock_t sur la même région de mémoire exportée, mais comme chaque carte est uniprocesseur, the spinlock_t n'est pas alloué de toute façon.

Quelqu'un peut-il suggérer un mécanisme pour protéger la région partagée ou recommander une autre approche pour communiquer entre deux cartes? Toutes les recommandations sont appréciées. Merci beaucoup!

+0

Je pense que vous devriez essayer sémaphore à la place de spinlocks ... parce que sur les systèmes d'un seul processeur spinlocks n'ont aucune utilité !!! – akp

Répondre

1

Nous vous remercions de votre intérêt jusqu'à présent.

Nous avons finalement implémenté la communication en mémoire partagée avec la file d'attente circulaire. L'implémentation peut être référencée à partir de cette link. Nous réduisons le problème à un seul consommateur producteur unique ainsi la file d'attente circulaire ne nécessite pas de verrou à protéger. La limitation de cette approche est que nous devons créer une file d'attente pour chaque connexion homologue.

Dans PCIE spec, il y a aussi des sections décrites dans l'opération atomique, malheureusement notre contrôleur hôte PCIE ne supporte pas cette fonctionnalité, donc nous ne pouvons pas utiliser cette fonctionnalité.

Questions connexes