o
    _Ԋ                     @   s   d dl mZ d dlT ddlZddlZddlT ddlZddlZddl	Z	ddl
mZ ddlZddlZddlmZ ddlZddlZddlZddlZej ZG dd deZG dd	 d	eZG d
d dejZdS )   )base)*    N)commandsc                   @   s4   e Zd Z		dddZedd Zejdd ZdS )SchedulerParamsNc                 C   s(   || _ || _|| _|| _|| _|| _d S N)_cmdcmdline	schedulerpriorityaffinitycgroup)selfcmdr	   r
   r   r   r    r   @/usr/lib/python3/dist-packages/tuned/plugins/plugin_scheduler.py__init__   s   
zSchedulerParams.__init__c                 C   s   | j d u rd S | j| j S r   )	_affinityr   bitmask2cpulistr   r   r   r   r   "   s   
zSchedulerParams.affinityc                 C   s$   |d u r	d | _ d S | j|| _ d S r   )r   r   cpulist2bitmaskr   valuer   r   r   r   )   s   
)NNNNN)__name__
__module____qualname__r   propertyr   setterr   r   r   r   r      s    
	
r   c                   @   s   e Zd Zdd ZdS )IRQAffinitiesc                 C   s   i | _ d | _g | _d S r   )irqsdefaultunchangeabler   r   r   r   r   1   s   
zIRQAffinities.__init__N)r   r   r   r   r   r   r   r   r   0   s    r   c                       sr  e Zd ZdZejejejejej	dZ
 fddZdd Zdd Z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dd"d#Zd$d% Zd&d' Zd(d) Zdd*d+Zd,d- Z d.d/ Z!d0d1 Z"d2d3 Z#d4d5 Z$d6d7 Z%d8d9 Z&d:d; Z'd<d= Z(d>d? Z)dd@dAZ*dBdC Z+dDdE Z, fdFdGZ-dHdI Z.dJdK Z/dLdM Z0d fdNdO	Z1dPdQ Z2dRdS Z3 fdTdUZ4dVdW Z5dXdY Z6dZd[ Z7e8d\d!d]d^d_ Z9e8d`d!d]dadb Z:e8dcd!d]ddde Z;e8dfd!d]dgdh Z<didj Z=dkdl Z>dmdn Z?ddodpZ@dqdr ZAdsdt ZBdudv ZCdwdx ZDdydz ZEd{d| ZFd}d~ ZGdd ZHe8dd!dddd ZI  ZJS )SchedulerPluginz
	Plugin for tuning of scheduler. Currently it can control scheduling
	priorities of system threads (it is substitution for the rtctl tool).
	)fbroic	           	   
      s   t t| |||||||| d| _tj| _ttj| _	|d ur4|
tjtj| _t|tjtj| _	t | _d| _d| _t | _| jdd| _| jdd| _d S )NTz.* r
   )command_nameirq)superr"   r   _has_dynamic_optionsconstsCFG_DEF_DAEMON_daemonintCFG_DEF_SLEEP_INTERVAL_sleep_intervalget_bool
CFG_DAEMONgetCFG_SLEEP_INTERVALr   r   _ps_whitelist_ps_blacklistperfcpu_map_cpus_storage_key_scheduler_storage_key_irq_storage_key)	r   monitor_repositorystorage_factoryhardware_inventorydevice_matcherdevice_matcher_udevplugin_instance_factory
global_cfg	variables	__class__r   r   r   E   s"   
zSchedulerPlugin.__init__c                 C   sT   |d u rd S zt |}W n
 ty   Y dS w |dkrdS t dtt|d S )Nr      )r0   
ValueErrormathceillog)r   
mmap_pagesmpr   r   r   _calc_mmap_pagesW   s   z SchedulerPlugin._calc_mmap_pagesc                    s  d|_ d|_d|_ j ji  _t jdkr,t	d  
  i  _ j j t  _d  _d _d  _t fdd|j D  _|j|_ j|jd } |}|dkrhtd|  d }|d ur{t||kr{t	d	||f  |jD ]} j|j| |j|< q~ j|jd
