2017-10-18 24 views
3

J'essaie de développer un logiciel en utilisant libpmem. Je suis en train de mettre en place un environnement de test, où je peux émuler pmem et faire en sorte que la bibliothèque le reconnaisse comme tel. Je suis soit avoir des problèmes, ou ne pas comprendre quelque chose sur la façon dont pmem est géré par mmap.Essayer d'obtenir émulé pmem être reconnu par libpmem comme pmem

J'ai suivi ceci: http://pmem.io/2016/02/22/pm-emulation.html

Tout est superbe. Les journaux d'amorçage affichent la mémoire de type 12 dans les plages que j'ai spécifiées. J'ai créé un système de fichiers ext4 sur/dev/pmemXX, puis l'ai monté avec dax. Donc maintenant j'ai:

$ mount | grep pmem 
/dev/pmem0m on /mnt/mem type ext4 (rw,relatime,dax,data=ordered) 

Maintenant, je rencontre un problème. Je crée un fichier, /mnt/mem/data/test1. Ensuite, j'exécute l'exemple de copie simple de libpmem. Dans ce cas, je lance un appel:

addr = pmem_map_file("/mnt/mem/data/test2", ...) 

Le fichier est créé et les données y sont copiées. Le problème vient quand je reçois le résultat de:

is_pmem = pmem_is_pmem(addr, file_size) 

L'adresse retournée par l'appel à pmem_map_file n'enregistre pas pmem. Lorsque je parcours le code, il est clair que le addr renvoyé par le mappage ne se trouve pas dans la plage de mémoire que j'ai réservée comme mémoire de type émulé 12. En outre, le chemin d'accès au fichier /mnt/mem/data/test2 ne s'enregistre pas en tant que périphérique de caractères Dax lorsque la bibliothèque utilise le fichier stat, de sorte que l'adresse mappée et le chemin de fichier échouent tous les tests pour être reconnus comme pmem. À la lecture de DAX, il semble que les systèmes de fichiers montés en tant que DAX disposent directement de la mémoire des fichiers mappés et ne sont pas copiés dans la RAM réelle. J'essaie de comprendre ce que cela signifie sur le addr retourné lorsque le fichier est mappé. Je sens qu'il me manque quelque chose ici. Ne devrait pas un fichier mappé dans un système de fichiers construit sur emem emulated, monté en tant que DAX, retourner vrai lorsque je demande si c'est pmem?

*** EDIT

Merci Piotr pour la clarification. Je peux utiliser PMEM_IS_PMEM_FORCE, mais je voudrais aussi regarder le fonctionnement du périphérique Dax. J'essaye de reconfigurer l'espace de noms à l'appareil Dax, mais n'ayant pas de succès.

$ sudo strace ./local/opt/bin/ndctl create-namespace -f -e namespace0.0 -m dax 
. . . 
open("/sys/devices/platform/e820_pmem/ndbus0/region0/pfn0.0/align", 
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/sys/devices/platform/e820_pmem/ndbus0/region0/pfn0.0/resource", 
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/sys/devices/platform/e820_pmem/ndbus0/region0/pfn0.0/size", 
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
getdents(3, /* 0 entries */, 32768)  = 0 
close(3)        = 0 
open("/sys/devices/platform/e820_pmem/ndbus0/region0/dax_seed", 
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
write(2, "failed to reconfigure namespace:"..., 66failed to reconfigure 
namespace: Resource temporarily unavailable 
) = 66 
exit_group(245)       = ? 
+++ exited with 245 +++ 

Peut-être que c'est un problème avec le noyau que je cours? (4.4.0-97 Ubuntu)

+0

Je pense que la balise [tag: dax] fait référence à une chose différente. Je ne sais pas s'il y a une étiquette pour votre type de dax. – mendosi

+0

Désolé à ce sujet. Je l'ai réparé. – Megan

Répondre

1

La bibliothèque fonctionne comme prévu. S'il vous plaît voir la note actuelle (1.3 au moment de la rédaction) version de man 3 libpmem en ce qui concerne l'état du noyau linux permettant de la mémoire persistante:

REMARQUE: Sous Linux, pmem_is_pmem() retourne vrai que si la gamme est mappé directement à partir du périphérique DAX (/dev/daxX.Y) sans système de fichiers intervenant . Dans le futur, lorsque les systèmes de fichiers deviendront disponibles et que le vidage avec pmem_persist() sera pris en charge, pmem_is_pmem() retournera vrai comme approprié. AVERTISSEMENT: L'utilisation de pmem_persist() sur une plage où pmem_is_pmem() renvoie false peut ne pas être utile - utilisez plutôt msync (2).

Cela devrait changer bientôt, voir le synchronous page faults patches.

En attendant, vous avez deux options si vous voulez pmem_is_pmem() retourner true:

  • Utilisez la variable d'environnement PMEM_IS_PMEM_FORCE=1, cela va forcer la fonction à retourner vrai.
  • Reconfigurez votre périphérique pmem émulé en périphérique dax. Pour cette tâche, vous aurez besoin de ndctl. La commande est: ndctl create-namespace -f -e namespaceX.Y -m dax où X est l'ID de région et Y est l'ID de l'espace de noms dans la région (probablement namespace0.0 si vous avez seulement configuré un périphérique émulé).

dispositif DAX est un dispositif spécial de caractères qui permet à un de mmap et effectuer en toute sécurité le rinçage userspace, alors que dans le cas de tous les systèmes de fichiers Linux actuels il pourrait être arrière-plan/travail asynchrone comme l'allocation Etendues, defrag en direct et ainsi de suite - cela signifie que sur fs réguliers, malgré le montage comme dax, vous devez toujours appeler msync() pour assurer la cohérence de vos données. Et c'est ce que pmem_is_pmem() vous informe.

Vous pouvez en savoir plus sur le problème here.

+0

Merci d'avoir précisé cela. Je n'étais pas clair (et je suis encore un peu flou) sur la façon dont le périphérique dax fonctionne par rapport aux systèmes de fichiers montés avec l'option dax. J'ai tenté de reconfigurer l'espace de noms avec ndctl comme vous le suggérez. Pour une raison quelconque, je continue d'obtenir une erreur "Ressource temporairement indisponible". J'ai essayé de désactiver l'espace de noms manuellement, et j'ai même essayé de le supprimer, mais jusqu'à présent je n'ai pas réussi à le reconfigurer avec succès. – Megan

+0

J'ai ajouté plus d'informations sur DAX à la poste. Je vous encourage à lire l'article LWN que j'ai lié si vous êtes intéressé par les détails. En ce qui concerne votre problème, je crains de ne jamais avoir rencontré votre problème. Quelles versions du noyau/ndctl utilisez-vous? Je recommande fortement d'utiliser le dernier noyau (4.13 au moment de l'écriture) et le dernier ndctl (v58.2). –