o
    _/                     @   sl   d dl Z ddlmZ ddlT d dlZd dlmZ d dlm	Z	 d dl
Z
d dlZej ZG dd dejZdS )    N   )hotplug)*)commandsc                       s  e Zd ZdZ fddZ fddZdd Zedd	 Zd
d Z	dd Z
 fddZ fddZ fddZedd Zedd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ ZdVd-d.Zd/d0 Zed1d2d3d4d5 Zed1dWd7d8Zed9d2d3d:d; Z ed9dWd<d=Z!ed>d2d3d?d@ Z"ed>dWdAdBZ#dCdD Z$dEdF Z%edGd2d3dHdI Z&edGdWdJdKZ'e(dLd2d3dMdN Z)dOdP Z*edQd2d3dRdS Z+edQdWdTdUZ,  Z-S )X
DiskPluginz'
	Plugin for tuning options of disks.
	c                    sN   t t| j|i | g d| _g d| _t| j| _d| _d| _t	 | _
d S )N)               }   i   U   F   7         )r                        n   Z   r   <      g{Gz?)superr   __init___power_levels_spindown_levelslen_levels_level_steps_load_smallestr   _cmd)selfargskwargs	__class__ ;/usr/lib/python3/dist-packages/tuned/plugins/plugin_disk.pyr      s   

zDiskPlugin.__init__c                    sR   t t|   d| _t | _| jdD ]}| |r"| j	|j
 qt | _d S )NTblock)r   r   _init_devices_devices_supportedset_free_devices_hardware_inventoryget_devices_device_is_supportedaddsys_name_assigned_devicesr'   devicer*   r,   r-   r/      s   