ddkrd|_t |_  j!r|jrzGt"# |_$t"j%t"j&t"j'ddddddt"j(t"j)B d	}|j* j+|j$d t", j+|j$|_-|j-.| |d u r|j-/  W d S |j-j/|d W d S    d|_Y d S d S d S )NFTr   z0recovering scheduling settings from previous runc                    sJ   g | ]!\}}|d d dkrt |dkr |dd   j|fqS N   zcgroup.)len_sanitize_cgroup_path
_variablesexpand).0optionr   r   r   r   
<listcomp>|   s    "z2SchedulerPlugin._instance_init.<locals>.<listcomp>perf_mmap_pageszKInvalid 'perf_mmap_pages' value specified: '%s', using default kernel valuezL'perf_mmap_pages' value has to be power of two, specified: '%s', using: '%d'runtimer   0)	typeconfigtaskcommmmapfreqwakeup_events	watermarksample_type)cpusthreads)pages)0_has_dynamic_tuning_has_static_tuning_runtime_tuning_storager5   r=   _scheduler_originalrS   rM   info_restore_ps_affinityunsetdict_cgroups_original_affinityr   _cgroup_affinity_initialized_cgroupcollectionsOrderedDictoptionsitems_cgroups
_schedulerrU   rV   rP   errorstrr   r3   	threadingEvent
_terminater/   r9   
thread_map_threadsevselTYPE_SOFTWARECOUNT_SW_DUMMY
SAMPLE_TID
SAMPLE_CPUopenr;   evlist_evlistaddra   )r   instanceperf_mmap_pages_rawrZ   kr   r   r   r   _instance_initc   sf   






zSchedulerPlugin._instance_initc                 C   s   d S r   r   )r   r   r   r   r   _instance_cleanup   s   z!SchedulerPlugin._instance_cleanupc                 C   s   d t jddd d d dd dd
S )NFTcalcfalse)
isolated_corescgroup_mount_pointcgroup_mount_point_initcgroup_groups_initcgroup_for_isolated_coresps_whitelistps_blacklistdefault_irq_smp_affinityrZ   perf_process_fork)r-   DEF_CGROUP_MOUNT_POINT)clsr   r   r   _get_config_options   s   z#SchedulerPlugin._get_config_optionsc                 C   s   |d urt |ddS d S )N./)r|   replacer   r   r   r   rT      s   z%SchedulerPlugin._sanitize_cgroup_pathc                 C   s>   t |tjs|}t|}t|}| |rd| d }|S )N[])
isinstanceprocfsprocessprocess_cmdline_is_kthread)r   r   pidr	   r   r   r   _get_cmdline   s   


zSchedulerPlugin._get_cmdlinec                 C   s   t  }|  i }| D ]H}z%| |}|d }|||< d|v r4|d  D ]}| |}|||< q(W q ttfyV } z|jtj	ksK|jtj
krQW Y d }~q d }~ww |S )Nr   rg   )r   pidstatsreload_threadsvaluesr   keysOSErrorIOErrorerrnoENOENTESRCH)r   ps	processesprocr   r   er   r   r   get_processes   s*   


zSchedulerPlugin.get_processesc                 C   s:   t |}t |}t |}td|||f  ||fS )Nz8Read scheduler policy '%s' and priority '%d' of PID '%d')
schedutilsget_schedulerschedstrget_priorityrM   debug)r   r   r
   	sched_strr   r   r   r   _get_rt   s   


zSchedulerPlugin._get_rtc              
   C   s  t |}td|||f  zt |}t |}||k s"||kr-td||||f  W n ttfyI } ztd|  W Y d }~nd }~ww z
t 	||| W d S  ttfy } z*t
|drq|jtjkrqtd|  ntd||f  W Y d }~d S W Y d }~d S d }~ww )NzBSetting scheduler policy to '%s' and priority to '%d' of PID '%d'.z9Priority for %s must be in range %d - %d. '%d' was given.z(Failed to get allowed priority range: %sr   zAFailed to set scheduling parameters of PID %d, the task vanished.z1Failed to set scheduling parameters of PID %d: %s)r   r   rM   r   get_priority_minget_priority_maxr{   SystemErrorr   set_schedulerhasattrr   r   )r   r   schedprior   prio_minprio_maxr   r   r   r   _set_rt   sB   


