[ACTU] Nouveau Patch Linux Preempt-RT 2.6.33.9-rt31

Publié par cpb
Avr 22 2011

Le 11 avril dernier Thomas Gleixner a publié un nouveau patch pour le projet Linux Preempt RT. Celui-ci s’applique sur les noyaux de la branche long terme 2.6.33 (linux 2.6.33.9 en particulier). Ce patch implémente des améliorations par rapport au précédent, sans ajouter de véritables nouveautés. Il peut toutefois être intéressant de le mettre en œuvre et de le tester pour vérifier si les performances temps-réel d’un système sont améliorées.

Voici un exemple de mise en service sur une carte Igep v2.

1 – Téléchargement du nouveau patch Linux-Preempt-RT

[EDIT] Attention ! l’adresse du patch a changé depuis la rédaction de cet article, voir le commentaire de Thierry Gayet ci-dessous.

 

# cd ~/tmp/
# wget http://www.kernel.org/pub/linux/kernel/projects/rt/patch-2.6.33.9-rt31.bz2
 --2011-04-16 00:17:17--  http://www.kernel.org/pub/linux/kernel/projects/rt/patch-2.6.33.9-rt31.bz2
Resolving www.kernel.org... 199.6.1.164, 130.239.17.4
Connecting to www.kernel.org|199.6.1.164|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 275667 (269K) [application/x-bzip2] Saving to: “patch-2.6.33.9-rt31.bz2”  100%
[===============================================================================>] 275,667      761K/s   in 0.4s
2011-04-16 00:17:18 (761 KB/s) - “patch-2.6.33.9-rt31.bz2” saved [275667/275667]
#

2 – Téléchargement du noyau Linux 2.6.33.9

# wget http://www.kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.33/linux-2.6.33.9.tar.bz2
--2011-04-16 00:32:10--  http://www.kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.33/linux-2.6.33.9.tar.bz2
Resolving www.kernel.org... 199.6.1.164, 130.239.17.4
Connecting to www.kernel.org|199.6.1.164|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 66226244 (63M) [application/x-bzip2]
Saving to: “linux-2.6.33.9.tar.bz2”
100%[=========================================================================>] 66,226,244  1.58M/s   in 40s
2011-04-16 00:32:50 (1.58 MB/s) - “linux-2.6.33.9.tar.bz2” saved [66226244/66226244]
#

3 – Décompression des sources de Linux et du patch

# tar xjf linux-2.6.33.9.tar.bz2
# bunzip2 patch-2.6.33.9-rt31.bz2
#

4 – Application du patch Preempt-RT

# cd linux-2.6.33.9
# patch -p1 < ../patch-2.6.33.9-rt31 
patching file Documentation/hwlat_detector.txt
patching file Documentation/trace/histograms.txt
patching file MAINTAINERS
patching file Makefile
[...]
patching file sound/drivers/pcsp/pcsp.h
patching file sound/drivers/pcsp/pcsp_input.c
patching file sound/drivers/pcsp/pcsp_lib.c
patching file virt/kvm/kvm_main.c
#

5 – Compilation du noyau

Nous utilisons un fichier de configuration pour la carte Igep v2 déjà préparé avec une version antérieure.

# cp ../config-linux-2.6.33-rt  ./.config
# make ARCH=arm menuconfig

On vérifie que la configuration semble correcte. En particulier l’option « Preemption Mode » du menu « Kernel Features« , qui doit être configurée avec la valeur « Complete Preemption (Real-time)« . Nous quittons en sauvant la configuration et lançons la compilation avec :

# make   ARCH=arm   CROSS_COMPILE=/cross-arm-linux/usr/bin/arm-linux-  uImage  -j 16

Rappelons que l’option « CROSS_COMPILE contient un préfixe à ajouter avant le nom des outils de la chaîne de compilation Gnu (gcc, ld, as). Ceci permet de sélectionner le cross-compiler que nous avons généré dans un article précédent. On remarquera que nous compilons une « uImage » c’est-à-dire une image préparée pour uBoot, le boot-loader préinstallé sur la carte Igep. Enfin l’option « -j 16 » permet d’accélérer la compilation en faisant tourner 16 jobs en parallèle (on optimise ainsi l’utilisation des quatre cœurs de ce processeur).

6 – Installation du noyau compilé

