j'ai fait une percée décisive dans la compréhension du bug,
lors de mes échanges mails avec les développeurs linux l'un d'eux avait fait une remarque intéressante :
- il s'était demandé pourquoi la valeur de la variable globale SCSI_QUEUE_DELAY était fixée arbitrairement à 3 millisecondes, sous-entendu que cette valeur était peut-être trop faible ou incompatible avec certains disques dur pas assez rapides et surtout avec le nouveau changement lié au commit "scsi: convert host_busy to atomic_t" ( commit qui est le vrai "premier bad commit" car j'ai refait un nouveau bisect )
http://git.kernel.org/cgit/linux/kernel ... a0a4e029ee
à l'époque personne n'avait rebondi sur sa remarque,
je me suis donc mis ce dimanche à explorer cette piste : modifier la valeur par défaut de SCSI_QUEUE_DELAY :
- valeur à 5 ms : pas de changement toujours le bug
- valeur à 6 ms : c'est mieux, le bug se produit beaucoup plus rarement
- valeur à 15 ms : idem, la probabilité d'apparition du bug est repoussé, mais se produit toujours
- valeur à 30 ms : presque parfait, le bug n'apparait maintenant que très rarement ( tous les 20 reboots, alors qu'avant c'était tous les 5 à 10 reboots )
- valeur à 40 ms : le bug a disparu ! J'ai dû faire une trentaine de reboots consécutifs et le bug n'est jamais apparu
j'ai donc crée ce patch qui impose manuellement la valeur de 40 ms que pour le if() de la ligne 1779 du fichier /drivers/scsi/scsi_lib.c :
Code : Tout sélectionner
--- a/drivers/scsi/scsi_lib.c 2014-10-05 21:23:04.000000000 +0200
+++ b/drivers/scsi/scsi_lib.c 2014-11-16 17:39:16.819674725 +0100
@@ -1776,7 +1776,7 @@ static void scsi_request_fn(struct reque
atomic_dec(&sdev->device_busy);
out_delay:
if (!atomic_read(&sdev->device_busy) && !scsi_device_blocked(sdev))
- blk_delay_queue(q, SCSI_QUEUE_DELAY);
+ blk_delay_queue(q, 40);
}
static inline int prep_to_mq(int ret)
cela a l'avantage de laisser la valeur de 3 ms pour SCSI_QUEUE_DELAY dans les autres parties du fichier où la fonction blk_delay_queue() est appelée, ici on utilise la valeur de 40 ms uniquement dans une partie précise du code source du fichier /drivers/scsi/scsi_lib.c,
après application du patch je n'ai pas constaté de lenteur de performance au niveau des opérations de lecture-écriture sur les disques durs