zSchedulerPlugin._set_rtc                 C   s   |d d t jj@ dkS )Nstatflagsr   )r   pidstat
PF_KTHREAD)r   r   r   r   r   r      s   zSchedulerPlugin._is_kthreadc              
   C   s  z9t |}|d  r7|d d dkrtd|  W dS | |r-td|  W dS td|  W dS W dS  ttfyq } z*|j	t	j
ksO|j	t	jkr]td	|  W Y d }~d
S td||f  W Y d }~dS d }~w ttfy } ztd||f  W Y d }~dS d }~ww )Nr   stateZzYAffinity of zombie task with PID %d cannot be changed, the task's affinity mask is fixed.z[Affinity of kernel thread with PID %d cannot be changed, the task's affinity mask is fixed.zRAffinity of task with PID %d cannot be changed, the task's affinity mask is fixed.r   r   z6Failed to get task info for PID %d, the task vanished.z&Failed to get task info for PID %d: %s)r   r   is_bound_to_cpurM   r   r   warnr   r   r   r   r   r{   AttributeErrorKeyError)r   r   r   r   r   r   r   _affinity_changeable  sH   

z$SchedulerPlugin._affinity_changeablec                 C   sb   z| j | }W n ty   t| j}|| j |< Y nw |jd u r-|jd u r/||_||_d S d S d S r   )rm   r   r   r   r
   r   )r   r   r
   r   paramsr   r   r   _store_orig_process_rt$  s   

z&SchedulerPlugin._store_orig_process_rtc              
   C   s   d}|d u r|d u r|S z|  |\}}|d u r|}| ||| | ||| W |S  ttfym } z5t|drR|jtjkrRt	d|  || j
v rO| j
|= d}ntd||f  W Y d }~|S W Y d }~|S d }~ww )NTr   z=Failed to read scheduler policy of PID %d, the task vanished.FzcRefusing to set scheduler and priority of PID %d, reading original scheduling parameters failed: %s)r   r   r   r   r   r   r   r   rM   r   rm   r{   )r   r   r   r   cont
prev_sched	prev_prior   r   r   r   _tune_process_rt.  s4   

z SchedulerPlugin._tune_process_rtc                 C   s   t |d d dkS rQ   )r|   )r   r   r   r   r   _is_cgroup_affinityD  s   z#SchedulerPlugin._is_cgroup_affinityFc                 C   sj   z| j | }W n ty   t| j}|| j |< Y nw |jd u r1|jd u r3|r,||_d S ||_d S d S d S r   )rm   r   r   r   r   r   )r   r   r   	is_cgroupr   r   r   r   _store_orig_process_affinityG  s   


z,SchedulerPlugin._store_orig_process_affinityc              	   C   st   | j jdtjt|df dddD ]$}z|dd dd  }|dkr*|W   S d	W   S  ty7   Y qw d	S )
N%s/%s/%sr   Tno_error
z:cpuset:r   r(   r   )r   	read_filer-   PROCFS_MOUNT_POINTr|   split
IndexError)r   r   lr   r   r   r   _get_cgroup_affinityS  s   *z$SchedulerPlugin._get_cgroup_affinityc                 C   sB   |  |}| j}|dkrd||f }| jjd| t|dd d S )Nr   %s/%sz%s/tasksTr   )rT   _cgroup_mount_pointr   write_to_filer|   )r   r   r   pathr   r   r   _set_cgroup`  s
   
zSchedulerPlugin._set_cgroupc                 C   s,   |dd  }t |t ot|dk}||fS )NrR   r   )r   listrS   )r   r   r   r   r   r   _parse_cgroup_affinityg  s   z&SchedulerPlugin._parse_cgroup_affinityc           	   
   C   s   d}|d u r|S z3|  |\}}|r| |}| || n| |}|r,| |||}| || | ||| W |S  ttfy~ } z5t	|drc|j
t
jkrctd|  || jv r`| j|= d}ntd||f  W Y d }~|S W Y d }~|S d }~ww )NTr   z5Failed to read affinity of PID %d, the task vanished.FzLRefusing to set CPU affinity of PID %d, reading original affinity failed: %s)r   r   r   _get_affinity_get_intersect_affinity_set_affinityr   r   r   r   r   r   rM   r   rm   r{   )	r   r   r   	intersectr   r   r   prev_affinityr   r   r   r   _tune_process_affinityn  sF   