Après quelques minutes, le noyau est prêt, on peut le copier sur la carte micro-SD utilisée pour le boot de la carte Igep :

[...]
Image Name:   Linux-2.6.33.9-rt31-rt-cpb
Created:      Sat Apr 16 00:43:14 2011
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    1870284 Bytes = 1826.45 kB = 1.78 MB
Load Address: 80008000
Entry Point:  80008000
  Image arch/arm/boot/uImage is ready
# cp arch/arm/boot/uImage  /media/boot/
# umount /media/boot/
#

7 – Test du nouveau noyau

La carte micro-SD est insérée dans la carte Igep v2, celle-ci est mise sous tension. Dès que les LEDs affichent le signe de vie habituel (dans un script de démarrage personnalisé), on peut se connecter depuis le PC par le réseau :

# ssh root@192.168.3.152
root@192.168.3.152's password:
BusyBox v1.16.1 (2011-03-10 12:17:29 CET) built-in shell (ash)
Enter 'help' for a list of built-in commands.
[IGEP]# uname -a
Linux (none) 2.6.33.9-rt31-rt-cpb #1 PREEMPT RT Sat Apr 16 00:43:05 CEST 2011 armv7l GNU/Linux
[IGEP]#

Il ne reste plus qu’à tester et vérifier si le comportement des tâches temps-réel d’un projet voient leur comportement s’améliorer sur ce nouveau patch, et éventuellement poster ses remarques dans la mailing-list « linux-rt-users@vger.kernel.org« .

7 Réponses

  1. Grégory dit :

    Bonjour,

    Comme vous j’ai essayé de rendre mon linux (3.0.35) RT via un patch.
    J’apllique les méthodes que vous décrivez en appliquant le patch et je compile le kernel (j’ai bien activé le « fully preemptible kernel (RT) » dans le make menuconfig).

    j’ai fais des modifs dans les fichiers plist.h et rtmutex.c. j’ai ajouté des librairies et des fonctions que le patch utilise mais qui n’étais pas déclaré dans ces fichiers

    C’est la que les ennuis commence, j’ai une erreur lors de la compilation du kernel :

    kernel/fork.c:92:1: error: implicit declaration of function ‘__RT_MUTEX_INITIALIZER_SAVE_STATE’ [-Werror=implicit-function-declaration]
    kernel/fork.c:92:1: warning: missing braces around initializer [-Wmissing-braces]
    kernel/fork.c:92:1: warning: (near initialization for ‘tasklist_lock.lock’) [-Wmissing-braces]
    kernel/fork.c:92:1: error: initializer element is not constant
    kernel/fork.c:92:1: error: (near initialization for ‘tasklist_lock.lock.wait_lock.raw_lock.lock’)
    cc1: some warnings being treated as errors
    make[1]: *** [kernel/fork.o] Error 1
    make: *** [kernel] Error 2

    Je ne sais pas a quoi cela correspond. Votre aide est la bienvenue.

    Merci

    • cpb dit :

      Bonjour,

      L’erreur affichée est visiblement due à une erreur dans rtmutex.c

      Il faut appliquer le patch PREEMPT_RT sur un noyau standard (provenant de http://www.kernel.org) avec exactement le même numéro de version, sans modifier le noyau auparavant.

      Quelles sont les modifications que vous souhaitez apporter dans plist.h et rtmutex.c ?

      • Grégory dit :

        Bonjour,

        Oui le patch a le même numero de version que mon linux.

        Comme je développe sur une carte et que je veux la rendre RT, je l’ai deja patché avec ce patch et fais les même modifs, j’ai réussi a compilé cette distrib correctement (elle me sert a booter la carte)
        Maintenant je cherche a compiler mes modules test dans le même format que celui de la carte, donc je patch mon kernel pour le faire et c’est la la que j’ai des problèmes.

        Par contre il y a une fonction : plist_head_init_raw que le patch utilise mais qui n’est défini dans aucun fichier.

        Donc j’ai dans plist.h rajouté la fonction suivante + une librairie (« #include « ) :

        static inline void plist_head_init_raw(struct plist_head *head, raw_spinlock_t *lock)
        {
        INIT_LIST_HEAD(&head->node_list);
        }

        Dans rtmutex.c j’ai juste rajouté des librairies pour faire appel a cette fonction (rien de bien méchant en soi)

URL de trackback pour cette page