+
     GiC  c                   s    ^ RI t ^RIHt ^RI5 ^ RIt^ RIHt ^ RIH	t	 ^ RI
t
^ RIt]P                  P                  4       t ! R R]P                  4      tR# )    N)hotplug)Z*)commandsc                   s  a a ] tR t^t oRtV 3R ltV 3R ltR tR t]	R 4       t
R tR tV 3R	 ltV 3R
 ltV 3R lt]	R 4       t]	R 4       tR tR tV 3R ltR tR tR tR tR tR tR tV 3R ltR tR3R ltR t] ! RRR7      R 4       t!]"! R4      R4R  l4       t#] ! R!RR7      R" 4       t$]"! R!4      R4R# l4       t%] ! R$RR7      R% 4       t&]"! R$4      R4R& l4       t'R' t(R( t)] ! R)RR7      R* 4       t*]"! R)4      R4R+ l4       t+],! R,RR7      R- 4       t-R. t.] ! R/RR7      R0 4       t/]"! R/4      R4R1 l4       t0R2t1Vt2V ;t3# )5
DiskPlugina  
Plug-in for tuning various block device options. This plug-in can also
dynamically change the advanced power management and spindown timeout
setting for a drive according to the current drive utilization. The
dynamic tuning is controlled by the [option]`dynamic` and the global
[option]`dynamic_tuning` option in `tuned-main.conf`.

The disk plug-in operates on all supported block devices unless a
comma separated list of [option]`devices` is passed to it.

.Operate only on the `sda` block device
====
----
[disk]
devices=sda
----
====

The [option]`elevator` option sets the Linux I/O scheduler.

.Use the bfq I/O scheduler on the `xvda` block device
====
----
[disk]
device=xvda
elevator=bfq
----
====

The [option]`scheduler_quantum` option only applies to the CFQ I/O
scheduler. It defines the number of I/O requests that CFQ sends to
one device at one time, essentially limiting queue depth. The default
value is 8 requests. The device being used may support greater queue
depth, but increasing the value of quantum will also increase latency,
especially for large sequential write work loads.

The [option]`apm` option sets the Advanced Power Management feature
on drives that support it. It corresponds to using the `-B` option of
the `hdparm` utility. The [option]`spindown` option puts the drive
into idle (low-power) mode, and also sets the standby (spindown)
timeout for the drive. It corresponds to using `-S` option of the
`hdparm` utility.

.Use a medium-agressive power management with spindown
====
----
[disk]
apm=128
spindown=6
----
====

The [option]`readahead` option controls how much extra data the
operating system reads from disk when performing sequential
I/O operations. Increasing the `readahead` value might improve
performance in application environments where sequential reading of
large files takes place. The default unit for readahead is KiB. This
can be adjusted to sectors by specifying the suffix 's'. If the
suffix is specified, there must be at least one space between the
number and suffix (for example, `readahead=8192 s`).

.Set the `readahead` to 4MB unless already set to a higher value
====
----
[disk]
readahead=>4096
----
====
The disk readahead value can be multiplied by the constant
specified by the [option]`readahead_multiply` option.
c                s   < \         \        V `
  ! V/ VB  . ROV n        . ROV n        \        V P                  4      V n        ^V n        RV n        \        4       V n
        R# )   g{Gz?N)r   i   i   i   i   i}   ii   iU   F   i7   i   i   )r    i   i   i   i   i   i   i   in   iZ   r   i<   )superr   __init___power_levels_spindown_levelslen_levels_level_steps_load_smallestr   _cmd)selfZargsZkwargs	__class__s   &*,>/usr/lib/python3.14/site-packages/tuned/plugins/plugin_disk.pyr   ZDiskPlugin.__init__U   sR    
D"D3F3N$Q$T''($,$$j$)    c                sb  < \         \        V `  4        R V n        R V n        \        4       V n        \        4       V n        V P                  P                  R4       FA  pV P                  V4      '       g   K  V P                  P                  VP                  4       KC  	  \        4       V n        R# )TblockN)r   r   _init_devices_devices_supported_use_hdparmset_free_devicesZdict_hdparm_apm_device_support_hardware_inventoryZget_devices_device_is_supportedZaddZsys_name_assigned_devices)r   devicer   s   & r   r   ZDiskPlugin._init_devices_   s    
D') $$u$$(F$!((44W=f
''6??+ > 5$r   c                sb    V Uu. uF  q P                   P                  R V4      NK   	  up# u upi )r   )r   Z
get_device)r   ZdevicesZxs   && r   _get_device_objectsZDiskPlugin._get_device_objectsj   s+    CJ	K7a
"
"
-
-gq
97	KK	Ks   $,c                s|   V P                   '       g   R # WP                  9   d   V P                  V,          # V P                  P                  RRRV,          .\        P
                  .RR7      w  r#pV\        P
                  ) 8X  d   \        P                  R4       R V n         R # V'       dL   \        P                  RV,          4       \        P                  RV: R	V: R