z&SchedulerPlugin._tune_process_affinityc                 C   sD   |  |||}|sd S | ||}|r|| jvrd S || j| _d S r   )r   r   rm   r	   )r   r   r   r   r   r   r   r   r   r   _tune_process  s   zSchedulerPlugin._tune_processc                 C   sd   | j |}|d u r|dkrtd|  dS z	t|}W ||fS  ty1   td|  Y dS w )Nr   z>Invalid scheduler: %s. Scheduler and priority will be ignored.)NNz=Invalid priority: %s. Scheduler and priority will be ignored.)_dict_schedcfg2numr5   rM   r{   r0   rJ   )r   str_schedulerstr_priorityr
   r   r   r   r   _convert_sched_params  s   
z%SchedulerPlugin._convert_sched_paramsc                 C   sH   |dkrd }|S |  |r|}|S | j|}|s"td|  d }|S )Nr   z)Invalid affinity: %s. It will be ignored.)r   r   hex2cpulistrM   r{   )r   str_affinityr   r   r   r   _convert_affinity  s   	
z!SchedulerPlugin._convert_affinityc                 C   s6   |\}}}}}|  ||\}}| |}|||||fS r   )r   r   )r   vals	rule_prior
   r   r   regexr   r   r   _convert_sched_cfg  s   
z"SchedulerPlugin._convert_sched_cfgc              
   C   s   d| j |f }z	t|tj W n ty+ } ztd||f  W Y d }~nd }~ww | jj	d|df | jj
d| j df ddddsMtd|  d S d S )Nr   z Unable to create cgroup '%s': %szcpuset.memsTr   z3Unable to initialize 'cpuset.mems ' for cgroup '%s')r   osmkdirr-   DEF_CGROUP_MODEr   rM   r{   r   r   r   )r   r   r   r   r   r   r   _cgroup_create_group  s   z$SchedulerPlugin._cgroup_create_groupc                 C   <   | j d ur| j | jvr| | j  | jD ]}| | qd S r   )rt   ry   r  r   cgr   r   r   _cgroup_initialize_groups  
   
z)SchedulerPlugin._cgroup_initialize_groupsc              
   C   s   t d z
t| jtj W n ty( } zt d|  W Y d }~nd }~ww | j	
dddddd| jg\}}|dkrGt d	| j  d S d S )
NzInitializing cgroups settingsz'Unable to create cgroup mount point: %smountz-tr   z-ocpusetr   zUnable to mount '%s')rM   r   r  makedirsr   r-   r  r   r{   r   execute)r   r   retoutr   r   r   _cgroup_initialize  s   
 z"SchedulerPlugin._cgroup_initializec              
   C   sJ   zt | W d S  ty$ } ztd||f  W Y d }~d S d }~ww )Nz#Unable to remove directory '%s': %s)r  rmdirr   rM   r{   )r   r   r   r   r   r   _remove_dir  s    zSchedulerPlugin._remove_dirc                 C   s\   t | jD ]}| d| j|f  q| jd ur*| j| jvr,| d| j| jf  d S d S d S )Nr   )reversedry   r  r   rt   r  r   r   r   _cgroup_finalize_groups  s
   z'SchedulerPlugin._cgroup_finalize_groupsc                 C   sp   t d | jd| jg\}}|dkrt d| j  dS | | j tj	| j}|dkr6| | d S d S )NzRemoving cgroups settingsumountr   zUnable to umount '%s'Fr   )