zDiskPlugin._init_devicesc                    s    fdd|D S )Nc                    s   g | ]	} j d |qS )r.   )r3   
get_device).0xr'   r,   r-   
<listcomp>&   s    z2DiskPlugin._get_device_objects.<locals>.<listcomp>r,   )r'   devicesr,   r>   r-   _get_device_objects%   s   zDiskPlugin._get_device_objectsc                 C   s2   |j dko|jdd dko|jd u p|jjdv S )Ndisk	removable   0)scsivirtioxen)device_type
attributesgetparent	subsystem)clsr:   r,   r,   r-   r5   (   s   


zDiskPlugin._device_is_supportedc                 C   s   | j | d| j d S )Nr.   )r3   	subscribe_hardware_events_callbackr>   r,   r,   r-   _hardware_events_init/   s   z DiskPlugin._hardware_events_initc                 C   s   | j |  d S N)r3   unsubscriber>   r,   r,   r-   _hardware_events_cleanup2   s   z#DiskPlugin._hardware_events_cleanupc                    s,   |  |s	|dkrtt| || d S d S )Nremove)r5   r   r   rO   )r'   eventr:   r*   r,   r-   rO   5   s   z$DiskPlugin._hardware_events_callbackc                    ,   |j d ur|j | tt| || d S rQ   )_load_monitor
add_devicer   r   _added_device_apply_tuningr'   instancedevice_namer*   r,   r-   rY   9      
z%DiskPlugin._added_device_apply_tuningc                    rV   rQ   )rW   remove_devicer   r   _removed_device_unapply_tuningrZ   r*   r,   r-   r_   >   r]   z)DiskPlugin._removed_device_unapply_tuningc                 C   s   dd d d d d d dS )NT)dynamicelevatorapmspindown	readaheadreadahead_multiplyscheduler_quantumr,   rM   r,   r,   r-   _get_config_optionsC   s   zDiskPlugin._get_config_optionsc                 C   s   ddgS )Nrb   rc   r,   rg   r,   r,   r-   #_get_config_options_used_by_dynamicO   s   z.DiskPlugin._get_config_options_used_by_dynamicc                 C   sf   d|_ d| _d| _| |jd r+d|_| jd|j|_	i |_
i |_i |_i |_d S d|_d |_	d S )NTr   r`   rB   F)_has_static_tuning_apm_errcnt_spindown_errcnt_option_booloptions_has_dynamic_tuning_monitors_repositorycreateassigned_devicesrW   _device_idle_stats_idle_spindown_change_delayedr'   r[   r,   r,   r-   _instance_initV   s   

zDiskPlugin._instance_initc                 C   s&   |j d ur| j|j  d |_ d S d S rQ   )rW   rp   deleterw   r,   r,   r-   _instance_cleanupi   s   

zDiskPlugin._instance_cleanupc                 C   s   |rd}| j }nd}| j}|tjkrd S |dkrd}n&|tj kr1tjd  | _ | _td d S |d7 }|tjkrAtd|  |rH|| _ d S || _d S )Nrc   rb   r   r   zIhdparm command not found, ignoring future set_apm / set_spindown commandsz5disabling set_%s command: too many consecutive errors)	rl   rk   constsERROR_THRESHOLDerrnoENOENTlogwarninfo)r'   rcrc   scntr,   r,   r-   _update_errcntn   s&   




zDiskPlugin._update_errcntc                 C   sN   t d|  | jjdd| d| gtjgd\}}| |d d|j|< d S )Nzchanging spindown to %dhdparmz-S%d/dev/%s	no_errorsTF)r   debugr&   executer}   r~   r   rv   )r'   r[   r:   new_spindown_levelr   outr,   r,   r-   _change_spindown   s   &zDiskPlugin._change_spindownc                 C   s2   | j jddd| gtjgd\}}d|vod|vS )Nr   z-Cr   r   standbysleeping)r&   r   r}   r~   )r'   r:   r   r   r,   r,   r-   _drive_spinning   s   "zDiskPlugin._drive_spinningc                 C   s
  |j |}|d u rd S ||jvr| || | ||| | || |j| }|j| }|d d | jk rH|d | jkrH|d | jkrHd}n|d dkr]|d dksZ|d dkr]d}nd}|dkr|d  |7  < | j	|d  }| j
|d  }td|d   | jtjk r| |s|dkrtd|  d	|j|< n| ||| | jtjk rtd
|  | jjdd| d| gtjgd\}	}
| |	d n|j| r| |r| j
|d  }| ||| td||d |d f  td||d |d |d f  d S )Nlevelr   readwriter   ztuning level changed to %dz;delaying spindown change to %d, drive has already spun downTzchanging APM_level to %dr   z-B%dr   r   Fz %s load: read %0.2f, write %0.2fz$%s idle: read %d, write %d, level %d)rW   get_device_loadrt   _init_stats_and_idle_update_stats_update_idleru   r#   r$   r    r!   r   r   rl   r{   r|   r   rv   r   rk   r&   r   r}   r~   r   )r'   r[   r:   loadstatsidlelevel_changenew_power_levelr   r   r   r,   r,   r-   _instance_update_dynamic   sD   


.$&&z#DiskPlugin._instance_update_dynamicc                 C   sD   ddg ddg ddg d|j |< dddd|j|< d|j|< d S )N   r   r   )newoldmax)r   r   r   F)rt   ru   rv   r'   r[   r:   r,   r,   r-   r      s   $zDiskPlugin._init_stats_and_idlec                 C   s   |j | d  |j | d< }||j | d< dd t||D }||j | d< |j | d }dd t||D }||j | d< t|d t|d  |j | d	< t|d
 t|d
  |j | d< d S )Nr   r   c                 S   s   g | ]
}|d  |d  qS )r   r   r,   )r<   new_oldr,   r,   r-   r?      s    z,DiskPlugin._update_stats.<locals>.<listcomp>diffr   c                 S   s   g | ]}t |qS r,   )r   )r<   pairr,   r,   r-   r?      s    r   r      r   )rt   zipfloat)r'   r[   r:   new_loadold_loadr   old_max_loadmax_loadr,   r,   r-   r      s   "&zDiskPlugin._update_statsc                 C   sH   dD ]}|j | | | jk r|j| |  d7  < qd|j| |< qd S )N)r   r   r   r   )rt   r%   ru   )r'   r[   r:   	operationr,   r,   r-   r      s
   zDiskPlugin._update_idlec                 C   s   d S rQ   r,   r   r,   r,   r-   _instance_unapply_dynamic   s   z$DiskPlugin._instance_unapply_dynamic/sys/block/c                 C   s@   d|v rt j||dd|}t j|r|S t j|||S )N/!)ospathjoinreplaceexists)r'   r:   suffixprefixdevr,   r,   r-   _sysfs_path   s
   zDiskPlugin._sysfs_pathc                 C      |  |dS )Nzqueue/schedulerr   r9   r,   r,   r-   _elevator_file      zDiskPlugin._elevator_filera   T)
per_devicec                 C   s    |  |}|s| j|| |S rQ   )r   r&   write_to_filer'   valuer:   simsys_filer,   r,   r-   _set_elevator   s   
zDiskPlugin._set_elevatorFc                 C   s"   |  |}| j| jj||dS )Nno_error)r   r&   get_active_option	read_file)r'   r:   ignore_missingr   r,   r,   r-   _get_elevator   s   
zDiskPlugin._get_elevatorrb   c                 C   P   | j tjk r&|s"| jjddt|d| gtjgd\}}| |d t|S d S )Nr   -B/dev/r   F)	rk   r{   r|   r&   r   strr}   r~   r   r'   r   r:   r   r   r   r,   r,   r-   _set_apm      (zDiskPlugin._set_apmc                 C   s   d }d}| j jddd| gtjgd\}}|tj krd S |dkr$d}ntd|tj}|rCz	t|d	}W n t	yB   d}Y nw |rLt
d
|  |S )NFr   r   r   r   r   Tz.*=\s*(\d+).*r   z2could not get current APM settings for device '%s')r&   r   r}   r~   rematchSintgroup
ValueErrorr   error)r'   r:   r   r   errr   r   mr,   r,   r-   _get_apm  s"   "zDiskPlugin._get_apmrc   c                 C   r   )Nr   z-Sr   r   T)	rl   r{   r|   r&   r   r   r}   r~   r   r   r,   r,   r-   _set_spindown  r   zDiskPlugin._set_spindownc                 C   s   dS )N   r,   )r'   r:   r   r,   r,   r-   _get_spindown!  s   zDiskPlugin._get_spindownc                 C   r   )Nzqueue/read_ahead_kbr   r9   r,   r,   r-   _readahead_file&  r   zDiskPlugin._readahead_filec                 C   s^   t |d d}zt|d }W n
 ty   Y d S w t|dkr-|d d dkr-|d }|S )Nr   r   r      )r   splitr   r   r"   )r'   r   valvr,   r,   r-   	_parse_ra)  s   zDiskPlugin._parse_rard   c                 C   sL   |  |}| |}|d u rtd||f  |S |s$| j|d|  |S )Nz,Invalid readahead value '%s' for device '%s'%d)r   r   r   r   r&   r   )r'   r   r:   r   r   r   r,   r,   r-   _set_readahead4  s   

zDiskPlugin._set_readaheadc                 C   s6   |  |}| jj||d }t|dkrd S t|S )Nr   r   )r   r&   r   stripr"   r   r'   r:   r   r   r   r,   r,   r-   _get_readahead?  s
   
zDiskPlugin._get_readaheadre   c           	      C   s   |rd S | j d|d}|r0| |}|d u rd S tt|| }| j|| | ||d d S | j|}|d u r<d S | ||d | j| d S )Nre   )command_namer\   F)	_storage_keyr   r   r   _storager1   r   rJ   unset)	r'   enabling
multiplierr:   verifyr   storage_keyold_readaheadnew_readaheadr,   r,   r-   _multiply_readaheadG  s$   
zDiskPlugin._multiply_readaheadc                 C   r   )Nzqueue/iosched/quantumr   r9   r,   r,   r-   _scheduler_quantum_file\  r   z"DiskPlugin._scheduler_quantum_filerf   c                 C   s(   |  |}|s| j|dt|  |S )Nr   )r   r&   r   r   r   r,   r,   r-   _set_scheduler_quantum_  s   
z!DiskPlugin._set_scheduler_quantumc                 C   sD   |  |}| jj||d }t|dkr|std d S t|S )Nr   r   z9disk_scheduler_quantum option is not supported by this HW)r   r&   r   r   r"   r   r   r   r   r,   r,   r-   _get_scheduler_quantumf  s   

z!DiskPlugin._get_scheduler_quantum)r   )F).__name__
__module____qualname____doc__r   r/   rA   classmethodr5   rP   rS   rO   rY   r_   rh   ri   rx   rz   r   r   r   r   r   r   r   r   r   r   command_setr   command_getr   r   r   r   r   r   r   r   r   command_customr   r   r   r   __classcell__r,   r,   r*   r-   r      sj    




0




	

	






r   )r}    r   
decorators
tuned.logstunedtuned.constsr{   tuned.utils.commandsr   r   r   logsrJ   r   Pluginr   r,   r,   r,   r-   <module>   s    