24       R V P                  V&   R # RV9   d.   \        P                  RV,          4       R V P                  V&   R # RV P                  V&   R# )Fhdparm-C/dev/%sT)	no_errorsZ
return_errz4hdparm command not found, ignoring for other devicesz#Device '%s' not supported by hdparmz(rc: z, msg: 'z')Zunknownz3Driver for device '%s' does not support apm command)
r   r   r   executeerrnoENOENTlogwarninginfodebug)r   r   rcoutZerr_msgs   &&   r   _is_hdparm_apm_supportedZ#DiskPlugin._is_hdparm_apm_supportedm   s   				
...

)
)&
11yy(((D)f:L)M4 ) 12GELL=;;EF4
	881F:;99b'23-24""6*
C88AFJK-24""6*
,0$!!&)	r   c                s    VP                   R 8H  ;'       dW    VP                  P                  RR4      R8H  ;'       d0    VP                  RJ ;'       g    VP                  P                  R9   # )diskZ	removableNs   0)ZscsiZvirtioZxenZnvmeZmmc)Zdevice_typeZ
attributesgetZparentZ	subsystem)clsr      &&r   r   ZDiskPlugin._device_is_supported   sq    



&  	d+t3 
MMT  ]] ! r   c                sT    V P                   P                  V R V P                  4       R# )r   N)r   Z	subscribe_hardware_events_callbackr      &r   _hardware_events_initZ DiskPlugin._hardware_events_init   s     $$T7D4R4RSr   c                s<    V P                   P                  V 4       R # N)r   Zunsubscriber2   r3   r   _hardware_events_cleanupZ#DiskPlugin._hardware_events_cleanup   s    &&t,r   c                sn   < V P                  V4      '       g   VR 8X  d   \        \        V `  W4       R# R# )removeN)r   r   r   r1   )r   Zeventr   r      &&&r   r1   Z$DiskPlugin._hardware_events_callback   s/    	v&&%8*;T4UC +<r   c                   < VP                   e   VP                   P                  V4       \        \        V `  W4       R # r5   )_load_monitorZ
add_devicer   r   _added_device_apply_tuningr   instancedevice_namer   r8   r   r;   Z%DiskPlugin._added_device_apply_tuning   s2    '$$[1
D4XKr   c                r9   r5   )r:   Zremove_devicer   r   _removed_device_unapply_tuningr<   r8   r   r?   Z)DiskPlugin._removed_device_unapply_tuning   s2    '''4
D8Or   c                s"    R RRRRRRRRRRRRR/# )	dynamicTelevatorNapmspindown	readaheadreadahead_multiplyscheduler_quantum r/   r3   r   _get_config_optionsZDiskPlugin._get_config_options   s1     $$$$$$$
 r   c                s
    R R.# )rB   rC   rG   rH   r3   r   #_get_config_options_used_by_dynamicZ.DiskPlugin._get_config_options_used_by_dynamic   s     	
 r   c                s    R Vn         ^ V n        ^ V n        RVn        V P	                  VP
                  R,          4      Vn        R# )TNr@   )Z_has_static_tuning_apm_errcnt_spindown_errcntr:   Z_option_boolZoptionsZ_has_dynamic_tuningr   r=   r0   r   _instance_initZDiskPlugin._instance_init   s@     $($$(!%!2!283C3CI3N!O(r   c                s~    VP                   e/   V P                  P                  VP                   4       R Vn         R # R # r5   )r:   _monitors_repositoryZdeleterM   r0   r   _instance_cleanupZDiskPlugin._instance_cleanup   s5    '##H$:$:; 8 (r   c                s   < \         \        V `  V4       / Vn        / Vn        / Vn        / Vn        V P                  P                  R VP                  4      Vn
        R# )r-   N)r   r   _instance_init_dynamicZ_device_idle_stats_idle_spindown_change_delayedrO   ZcreateZassigned_devicesr:   )r   r=   r   s   &&r   rQ   Z!DiskPlugin._instance_init_dynamic   sT    
D0:((/(.&((#44;;h'')(r   c                s   V'       d   R pV P                   pMRpV P                  pV\        P                  8  d   R# V^ 8X  d   ^ pMV\        P
                  ) 8X  d;   \        P                  ^,           ;V n         V n        \        P                  R4       R# V^,          pV\        P                  8X  d   \        P                  RV,          4       V'       d	   W@n         R# W@n        R# )rC   rB   NzIhdparm command not found, ignoring future set_apm / set_spindown commandsz5disabling set_%s command: too many consecutive errors)	rL   rK   constsERROR_THRESHOLDr$   r%   r&   r'   r(   )r   r*   rC   sZcnts   &&&  r   _update_errcntZDiskPlugin._update_errcnt   s    1			31			3F"""	1W	
3	ell].4.D.Dq.HH44+;;Z[	!83	V###HHDqHIr   c                s    \         P                  R V,          4       V P                  P                  RRV,          RV,          .\        P
                  .R7      w  rEV P                  VR4       RVP                  V&   R# )zchanging spindown to %dr   z-S%dr!   r"   TFN)r&   r)   r   r#   r$   r%   rX   rT   )r   r=   r   new_spindown_levelr*   r+      &&&&  r   _change_spindownZDiskPlugin._change_spindown   sm    ))%(::;ii64F+F	TZHZ [jojvjviwx)2b$.3(##F+r   c                s    V P                   P                  R RRV,          .\        P                  .R7      w  r#RV9  ;'       d    RV9  # )r   r    r!   rY   ZstandbyZsleeping)r   r#   r$   r%   )r   r   r*   r+      &&  r   _drive_spinningZDiskPlugin._drive_spinning   sK    ii4V1C DSXS_S_R`a)2#		7	7jC"77r   c                s   V P                  V4      '       g   R # VP                  P                  V4      pVf   R # W!P                  9   g   V P	                  W4       V P                  WV4       V P                  W4       VP                  V,          pVP                  V,          pVR,          ^,           V P                  8  d4   VR,          V P                  8  d   VR,          V P                  8  d   ^pM/VR,          ^ 8  d    VR,          ^ 8X  g   VR,          ^ 8X  d   RpM^ pV^ 8w  Edu   VR;;,          V,          uu&   V P                  VR,          ,          pV P                  VR,          ,          p\        P                  RVR,          ,          4       V P                  \        P                   8  d]   V P#                  V4      '       g4   V^ 8  d-   \        P                  RV,          4       RVP$                  V&   MV P'                  WV4       V P(                  \        P                   8  dn   \        P                  RV,          4       V P*                  P-                  RR	V,          R
V,          .\.        P0                  .R7      w  rV P3                  V	R4       M\VP$                  V,          '       dD   V P#                  V4      '       d-   V P                  VR,          ,          pV P'                  WV4       \        P                  RW$R,          VR,          3,          4       \        P                  RW%R,          VR,          VR,          3,          4       R # )Nlevelreadwriteztuning level changed to %dz;delaying spindown change to %d, drive has already spun downTzchanging APM_level to %dr   z-B%dr!   rY   Fz %s load: read %0.2f, write %0.2fz$%s idle: read %d, write %d, level %di)r,   r:   Zget_device_loadrR   _init_stats_and_idle_update_stats_update_idlerS   r   r   r   r	   r&   r)   rL   rU   rV   r^   rT   r\   rK   r   r#   r$   r%   rX   )r   r=   r   ZloadZstatsZidleZlevel_changeZnew_power_levelrZ   r*   r+   s   &&&        r   _instance_update_dynamicZ#DiskPlugin._instance_update_dynamic   s   		&	&v	.	.					/	/	7$	\		??	"X.Xt,H%
//&
!%		$ 
']Q%$v,$:K:K*KPTU\P]aeararPr<G}qd6la/4=A3E<< Q=L =''W6?--d7m<99)DM9:
f444''L1,<YYLOaab15X&&v.	8-?@
///II(?:;		!!8Vo-EySYGY"Ziniuiuhv!wIRE"((00T5I5I&5Q5Q--d7m<+=>)).&-w1XXY))2f6lDQXM[_`g[h5iijr   c                s    R ^^ .,          R^^ .,          R^^.,          /VP                   V&   R^ R^ R^ /VP                  V&   RVP                  V&   R# )newoldmaxr_   r`   ra   FN)rR   rS   rT   r   r=   r      &&&r   rb   ZDiskPlugin._init_stats_and_idle  sZ    #R1#XubA3hrQCxQ(//&$aGQ@(...3(##F+r   c                s   VP                   V,          R ,          ;VP                   V,          R&   pW1P                   V,          R &   \        W44       Uu. uF  qU^ ,          V^,          ,
          NK  	  ppWaP                   V,          R&   VP                   V,          R,          p\        Wv4       Uu. uF  p\        V4      NK  	  p	pWP                   V,          R&   \        V^,          4      \        V	^,          4      ,          VP                   V,          R&   \        V^,          4      \        V	^,          4      ,          VP                   V,          R&   R# u upi u upi )rf   rg   diffrh   r`   ra   N)rR   Zziprh   float)
r   r=   r   Znew_loadZold_loadZnew_oldrk   Zold_max_loadZpairZmax_loads
   &&&&      r   rc   ZDiskPlugin._update_stats#  s   .6oof.Ee.LL(//&% 8#+//&%  25X1H	I1Hg!*wqz
!
!1H$	I$(//&&! (/,$'$;<$;Dc$i$;(<#+//&%  &+47^eHQK6H%H(//&&!%*47^eHQK6H%H(//&'" 
J
 =s   E0Ec                s    R Fj  pVP                   V,          V,          V P                  8  d)   VP                  V,          V;;,          ^,          uu&   KT  ^ VP                  V,          V&   Kl  	  R# )r`   N)r`   ra   )rR   r   rS   )r   r=   r   Z	operations   &&& r   rd   ZDiskPlugin._update_idle4  sT    $ioofi(4+>+>>NN69%*%()HNN69%	 %r   c                s   < V P                  V4      '       g   \        P                  R V,          4       R# \        \        V `  W4       R# )z<There is no dynamic tuning available for device '%s' at timeN)r,   r&   r(   r   r   _instance_apply_dynamic)r   r=   r   r   r8   r   rm   Z"DiskPlugin._instance_apply_dynamic<  s7     
	&	&v	.	.88JVSTT28Dr   c                s    R # r5   rG   ri   rj   r   _instance_unapply_dynamicZ$DiskPlugin._instance_unapply_dynamicE  s    r   c                s    R V9   dX   \         P                  P                  W1P                  R R4      V4      p\         P                  P	                  V4      '       d   V# \         P                  P                  W1V4      # )Z/Z!)osZpathZjoinZreplaceZexists)r   r   ZsuffixZprefixZdev   &&&& r   _sysfs_pathZDiskPlugin._sysfs_pathH  sU    F]	fnnS#6	?3ggnnSJ	ff	--r   c                &    V P                  VR 4      # )zqueue/schedulerrq   r   r   r0   r   _elevator_fileZDiskPlugin._elevator_fileO  s    			&"3	44r   rA   T)Z
per_devicec                s    V P                  V4      pV'       g7   V P                  P                  YaV'       d   \        P                  .MR R7       V# )FZno_error)ru   r   write_to_filer$   r%   r   valuer   r=   simr7   sys_file   &&&&&& r   _set_elevatorZDiskPlugin._set_elevatorR  s@      ((	998!'~U  4	,r   c                s    V P                  V4      pV P                  P                  V P                  P                  WCR 7      4      # )rv   )ru   r   Zget_active_option	read_file)r   r   r=   ignore_missingr{   rp   r   _get_elevatorZDiskPlugin._get_elevatorZ  s;      (( 
	$	$TYY%8%8%8%[	\\r   rB   c                   V P                  V4      '       g2   V'       g   \        P                  R V,          4       R# \        V4      # V P                  \
        P                  8  dh   V'       gU   V P                  P                  RR\        V4      RV,           .\        P                  .R7      w  rgV P                  VR4       \        V4      # R# )+apm option is not supported for device '%s'Nr   -B/dev/rY   F)r,   r&   r(   strrK   rU   rV   r   r#   r$   r%   rX   r   ry   r   r=   rz   r7   r*   r+      &&&&&&  r   _set_apmZDiskPlugin._set_apma  s    		&	&v	.	.
HH:VCDu:	...
		!!8T3u:w?O"P_d_k_k^l!mIRE"
e*
r   c                s<   V P                  V4      '       g'   V'       g   \        P                  R V,          4       R# RpRpV P                  P	                  RRRV,           .\
        P                  .R7      w  rgV\
        P                  ) 8X  d   R# V^ 8w  d   RpMI\        P                  ! RV\        P                  4      pV'       d    \        VP                  ^4      4      pV'       d   \        P                  R	V,          4       V#   \         d    Rp L5i ; i)
r   NFr   r   r   rY   Tz.*=\s*(\d+).*z2could not get current APM settings for device '%s')r,   r&   r(   r   r#   r$   r%   reZmatchZSintZgroup
ValueErrorerror)	r   r   r=   r   ry   Zerrr*   r+   Zms	   &&&&     r   _get_apmZDiskPlugin._get_apmq  s    		&	&v	.	.
HH:VCD

%#ii461A BQVQ]Q]P^_)2ELL=
	Qw	3	xx #rtt,1_U 	99AFJK	,	  Ss   D DDrC   c                r   )0spindown option is not supported for device '%s'Nr   z-Sr   rY   T)r,   r&   r(   r   rL   rU   rV   r   r#   r$   r%   rX   r   r   r   _set_spindownZDiskPlugin._set_spindown  s    		&	&v	.	.
HH?&HIu:	V333
		!!8T3u:w?O"P_d_k_k^l!mIRD!
e*
r   c                s    V P                  V4      '       g'   V'       g   \        P                  R V,          4       R# ^# )r   N)r,   r&   r(   )r   r   r=   r   s   &&&&r   _get_spindownZDiskPlugin._get_spindown  s.    		&	&v	.	.
HH?&HI
	r   c                rr   )zqueue/read_ahead_kbrs   rt   r0   r   _readahead_fileZDiskPlugin._readahead_file  s    			&"7	88r   c                s    \        V4      P                  R ^4      p \        V^ ,          4      p\	        T4      ^8  d   T^,          ^ ,          R8X  d
   T^,          pT#   \         d     R # i ; i)NrW   )r   Zsplitr   r   r
   )r   ry   valZvr]   r   	_parse_raZDiskPlugin._parse_ra  sh    E
q!#
3q6{1 	X\c!fQi3&61	
( 
 
s   A A.-A.rD   c                s   V P                  V4      pV P                  V4      pVf!   \        P                  RV: RV: R24       V# V'       g?   V P                  P                  TRV,          V'       d   \        P                  .MRR7       V# )NzInvalid readahead value 'z' for device 'Z'%dFrv   )r   r   r&   r   r   rw   r$   r%   )r   ry   r   r=   rz   r7   r{   r   r   r   _set_readaheadZDiskPlugin._set_readahead  ss    !!&)(u#[99ufMN
 
* IIHdSj"(e  5	*r   c                s    V P                  V4      pV P                  P                  WCR 7      P                  4       p\	        V4      ^ 8X  d   R# \        V4      # )rv   N)r   r   r~   stripr
   r   r   r   r=   r   r{   ry   r[   r   _get_readaheadZDiskPlugin._get_readahead  sJ    !!&)(
))

h

@
F
F
H%Z1_
	Ur   rE   c                s   V'       d   R # V P                  RVR7      pV'       dd   V P                  W64      pVf   R # \        \        V4      V,          4      p	V P                  P                  Wx4       V P                  WVRR4       R # V P                  P                  V4      pVf   R # V P                  WVRR4       V P                  P                  V4       R # )NrE   )Zcommand_namer>   F)	Z_storage_keyr   r   rl   Z_storager   r   r.   Zunset)
r   ZenablingZ
multiplierr   Zverifyr   r=   Zstorage_keyZold_readaheadZnew_readaheads
   &&&&&&&   r   _multiply_readaheadZDiskPlugin._multiply_readahead  s    
!!' " + &&v8=
uZ(=89===[0}huE==$$[1=
}huE=={#r   c                rr   )zqueue/iosched/quantumrs   rt   r0   r   _scheduler_quantum_fileZ"DiskPlugin._scheduler_quantum_file  s    			&"9	::r   rF   c                s    V P                  V4      pV'       gH   V P                  P                  TR \        V4      ,          V'       d   \        P
                  .MRR7       V# )r   Frv   )r   r   rw   r   r$   r%   rx   r|   r   _set_scheduler_quantumZ!DiskPlugin._set_scheduler_quantum  sK    ))&1(	998TCJ%6!'~U  4	,r   c                s    V P                  V4      pV P                  P                  WCR 7      P                  4       p\	        V4      ^ 8X  d'   V'       g   \
        P                  RV,          4       R# \        V4      # )rv   z>disk_scheduler_quantum option is not supported for device '%s'N)r   r   r~   r   r
   r&   r(   r   r   r[   r   _get_scheduler_quantumZ!DiskPlugin._get_scheduler_quantum  s`    ))&1(
))

h

@
F
F
H%Z1_
HHMPVVW
	Ur   )rK   r   r   r   r   r   r   r   r   r   rL   r	   r   )z/sys/block/)F)4Z__name__Z
__module__Z__qualname__Z__firstlineno__Z__doc__r   r   r   r,   Zclassmethodr   r4   r6   r1   r;   r?   rI   rJ   rN   rP   rQ   rX   r\   r^   re   rb   rc   rd   rm   rn   rq   ru   Zcommand_setr}   Zcommand_getr   r   r   r   r   r   r   r   r   Zcommand_customr   r   r   r   Z__static_attributes__Z__classdictcell__Z__classcell__)r   Z__classdict__s   @@r   r   r      s    FP	!L.  T-DL
P
 	 	  P!
)0480kd4
I"*E.5 jT* + j] ] e% & e . jT* + j 9	 kd+	 ,	 k  %$7$ 8$(; !d3 4 !" # r   r   )r$   Z r   Z
decoratorsZ
tuned.logsZtunedZtuned.constsrU   Ztuned.utils.commandsr   ro   r   Zlogsr.   r&   ZPluginr   rG   r   r   <module>r      s?         ) 	 	jjnn` `r   