rM   r   r   r  r   r{   r  r  r   dirname)r   r  r  dr   r   r   _cgroup_finalize  s   
z SchedulerPlugin._cgroup_finalizec                 C   s   |dkrt d||f  n	t d|  d S d| j|df }|r?| jj|ddd }|dkr6|| j|< n	t d	|  d S | jj||dd
sSt 	d||f  d S d S )Nr(   z$Setting cgroup '%s' affinity to '%s'z.Skipping cgroup '%s', empty affinity requestedr   cpuset.cpusERRTerr_retr   zIRefusing to set affinity of cgroup '%s', reading original affinity failedr   z+Unable to set affinity '%s' for cgroup '%s')
rM   r   r   r   r   striprr   errr   r{   )r   r   r   backupr   orig_affinityr   r   r   _cgroup_set_affinity_one  s   z(SchedulerPlugin._cgroup_set_affinity_onec                 C   sz   | j rd S td | jd ur$| jd ur$| j| jvr$| j| j| jdd | j D ]}| j|d |d dd q)d| _ d S )NzSetting cgroups affinitiesT)r   r   r   )rs   rM   r   r   rt   ry   r"  rx   r  r   r   r   _cgroup_set_affinity  s   
 
z$SchedulerPlugin._cgroup_set_affinityc                 C   s2   t d | j D ]}| |d |d  q
d S )NzRestoring cgroups affinitiesr   r   )rM   r   rr   rx   r"  r  r   r   r   _cgroup_restore_affinity  s   
z(SchedulerPlugin._cgroup_restore_affinityc                    sx  j |jd _jj |jd dk_jj |jd dk_j |jd _	jr>
  jsDjrH  tt|   z }W n ttfyv } ztd|  W Y d }~d S d }~ww dd |j D }fd	d|D }t|d
d d}t }i |_|D ]b\\} ztW n tjy } ztdt  W Y d }~qd }~ww fdd| D }t fdd|D }	||	 tdddd g|j< q| D ]\}
\} |
|  qj !j"j# j$r8|j%r:t&j'j(|gd|_)|j)*  d S d S d S )Nr   r   1r   r   Ierror applying tuning, cannot get information about running processes: %sc                 S   s$   g | ]\}}|t |d dfqS ):   )r|   r   )rW   rX   r   r   r   r   rY   $  s   $ z:SchedulerPlugin._instance_apply_static.<locals>.<listcomp>c                    s6   g | ]\}}t d |rt|dkr| |fqS )zgroup\.   )rematchrS   r  )rW   rX   r   r   r   r   rY   %  s    
c                 S   s   | d d S )Nr   r   r   )option_valsr   r   r   <lambda>)  s    z8SchedulerPlugin._instance_apply_static.<locals>.<lambda>)keyz(error compiling regular expression: '%s'c                    s(   g | ]\}}t  |d ur||fqS r   )r*  searchrW   r   r   )r%   r   r   rY   4  s   ( c              	      s$   g | ]\}}|| ffqS r   r   r0  )r   rX   r   r   r
   r   r   rY   6  s    (z\()z\))targetargs)+rU   rV   rw   r   r   r3   _cgroup_mount_point_init_cgroup_groups_initrT   rt   r  r	  r+   r"   _instance_apply_staticr#  r   r   r   rM   r{   rz   rx   sortedrq   _sched_lookupr*  compiler|   updater   r   rl   setr=   rm   r/   rk   r}   Thread_thread_code_threadstart)r   r   r   r   	sched_cfgbuf	sched_allr   r   r   r   r   rG   )r   rX   r   r%   r   r
   r   r   r7    s   




z&SchedulerPlugin._instance_apply_staticc              
   C   s   z|   }W n ttfy" } ztd|  W Y d }~d S d }~ww | j D ]<\}}||vs7|| |jkr8q(|jd urK|j	d urK| 
||j|j	 |jd urX| ||j q(|jd urd| ||j q(i | _| j| j d S )NzKerror unapplying tuning, cannot get information about running processes: %s)r   r   r   rM   r{   rm   rx   r	   r
   r   r   r   r   r   r   rl   rp   r=   )r   r   r   r   orig_paramsr   r   r   ro   F  s0   




