# Attivazione DMA e parametri hdparm.

## Sw0rdmast3r

Salve, avevo dei problemi riguardanti hdparm, difatti dando hdparm -d 1 /dev/hdc mi restituiva:

```
 hdparm -d 1 /dev/hdc

/dev/hdc:

 setting using_dma to 1 (on)

 HDIO_SET_DMA failed: Operation not permitted

 using_dma     =  0 (off)
```

Così ho guardato https://forums.gentoo.org/viewtopic-t-568149-highlight-hdparm.html e, disabilitanto ATA e abilitando Serial ATA, effettivamente le prestazioni dell'hard disk sono migliorate, ed inoltre i dispositivi si montano automaticamente(cosa che prima non succedeva). Quando però provo ad usare hdparm:

```
localhost francesco # hdparm -d 1 /dev/sda

/dev/sda:

 setting using_dma to 1 (on)

 HDIO_SET_DMA failed: Inappropriate ioctl for device

```

E via dicendo con vari altri parametri, a parte -W.

Come posso risolvere? Grazie.

----------

## Josuke

con i dischi sata non serve usare hdparm:

https://forums.gentoo.org/viewtopic-p-2583806.html?sid=4bb6dfc64bfbd8522df5da7fad0365e9

----------

## Sw0rdmast3r

Grazie della delucidazione  :Smile: 

----------

## djinnZ

per settare scsi, sata ed i nuovi pata devi usare sys-apps/sdparm non hdparm.

----------

## riverdragon

Premessa: il wiki non è accessibile, e non ho trovato informazioni sufficientemente recenti cercando nel forum.

Oggi, dopo l'aggiornamento di udev di ieri sera, mi sono messo a controllare il corretto funzionamento del disco. Si tratta di un disco ATA che fa uso dei nuovi driver PATA presenti nel kernel dal 2.6.19 (al momento uso il kernel 2.6.22-gentoo-r1). Ho scoperto che, per un errore di impostazione, le opzioni di /etc/conf.d/hdparm non venivano lette: erano infatti relative ai drive marcati hdX mentre la nuova libreria li vede tutti come sdX. Sistemando questa disattenzione, mi si sono presentati quattro errori:

```
tommi@tomnote ~ $ sudo /etc/init.d/hdparm restart

 * Caching service dependencies ...                                                                                                                                   [ ok ]

 * Service hdparm stopping

 * WARNING:  you are stopping a boot service.

 * Service hdparm stopped

 * Service hdparm starting

 * Running hdparm on /dev/sda ...

 HDIO_SET_32BIT failed: Invalid argument

 HDIO_SET_UNMASKINTR failed: Inappropriate ioctl for device

 HDIO_SET_DMA failed: Inappropriate ioctl for device

 HDIO_SET_KEEPSETTINGS failed: Inappropriate ioctl for device                                                                                                         [ ok ]

 * Service hdparm started
```

La riga di configurazione era questa

```
sata_all_args="-d1 -c3 -u1 -W0 -k1 -K1"
```

Detto in maniera comprensibile, sono attivati il DMA, i trasferimenti a 32 bit con "sincronizzazione", lo smascheramento degli interrupt, le opzioni per il salvataggio delle impostazioni, e disabilitata la write cache. Andando a verificare la situazione manualmente, questo è quello che si presenta:

```
tomnote linux # hdparm /dev/sda

/dev/sda:

 IO_support    =  0 (default 16-bit)

 readonly      =  0 (off)

 readahead     = 256 (on)

 geometry      = 12161/255/63, sectors = 195371568, start = 0
```

```
tomnote linux # hdparm -i /dev/sda

/dev/sda:

 Model=FUJITSU MHV2100AH                       , FwRev=00000096, SerialNo=        NT01T5725RMW

 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }

 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0

 BuffType=DualPortCache, BuffSize=8192kB, MaxMultSect=16, MultSect=?16?

 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=195371568

 IORDY=yes, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}

 PIO modes:  pio0 pio1 pio2 pio3 pio4 

 DMA modes:  mdma0 mdma1 mdma2 

 UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 

 AdvancedPM=yes: mode=0x80 (128) WriteCache=disabled

 Drive conforms to: ATA/ATAPI-6 T13 1410D revision 3a:  ATA/ATAPI-2,3,4,5,6

 * signifies the current active mode
```

Da qui, il dma risulta attivo. Ma

```
tomnote linux # hdparm -c /dev/sda

/dev/sda:

 IO_support    =  0 (default 16-bit)
```

il trasferimento a 32 bit non lo è

```
tomnote linux # hdparm -u /dev/sda

/dev/sda:
```

dello smascheramento non si sa nulla,

```
tomnote linux # hdparm -d /dev/sda

/dev/sda:
```

e non ottengo risposta nemmeno con una query sul DMA.

Rimuovendo dalla riga di configurazione le opzioni non digerite dal sistema (-d1 -c3 -u1 -k1) le prestazioni sembrano comunque buone, per un disco ATA (non SATA) a 5400 rpm:

```
tomnote ~ # hdparm -tT /dev/sda

/dev/sda:

 Timing cached reads:   2126 MB in  2.00 seconds = 1063.03 MB/sec

 Timing buffered disk reads:  100 MB in  3.04 seconds =  32.85 MB/sec
```

Sembra quasi che i nuovi driver nel kernel precludano l'accesso a certe opzioni, mentre non riescano a riconoscerne altre. Qualcuno di voi ha qualche aiuto da darmi, per capire quantomeno se ciò che mi si presenta è un problema o no? Grazie.