z$SchedulerPlugin._restore_ps_affinityc                 C   s   t tj}d}|dkrD|dkrD| jjd| j|df ddd}|dvr8|d	D ]}| jjd
| jdf |dd q'|d8 }|dkrD|dks|dkrQt	d|  d S d S )N r(   r   r   tasksTr  )r(   rE  r   r   r   r   z(Unable to cleanup tasks from cgroup '%s')
r0   r-   CGROUP_CLEANUP_TASKS_RETRYr   r   r   r   r   rM   r   )r   r   cntdatar   r   r   r   _cgroup_cleanup_tasks_one\  s   
z)SchedulerPlugin._cgroup_cleanup_tasks_onec                 C   r  r   )rt   ry   rJ  r  r   r   r   _cgroup_cleanup_tasksi  r
  z%SchedulerPlugin._cgroup_cleanup_tasksc                    st   t t| || | jr|jr|j  |j  | 	  | 
  |   | js+| jr/|   | jr8|   d S d S r   )r+   r"   _instance_unapply_staticr/   rk   r   r<  r?  joinro   r$  rK  r6  r5  r  r  )r   r   full_rollbackrG   r   r   rL  o  s   

z(SchedulerPlugin._instance_unapply_staticc                 C   s   t d|  d| j|df }| jj|ddd}|dkrdS | j| j|}| j| j|}d| }||krFt tj	||f  dS t 
tj|||f  dS )	NzVerifying cgroup '%s' affinityr   r  r  Tr  zcgroup '%s' affinityF)rM   r   r   r   r   cpulist2stringcpulist_packrn   r-   STR_VERIFY_PROFILE_VALUE_OKr{   STR_VERIFY_PROFILE_VALUE_FAIL)r   r   r   r   current_affinityaffinity_descriptionr   r   r   _cgroup_verify_affinity_one|  s&   z+SchedulerPlugin._cgroup_verify_affinity_onec                 C   sn   t d d}| jd ur!| jd ur!| j| jvr!|o | | j| j}| j D ]}|o3| |d |d }q&|S )NzVeryfying cgroups affinitiesTr   r   )rM   r   r   rt   ry   rU  rx   )r   r  r  r   r   r   _cgroup_verify_affinity  s   
 z'SchedulerPlugin._cgroup_verify_affinityc                    s$   t t| |||}|  }|o|S r   )r+   r"   _instance_verify_staticrV  )r   r   ignore_missingdevicesret1ret2rG   r   r   rW    s   z'SchedulerPlugin._instance_verify_staticc           
   
   C   s   z|  |}W n2 ttfy9 } z$|jtjks|jtjkr%td|  n	td||f  W Y d }~d S d }~ww | j	
|j||}|d urq|| jvrstd||t|f  |\}}}	| |||||	 | j| j| j d S d S d S )N3Failed to get cmdline of PID %d, the task vanished.z#Failed to get cmdline of PID %d: %sz-tuning new process '%s' with PID '%d' by '%s')r   r   r   r   r   r   rM   r   r{   r   	re_lookupr9  rm   r|   r   rl   r<  r=   )
r   r   r   r%   r   r   vr   r   r   r   r   r   _add_pid  s2   	

zSchedulerPlugin._add_pidc                 C   s:   || j v r| j |= td|  | j| j| j  d S d S )Nz)removed PID %d from the rollback database)rm   rM   r   rl   r<  r=   )r   r   r   r   r   r   _remove_pid  s   

zSchedulerPlugin._remove_pidc           	      C   s   | j |j}t }|j }|D ]}|| q|j	 sxt
|| jd dkrq|j	 sqd}|rqd}| jD ]5}|j|}|rnd}|jtjksT| jr_|jtjkr_| |t|j| q9|jtjkrn| |t|j q9|s4|j	 rd S d S )Ni  r   TF)r   re_lookup_compiler9  selectpollr   
get_pollfdregisterr   is_setrS   r2   r;   read_on_cpur]   r9   RECORD_COMM_perf_process_fork_valueRECORD_FORKr_  r0   tidRECORD_EXITr`  )	r   r   r%   rc  fdsfdread_eventscpueventr   r   r   r>    s0   

"
zSchedulerPlugin._thread_coder   )
per_devicec                 C   B   |rd S |r|d urd dd tdt|D | _d S d S d S )N|c                 S      g | ]}d | qS z(%s)r   rW   r^  r   r   r   rY         z1SchedulerPlugin._ps_whitelist.<locals>.<listcomp>(?<!\\);)rM  r*  r   r|   r7   r   enablingr   verifyrX  r   r   r   r7     
   &zSchedulerPlugin._ps_whitelistr   c                 C   rs  )Nrt  c                 S   ru  rv  r   rw  r   r   r   rY     rx  z1SchedulerPlugin._ps_blacklist.<locals>.<listcomp>ry  )rM  r*  r   r|   r8   rz  r   r   r   r8     r}  zSchedulerPlugin._ps_blacklistr   c                 C   s@   |rd S |r|d ur|dv r|| _ d S | j|| _ d S d S d S )N)r   ignore)_default_irq_smp_affinity_valuer   cpulist_unpackrz  r   r   r   _default_irq_smp_affinity  s   
z)SchedulerPlugin._default_irq_smp_affinityr   c                 C   s2   |rd S |r|d ur| j |dk| _d S d S d S )Nr%  )r   r3   ri  rz  r   r   r   _perf_process_fork  s
   z"SchedulerPlugin._perf_process_forkc                 C   s    t |}td||f  |S )NzRead affinity '%s' of PID %d)r   get_affinityrM   r   )r   r   resr   r   r   r     s   
zSchedulerPlugin._get_affinityc              
   C   s   t d||f  z	t|| W dS  ttfyQ } z1t|dr/|jtjkr/t d|  n| 	|}|dks<|dkrFt 
d|||f  W Y d }~dS d }~ww )	Nz'Setting CPU affinity of PID %d to '%s'.Tr   z4Failed to set affinity of PID %d, the task vanished.r   r   z,Failed to set affinity of PID %d to '%s': %sF)rM   r   r   set_affinityr   r   r   r   r   r   r{   )r   r   r   r   r  r   r   r   r     s"   
zSchedulerPlugin._set_affinityc                 C   s"   t |t |}|rt|S |S r   )r<  intersectionr   )r   	affinity1	affinity2	affinity3affr   r   r   r     s   z'SchedulerPlugin._get_intersect_affinityc           
         s   fdd|D } j dkr fdd|D }tdd |D }|D ]h}z	 || }W n1 ttfy^ } z#|jtjksC|jtjkrKt	d|  n	t
d||f  W Y d }~q"d }~ww  j||dd	}	|	sjq"| jv ru| j| _|sd
|| v r || d
  |d q"d S )Nc                    s(   g | ]}t  j |d ur|qS r   )r*  r/  r7   _get_stat_commrw  r   r   r   rY     
    z9SchedulerPlugin._set_all_obj_affinity.<locals>.<listcomp>r(   c                    s(   g | ]}t  j |d u r|qS r   )r*  r/  r8   r  rw  r   r   r   rY     r  c                 S   s   g | ]}|j |fqS r   )r   rw  r   r   r   rY     s    r\  zARefusing to set affinity of PID %d, failed to get its cmdline: %sT)r   rg   )r8   rq   r   r   r   r   r   r   rM   r   r{   r   rm   r	   _set_all_obj_affinityr   )
r   objsr   rg   pslpsdr   r   r   r   r   r   r   r    sB   
	
z%SchedulerPlugin._set_all_obj_affinityc              
   C   s*   z|d d W S  t ttfy   Y dS w )Nr   r`   r(   )r   r   r   )r   r&   r   r   r   r  6  s
   zSchedulerPlugin._get_stat_commc              
   C   sb   zt  }|  | | |d W d S  ttfy0 } ztd|  W Y d }~d S d }~ww )NFr&  )	r   r   r   r  r   r   r   rM   r{   )r   r   r   r   r   r   r   _set_ps_affinity<  s   z SchedulerPlugin._set_ps_affinityc              
   C   s   z2| j |}td||f  d| }t|d}|| W d    W dS 1 s+w   Y  W dS  ttfyl } z,t|drW|j	t	j