EDIT: allego un paio di "snippet" dalla configurazione del kernel

```
tomnote ~ # grep DMA /boot/config

CONFIG_ZONE_DMA=y

CONFIG_GENERIC_ISA_DMA=y

CONFIG_ZONE_DMA_FLAG=1

CONFIG_ISA_DMA_API=y

# CONFIG_PDC_ADMA is not set

# CONFIG_PATA_OPTIDMA is not set

# DMA Engine support

# CONFIG_DMA_ENGINE is not set

# DMA Clients

# DMA Devices

CONFIG_HAS_DMA=y

tomnote ~ # grep ATA /boot/config | grep -v \#

CONFIG_ATA=y

CONFIG_ATA_ACPI=y

CONFIG_SATA_AHCI=y

CONFIG_ATA_PIIX=y

CONFIG_ATA_GENERIC=y

CONFIG_PATA_MPIIX=y

CONFIG_PATA_OLDPIIX=y
```

----------

## riverdragon

Toc toc...

----------

## !equilibrium

la nuova libreria PATA vede i dispositivi come se fossero device SATA (/dev/sd*), per tando non devi usare hdparm, ma sdparm.

nota: i device SATA(/SCSI) non hanno le stesse voci hdparm e sdparm, per esempio non deve essere settato il DMA o l'unmasking perchè viene già fatto in automatico.

/EDIT: sbaglio o tu stesso hai risposto a questo thread ?   :Rolling Eyes: 

/EDIT: fatto il merge con il thread aperto da @riverdragon

----------

## riverdragon

Ehm... ops!  :Embarassed:  che figura!

Grazie, ora provo.

EDIT: sdparm non funziona come sdparm, le opzioni sono diverse, quelle che hanno un corrispondente sono qui http://sg.torque.net/sg/sdparm.html ma sono pochine; vedo inoltre che sdparm non installa uno script in /etc/init.d, quindi non è possibile avviarlo automaticamente all'avvio (ma forse non ce n'è bisogno); dentro a /etc/conf.d/hdparm vedo però

```
# or you can set options for all SATA drives

sata_all_args="..."
```

quindi immagino che, con i dovuti limiti, anche hdparm vada bene per i SATA. La situazione sinceramente è poco chiara. Paradossalmente potrei evitare di avviare hdparm all'accensione del sistema e non noterei alcuna differenza.

----------

## !equilibrium

 *riverdragon wrote:*   

> EDIT: sdparm non funziona come hdparm, le opzioni sono diverse, quelle che hanno un corrispondente sono qui http://sg.torque.net/sg/sdparm.html ma sono pochine

 

e chi ha detto che i parametri debbano essere per forza uguali? il SATA è un derivato dello SCSI e ne ha ereditato, oltre ad altri aspetti, anche il set di comandi hardware, per questo si usa sdparm con i SATA. attualmente sdparm è l'utility più completa per la gestione dei set di comandi SCSI.

NOTA: il link che hai citato è una guida sull'uso di sdparm, non una tabella che mette a confronto gli equivalenti set di comandi ATA/SCSI.

 *riverdragon wrote:*   

> vedo inoltre che sdparm non installa uno script in /etc/init.d, quindi non è possibile avviarlo automaticamente all'avvio (ma forse non ce n'è bisogno)

 

infatti non ce n'è bisogno per il semplice motivo che i comandi SCSI, una volta salvati, si possono rendere permanenti. questo non avviene invece per i PATA i quali perdono i settaggi ad ogni hardreset del pc (sì lo so che esistono le opzioni di hdparm -k e -K ma non sono *permanenti*).

 *riverdragon wrote:*   

> dentro a /etc/conf.d/hdparm vedo però
> 
> ```
> # or you can set options for all SATA drives
> 
> ...

 

hdparm ha un *parziale* supporto per i SATA, questo vuol dire che alcune sue opzioni (molto poche, le conti sulle dita di una mano e avanzano pure dita alla fine del conteggio) si possono usare anche sui SATA. Queste opzioni le puoi applicare ai tuoi disci SATA usando le voci sata_all_args o sd?_* in /etc/conf.d/hdparm. sinceramente non ci vedo nulla di misterioso o confuso, quelle voci servono per applicare le opzioni di hdparm a seconda della tipologia di disco in possesso: se ho ATA userò le voci hd?_*, se ho SATA usero sd?_* (ovviamente se si dispone sia di device PATA che SATA le due tipologie di voci andranno usate contemporamente).

----------

## riverdragon

Hai sicuramente ragione equilibrium, ma ciò non toglie che il mio disco sia un PATA che il kernel vede come un SATA, quindi né un vero SATA né uno SCSI. Che poi il kernel lo tratti come un SATA non cambia tutto, perché l'hardware è rimasto come prima.

Per esempio, il comando per disabilitare la write cache del disco dato da sdparm restituiva un errore!

Il link che ho dato prima è quello contenuto nell'ebuild di sdparm. Verificherò e cercherò le altre opzioni per sdparm, per provare a fare quello che facevo con hdparm.

----------

## djinnZ

 *riverdragon wrote:*   

> Per esempio, il comando per disabilitare la write cache del disco dato da sdparm restituiva un errore!

 

quale comando? quello citato qui? Se non sono del tutto rimbambito una delle diffrenze tra i nuovi ed i vecchi driver è che disabilitano del tutto le funzioni notoriamente buggate dell'hardware (ed in particolare la write cache).

----------