krW|sWtd|  W Y d }~dS td|||f  W Y d }~d	S d }~ww )
Nz&Setting SMP affinity of IRQ %s to '%s'z/proc/irq/%s/smp_affinitywr   r   z/Setting SMP affinity of IRQ %s is not supportedr   z0Failed to set SMP affinity of IRQ %s to '%s': %sr   )r   cpulist2hexrM   r   r   writer   r   r   r   EIOr{   )r   r*   r   	restoringaffinity_hexfilenamer#   r   r   r   r   _set_irq_affinityG  s4   
z!SchedulerPlugin._set_irq_affinityc              
   C   s   z,| j |}td|  tdd}|| W d    W d S 1 s%w   Y  W d S  ttfyJ } ztd||f  W Y d }~d S d }~ww )Nz(Setting default SMP IRQ affinity to '%s'/proc/irq/default_smp_affinityr  z2Failed to set default SMP IRQ affinity to '%s': %s)	r   r  rM   r   r   r  r   r   r{   )r   r   r  r#   r   r   r   r   _set_default_irq_affinity_  s   &z)SchedulerPlugin._set_default_irq_affinityc           	   	   C   s  t  }t }| D ]H}z|| d }td||f  W n	 ty'   Y qw | |||}t|t|kr8q| 	||d}|dkrI||j
|< q|dkrS|j| q| jd}| j|}| jdkrm| |||}n| jdkru| j}| jdkr| | ||_| j| j| d S )	Nr   zRead affinity of IRQ '%s': '%s'Fr   r   r  r   r~  )r   r   
interruptsr   rM   r   r   r   r<  r  r   r!   appendr   r   r   r  r  r    rl   r>   )	r   r   irq_originalr   r*   r   r   r  prev_affinity_hexr   r   r   _set_all_irq_affinityj  s<   




z%SchedulerPlugin._set_all_irq_affinityc                 C   sj   | j | jd }|d u rd S |j D ]\}}| ||d q| jdkr,|j}| | | j 	| j d S )NTr~  )
rl   r5   r>   r   rx   r  r  r    r  rp   )r   r  r*   r   r   r   r   _restore_all_irq_affinity  s   

z)SchedulerPlugin._restore_all_irq_affinityc                 C   sH   t |t |}|rttj||f  |S ttj|||f  |S r   )r<  issubsetrM   rn   r-   rQ  r{   rR  )r   irq_descriptioncorrect_affinityrS  r  r   r   r   _verify_irq_affinity  s   z$SchedulerPlugin._verify_irq_affinityc              	   C   s   | j | jd }t }d}| D ]=}||jv r(|r(d| }tt	j
|  qz|| d }td||f  d| }	| |	||sEd}W q tyO   Y qw | jd}
| j|
}| jdkrr| d	|| jd
krl|n| jsrd}|S )NTz-IRQ %s does not support changing SMP affinityr   z#Read SMP affinity of IRQ '%s': '%s'zSMP affinity of IRQ %sFr  r~  zdefault IRQ SMP affinityr   )rl   r5   r>   r   r  r   r!   rM   rn   r-    STR_VERIFY_PROFILE_VALUE_MISSINGr   r  r   r   r   r   r  )r   r  rX  r  r   r  r*   descriptionrS  r  current_affinity_hexr   r   r   _verify_all_irq_affinity  sD   z(SchedulerPlugin._verify_all_irq_affinityr   
   )rr  r   c           
      C   s   d }d | _ |d ur9t| j|}t| j}||r)t|| }| j|| _ n| j| j}t	d||f  |s=|rC|d u rCd S |rK| 
||S |rh| jrZ|   d| j }	n|}	| |	 | | d S |   d S )NzJInvalid isolated_cores specified, '%s' does not match available cores '%s'z	cgroup.%s)r   r<  r   r  r;   r  r   rO  rM   r{   r  rt   r#  r  r  r  )
r   r{  r   r|  rX  r   isolatedpresentstr_cpusps_affinityr   r   r   _isolated_cores  s0   


zSchedulerPlugin._isolated_cores)F)Kr   r   r   __doc__r   
SCHED_FIFOSCHED_BATCHSCHED_RRSCHED_OTHER
SCHED_IDLEr   r   rP   r   r   classmethodr   rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r  r  r  r"  r#  r$  r7  ro   rJ  rK  rL  rU  rV  rW  r_  r`  r>  command_customr7   r8   r  r  r   r   r   r  r  r  r  r  r  r  r  r  r  __classcell__r   r   rG   r   r"   7   s    >




	


;	









r"   )r(   r   
decorators
tuned.logstunedr*  
subprocessr}   r9   rb  tuned.constsr-   r   r   tuned.utils.commandsr   r   r  ru   rK   logsr5   rM   objectr   r   Pluginr"   r   r   r   r   <module>   s(   
