Edit File: plugin_scheduler.cpython-36.opt-1.pyc
3 ��c��������������������@���s ��d�dl�mZ�d�dlT�ddlZddlZddlT�ddlZddlZddl Z ddl jZddlZddl mZ�ddlZddlZddlZddlZy ej�W�n�ek r����ddlZY�nX�ejj��ZG�dd��de�ZG�dd ��d e�ZG�d d��de�ZG�dd ��d e�ZG�dd��dej�ZdS�)����)�base)�*�����N)�commandsc���������������@���s0���e�Zd�Zddd�Zedd���Zejdd���ZdS�)�SchedulerParamsNc�������������C���s(���||�_�||�_||�_||�_||�_||�_d�S�)N)�_cmd�cmdline� scheduler�priority�affinity�cgroup)�self�cmdr���r ���r ���r���r�����r����&/usr/lib/python3.6/plugin_scheduler.py�__init__���s����zSchedulerParams.__init__c�������������C���s ���|�j�d�krd�S�|�jj|�j��S�d�S�)N)� _affinityr���Zbitmask2cpulist)r ���r���r���r���r���&���s���� zSchedulerParams.affinityc�������������C���s"���|d�krd�|�_�n|�jj|�|�_�d�S�)N)r���r���Zcpulist2bitmask)r ����valuer���r���r���r���-���s����)NNNNN)�__name__� __module__�__qualname__r����propertyr����setterr���r���r���r���r������s���� r���c���������������@���s���e�Zd�Zdd��ZdS�)� IRQAffinitiesc�������������C���s���i�|�_�d�|�_g�|�_d�S�)N)�irqs�default�unchangeable)r ���r���r���r���r���5���s����zIRQAffinities.__init__N)r���r���r���r���r���r���r���r���r���4���s���r���c���������������@���sp���e�Zd�ZdZdddddd�Zdd ��Zd d��Zdd ��Zdd��Zdd��Z dd��Z dd��Zdd��Zdd��Z dd��ZdS�)�SchedulerUtilsz= Class encapsulating scheduler implementation in os module � SCHED_FIFO�SCHED_BATCH�SCHED_RR�SCHED_OTHER� SCHED_IDLE)�f�b�r�o�ic�������������C���s8���t�dd��|�jj��D���|�_t�dd��|�jj��D���|�_d�S�)Nc�������������s���s ���|�]\}}|t�t|�fV��qd�S�)N)�getattr�os)�.0�k�namer���r���r���� <genexpr>J���s����z*SchedulerUtils.__init__.<locals>.<genexpr>c�������������s���s���|�]}t�t|�|fV��qd�S�)N)r(���r)���)r*���r,���r���r���r���r-���L���s����)�dict�_dict_schedcfg2schedconst�items�_dict_schedcfg2num�values�_dict_num2schedconst)r ���r���r���r���r���H���s����zSchedulerUtils.__init__c�������������C���s���|�j�j|�S�)N)r1����get)r ���� str_schedulerr���r���r����sched_cfg_to_numN���s����zSchedulerUtils.sched_cfg_to_numc�������������C���s���|�j�j|�S�)N)r3���r4���)r ���r ���r���r���r����sched_num_to_constR���s����z!SchedulerUtils.sched_num_to_constc�������������C���s ���t�j|�S�)N)r)����sched_getscheduler)r ����pidr���r���r���� get_schedulerU���s����zSchedulerUtils.get_schedulerc�������������C���s���t�j||t�j|���d�S�)N)r)����sched_setscheduler�sched_param)r ���r9����sched�prior���r���r���� set_schedulerX���s����zSchedulerUtils.set_schedulerc�������������C���s ���t�j|�S�)N)r)����sched_getaffinity)r ���r9���r���r���r����get_affinity[���s����zSchedulerUtils.get_affinityc�������������C���s���t�j||��d�S�)N)r)����sched_setaffinity)r ���r9���r���r���r���r����set_affinity^���s����zSchedulerUtils.set_affinityc�������������C���s���t�j|�jS�)N)r)����sched_getparam�sched_priority)r ���r9���r���r���r����get_prioritya���s����zSchedulerUtils.get_priorityc�������������C���s ���t�j|�S�)N)r)����sched_get_priority_min)r ���r=���r���r���r����get_priority_mind���s����zSchedulerUtils.get_priority_minc�������������C���s ���t�j|�S�)N)r)����sched_get_priority_max)r ���r=���r���r���r����get_priority_maxg���s����zSchedulerUtils.get_priority_maxN)r���r���r����__doc__r/���r���r6���r7���r:���r?���rA���rC���rF���rH���rJ���r���r���r���r���r���;���s ���r���c���������������@���sP���e�Zd�ZdZdd��Zdd��Zdd��Zdd ��Zd d��Zdd ��Z dd��Z dd��ZdS�)�SchedulerUtilsSchedutilszE Class encapsulating scheduler implementation in schedutils module c�������������C���s8���t�dd��|�jj��D���|�_t�dd��|�jj��D���|�_d�S�)Nc�������������s���s ���|�]\}}|t�t|�fV��qd�S�)N)r(���� schedutils)r*���r+���r,���r���r���r���r-���p���s����z4SchedulerUtilsSchedutils.__init__.<locals>.<genexpr>c�������������s���s���|�]}t�t|�|fV��qd�S�)N)r(���rM���)r*���r,���r���r���r���r-���r���s����)r.���r/���r0���r1���r2���r3���)r ���r���r���r���r���n���s����z!SchedulerUtilsSchedutils.__init__c�������������C���s ���t�j|�S�)N)rM���r:���)r ���r9���r���r���r���r:���t���s����z&SchedulerUtilsSchedutils.get_schedulerc�������������C���s���t�j|||��d�S�)N)rM���r?���)r ���r9���r=���r>���r���r���r���r?���w���s����z&SchedulerUtilsSchedutils.set_schedulerc�������������C���s ���t�j|�S�)N)rM���rA���)r ���r9���r���r���r���rA���z���s����z%SchedulerUtilsSchedutils.get_affinityc�������������C���s���t�j||��d�S�)N)rM���rC���)r ���r9���r���r���r���r���rC���}���s����z%SchedulerUtilsSchedutils.set_affinityc�������������C���s ���t�j|�S�)N)rM���rF���)r ���r9���r���r���r���rF�������s����z%SchedulerUtilsSchedutils.get_priorityc�������������C���s ���t�j|�S�)N)rM���rH���)r ���r=���r���r���r���rH�������s����z)SchedulerUtilsSchedutils.get_priority_minc�������������C���s ���t�j|�S�)N)rM���rJ���)r ���r=���r���r���r���rJ�������s����z)SchedulerUtilsSchedutils.get_priority_maxN)r���r���r���rK���r���r:���r?���rA���rC���rF���rH���rJ���r���r���r���r���rL���j���s���rL���c�������������������s���e�Zd�ZdZ��fdd�Zdd��Zdd��Zdd ��Zed d���Z dd ��Z dd��Zdd��Zdd��Z dd��Zdd��Zdd��Zdd��Zdd��Zdd��Zd�d!d"�Zd#d$��Zd%d&��Zd'd(��Zd�d)d*�Zd+d,��Zd-d.��Zd/d0��Zd1d2��Zd3d4��Zd5d6��Zd7d8��Zd9d:��Z d;d<��Z!d=d>��Z"d�d?d@�Z#dAdB��Z$dCdD��Z%��fdEdF�Z&dGdH��Z'dIdJ��Z(dKdL��Z)d�fdMdN� Z*dOdP��Z+dQdR��Z,��fdSdT�Z-dUdV��Z.dWdX��Z/dYdZ��Z0e1d[d d\�d]d^���Z2e1d_d d\�d`da���Z3e1dbd d\�dcdd���Z4e1ded d\�dfdg���Z5e1dhd d\�didj���Z6dkdl��Z7dmdn��Z8dodp��Z9d�dqdr�Z:dsdt��Z;dudv��Z<dwdx��Z=dydz��Z>d{d|��Z?d}d~��Z@dd���ZAd�d���ZBd�d���ZCe1d�d d�d��d�d����ZDd�d���ZEd�d���ZFd�d���ZGeHd��d�d����ZIeJd��d�d����ZKeHd��d�d����ZLeJd��d�d����ZMeHd��d�d����ZNeJd��d�d����ZOeHd��d�d����ZPeJd��d�d����ZQeHd��d�d����ZReJd��d�d����ZSeHd��d�d����ZTeJd��d�d����ZUeHd��d�d����ZVeJd��d�d����ZWeHd��d�d����ZXeJd��d�d����ZYeHd��d�d����ZZeJd��d�d����Z[eHd��d�d����Z\eJd��d�d����Z]���Z^S�)��SchedulerPlugina�+�� `scheduler`:: Allows tuning of scheduling priorities, process/thread/IRQ affinities, and CPU isolation. + To prevent processes/threads/IRQs from using certain CPUs, use the [option]`isolated_cores` option. It changes process/thread affinities, IRQs affinities and it sets `default_smp_affinity` for IRQs. The CPU affinity mask is adjusted for all processes and threads matching [option]`ps_whitelist` option subject to success of the `sched_setaffinity()` system call. The default setting of the [option]`ps_whitelist` regular expression is `.*` to match all processes and thread names. To exclude certain processes and threads use [option]`ps_blacklist` option. The value of this option is also interpreted as a regular expression and process/thread names (`ps -eo cmd`) are matched against that expression. Profile rollback allows all matching processes and threads to run on all CPUs and restores the IRQ settings prior to the profile application. + Multiple regular expressions for [option]`ps_whitelist` and [option]`ps_blacklist` options are allowed and separated by `;`. Quoted semicolon `\;` is taken literally. + .Isolate CPUs 2-4 ==== ---- [scheduler] isolated_cores=2-4 ps_blacklist=.*pmd.*;.*PMD.*;^DPDK;.*qemu-kvm.* ---- Isolate CPUs 2-4 while ignoring processes and threads matching `ps_blacklist` regular expressions. ==== The [option]`default_irq_smp_affinity` option controls the values *TuneD* writes to `/proc/irq/default_smp_affinity`. The file specifies default affinity mask that applies to all non-active IRQs. Once an IRQ is allocated/activated its affinity bitmask will be set to the default mask. + The following values are supported: + -- `calc`:: Content of `/proc/irq/default_smp_affinity` will be calculated from the `isolated_cores` parameter. Non-isolated cores are calculated as an inversion of the `isolated_cores`. Then the intersection of the non-isolated cores and the previous content of `/proc/irq/default_smp_affinity` is written to `/proc/irq/default_smp_affinity`. If the intersection is an empty set, then just the non-isolated cores are written to `/proc/irq/default_smp_affinity`. This behavior is the default if the parameter `default_irq_smp_affinity` is omitted. `ignore`:: *TuneD* will not touch `/proc/irq/default_smp_affinity`. explicit cpulist:: The cpulist (such as 1,3-4) is unpacked and written directly to `/proc/irq/default_smp_affinity`. -- + .An explicit CPU list to set the default IRQ smp affinity to CPUs 0 and 2 ==== ---- [scheduler] isolated_cores=1,3 default_irq_smp_affinity=0,2 ---- ==== To adjust scheduling policy, priority and affinity for a group of processes/threads, use the following syntax. + [subs="+quotes,+macros"] ---- group.__groupname__=__rule_prio__:__sched__:__prio__:__affinity__:__regex__ ---- + where `__rule_prio__` defines internal *TuneD* priority of the rule. Rules are sorted based on priority. This is needed for inheritence to be able to reorder previously defined rules. Equal `__rule_prio__` rules should be processed in the order they were defined. However, this is Python interpreter dependant. To disable an inherited rule for `__groupname__` use: + [subs="+quotes,+macros"] ---- group.__groupname__= ---- + `__sched__` must be one of: *`f`* for FIFO, *`b`* for batch, *`r`* for round robin, *`o`* for other, *`*`* do not change. + `__affinity__` is CPU affinity in hexadecimal. Use `*` for no change. + `__prio__` scheduling priority (see `chrt -m`). + `__regex__` is Python regular expression. It is matched against the output of + [subs="+quotes,+macros"] ---- ps -eo cmd ---- + Any given process name may match more than one group. In such a case, the priority and scheduling policy are taken from the last matching `__regex__`. + .Setting scheduling policy and priorities to kernel threads and watchdog ==== ---- [scheduler] group.kthreads=0:*:1:*:\[.*\]$ group.watchdog=0:f:99:*:\[watchdog.*\] ---- ==== + The scheduler plug-in uses perf event loop to catch newly created processes. By default it listens to `perf.RECORD_COMM` and `perf.RECORD_EXIT` events. By setting [option]`perf_process_fork` option to `true`, `perf.RECORD_FORK` events will be also listened to. In other words, child processes created by the `fork()` system call will be processed. Since child processes inherit CPU affinity from their parents, the scheduler plug-in usually does not need to explicitly process these events. As processing perf events can pose a significant CPU overhead, the [option]`perf_process_fork` option parameter is set to `false` by default. Due to this, child processes are not processed by the scheduler plug-in. + The CPU overhead of the scheduler plugin can be mitigated by using the scheduler [option]`runtime` option and setting it to `0`. This will completely disable the dynamic scheduler functionality and the perf events will not be monitored and acted upon. The disadvantage ot this approach is the procees/thread tuning will be done only at profile application. + .Disabling the scheduler dynamic functionality ==== ---- [scheduler] runtime=0 isolated_cores=1,3 ---- ==== + NOTE: For perf events, memory mapped buffer is used. Under heavy load the buffer may overflow. In such cases the `scheduler` plug-in may start missing events and failing to process some newly created processes. Increasing the buffer size may help. The buffer size can be set with the [option]`perf_mmap_pages` option. The value of this parameter has to expressed in powers of 2. If it is not the power of 2, the nearest higher power of 2 value is calculated from it and this calculated value used. If the [option]`perf_mmap_pages` option is omitted, the default kernel value is used. + The scheduler plug-in supports process/thread confinement using cgroups v1. + [option]`cgroup_mount_point` option specifies the path to mount the cgroup filesystem or where *TuneD* expects it to be mounted. If unset, `/sys/fs/cgroup/cpuset` is expected. + If [option]`cgroup_groups_init` option is set to `1` *TuneD* will create (and remove) all cgroups defined with the `cgroup*` options. This is the default behavior. If it is set to `0` the cgroups need to be preset by other means. + If [option]`cgroup_mount_point_init` option is set to `1`, *TuneD* will create (and remove) the cgroup mountpoint. It implies `cgroup_groups_init = 1`. If set to `0` the cgroups mount point needs to be preset by other means. This is the default behavior. + The [option]`cgroup_for_isolated_cores` option is the cgroup name used for the [option]`isolated_cores` option functionality. For example, if a system has 4 CPUs, `isolated_cores=1` means that all processes/threads will be moved to CPUs 0,2-3. The scheduler plug-in will isolate the specified core by writing the calculated CPU affinity to the `cpuset.cpus` control file of the specified cgroup and move all the matching processes/threads to this group. If this option is unset, classic cpuset affinity using `sched_setaffinity()` will be used. + [option]`cgroup.__cgroup_name__` option defines affinities for arbitrary cgroups. Even hierarchic cgroups can be used, but the hieararchy needs to be specified in the correct order. Also *TuneD* does not do any sanity checks here, with the exception that it forces the cgroup to be under [option]`cgroup_mount_point`. + The syntax of the scheduler option starting with `group.` has been augmented to use `cgroup.__cgroup_name__` instead of the hexadecimal `__affinity__`. The matching processes will be moved to the cgroup `__cgroup_name__`. It is also possible to use cgroups which have not been defined by the [option]`cgroup.` option as described above, i.e. cgroups not managed by *TuneD*. + All cgroup names are sanitized by replacing all all dots (`.`) with slashes (`/`). This is to prevent the plug-in from writing outside [option]`cgroup_mount_point`. + .Using cgroups v1 with the scheduler plug-in ==== ---- [scheduler] cgroup_mount_point=/sys/fs/cgroup/cpuset cgroup_mount_point_init=1 cgroup_groups_init=1 cgroup_for_isolated_cores=group cgroup.group1=2 cgroup.group2=0,2 group.ksoftirqd=0:f:2:cgroup.group1:ksoftirqd.* ps_blacklist=ksoftirqd.*;rcuc.*;rcub.*;ktimersoftd.* isolated_cores=1 ---- Cgroup `group1` has the affinity set to CPU 2 and the cgroup `group2` to CPUs 0,2. Given a 4 CPU setup, the [option]`isolated_cores=1` option causes all processes/threads to be moved to CPU cores 0,2-3. Processes/threads that are blacklisted by the [option]`ps_blacklist` regular expression will not be moved. The scheduler plug-in will isolate the specified core by writing the CPU affinity 0,2-3 to the `cpuset.cpus` control file of the `group` and move all the matching processes/threads to this cgroup. ==== Option [option]`cgroup_ps_blacklist` allows excluding processes which belong to the blacklisted cgroups. The regular expression specified by this option is matched against cgroup hierarchies from `/proc/PID/cgroups`. Cgroups v1 hierarchies from `/proc/PID/cgroups` are separated by commas ',' prior to regular expression matching. The following is an example of content against which the regular expression is matched against: `10:hugetlb:/,9:perf_event:/,8:blkio:/` + Multiple regular expressions can be separated by semicolon ';'. The semicolon represents a logical 'or' operator. + .Cgroup-based exclusion of processes from the scheduler ==== ---- [scheduler] isolated_cores=1 cgroup_ps_blacklist=:/daemons ---- The scheduler plug-in will move all processes away from core 1 except processes which belong to cgroup '/daemons'. The '' is a regular expression metacharacter that matches a word boundary. ---- [scheduler] isolated_cores=1 cgroup_ps_blacklist=8:blkio: ---- The scheduler plug-in will exclude all processes which belong to a cgroup with hierarchy-ID 8 and controller-list blkio. ==== Recent kernels moved some `sched_` and `numa_balancing_` kernel run-time parameters from `/proc/sys/kernel`, managed by the `sysctl` utility, to `debugfs`, typically mounted under `/sys/kernel/debug`. TuneD provides an abstraction mechanism for the following parameters via the scheduler plug-in: [option]`sched_min_granularity_ns`, [option]`sched_latency_ns`, [option]`sched_wakeup_granularity_ns`, [option]`sched_tunable_scaling`, [option]`sched_migration_cost_ns`, [option]`sched_nr_migrate`, [option]`numa_balancing_scan_delay_ms`, [option]`numa_balancing_scan_period_min_ms`, [option]`numa_balancing_scan_period_max_ms` and [option]`numa_balancing_scan_size_mb`. Based on the kernel used, TuneD will write the specified value to the correct location. + .Set tasks' "cache hot" value for migration decisions. ==== ---- [scheduler] sched_migration_cost_ns=500000 ---- On the old kernels, this is equivalent to: ---- [sysctl] kernel.sched_migration_cost_ns=500000 ---- that is, value `500000` will be written to `/proc/sys/kernel/sched_migration_cost_ns`. However, on more recent kernels, the value `500000` will be written to `/sys/kernel/debug/sched/migration_cost_ns`. ==== c ������� ���������s����t�t|��j||||||||��d|�_tj|�_ttj�|�_ |d�k rh|j tjtj�|�_t|jtj tj��|�_ t��|�_d�|�_i�|�_d|�_d|�_d|�_tj��|�_|�jdd�|�_|�jdd�|�_d�|�_yt��|�_W�n�tk r����t��|�_Y�nX�d�S�)NTz.*��r ���)Zcommand_name�irq) �superrN���r���Z_has_dynamic_options�constsZCFG_DEF_DAEMON�_daemon�intZCFG_DEF_SLEEP_INTERVAL�_sleep_interval�get_boolZ CFG_DAEMONr4���ZCFG_SLEEP_INTERVALr���r����_secure_boot_hint�_sched_knob_paths_cache� _ps_whitelist� _ps_blacklist�_cgroup_ps_blacklist_re�perfZcpu_map�_cpusZ_storage_key�_scheduler_storage_key�_irq_storage_key�_evlistr����_scheduler_utils�AttributeErrorrL���) r ���Zmonitor_repositoryZstorage_factoryZhardware_inventoryZdevice_matcherZdevice_matcher_udevZplugin_instance_factoryZ global_cfg� variables)� __class__r���r���r������s.���� zSchedulerPlugin.__init__c�������������C���sT���|d�krd�S�yt�|�}W�n�tk r,���dS�X�|dkr:dS�t�dtjtj|d����S�)Nr�������)rT���� ValueError�mathZceil�log)r ���Z mmap_pagesZmpr���r���r����_calc_mmap_pages���s����z SchedulerPlugin._calc_mmap_pagesc����������������s���d|_�d|_d|_��jj��ji����_t��j�dkrXtj d����j ���i���_��jj��j��t����_ d���_d��_d���_tj��fdd�|jj��D�����_|j|_��jj|jd��}��j|�}|dkr�tjd|���d�}|d�k r�t|�|kr�tj d ||f���x&|jD�]}��jj|j|��|j|<�q�W���jj|jjd d��dk�r@d|_tj��|_ ��j!�r�|j�r�y�t"j#��|_$t"j%t"j&t"j'ddddddt"j(t"j)B�d � }|j*��j+|j$d��t"j,��j+|j$�|_-|j-j.|��|d�k�r�|j-j/���n|j-j/|d��W�n���d|_Y�nX�d�S�)NFTr���z0recovering scheduling settings from previous runc����������������sJ���g�|�]B\}}|d�d��dkrt�|�dkr��j|dd������jj|�f�qS�)N����zcgroup.)�len�_sanitize_cgroup_path� _variables�expand)r*����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'Zruntimer����0) �type�configZtask�comm�mmapZfreqZ wakeup_eventsZ watermarkZsample_type)Zcpus�threads)Zpages)0Z_has_dynamic_tuningZ_has_static_tuning�_runtime_tuning�_storager4���r^����_scheduler_originalrk���rh����info�_restore_ps_affinity�unsetr.����_cgroups_original_affinityr����_cgroup_affinity_initialized�_cgroup�collections�OrderedDict�optionsr0����_cgroups� _schedulerrm���rn���ri����error�strr���rV���� threadingZEvent� _terminaterS���r\���Z thread_mapZ_threads�evselZ TYPE_SOFTWAREZCOUNT_SW_DUMMYZ SAMPLE_TIDZ SAMPLE_CPU�openr]���Zevlistr`����addrv���)r ����instanceZperf_mmap_pages_rawrq���r+���r����r���)r ���r����_instance_init���s\���� zSchedulerPlugin._instance_initc�������������C���s*���|�j�r&x|j�j��D�]}tj|j��qW�d�S�)N)r`���� get_pollfdr)����closer,���)r ���r�����fdr���r���r����_instance_cleanup��s����z!SchedulerPlugin._instance_cleanupc�������������C���s2���d�t�jddd�d�d�d�dd�dd�d�d�d�d�d�d�d�d�d�d�S�)NFT�calcZfalse)�isolated_cores�cgroup_mount_point�cgroup_mount_point_init�cgroup_groups_init�cgroup_for_isolated_cores�cgroup_ps_blacklist�ps_whitelist�ps_blacklist�default_irq_smp_affinityrq����perf_process_fork�sched_min_granularity_ns�sched_latency_ns�sched_wakeup_granularity_ns�sched_tunable_scaling�sched_migration_cost_ns�sched_nr_migrate�numa_balancing_scan_delay_ms�!numa_balancing_scan_period_min_ms�!numa_balancing_scan_period_max_ms�numa_balancing_scan_size_mb)rR���ZDEF_CGROUP_MOUNT_POINT)�clsr���r���r����_get_config_options��s*����z#SchedulerPlugin._get_config_optionsc�������������C���s���|d�k rt�|�jdd�S�d�S�)N�.�/)r�����replace)r ���r���r���r���r���rl���0��s����z%SchedulerPlugin._sanitize_cgroup_pathc�������������C���s>���t�|tj�s|}tj|�}tj|�}|�j|�r:d|�d�}|S�)N�[�])� isinstance�procfs�processZprocess_cmdline�_is_kthread)r ���r����r9���r���r���r���r����_get_cmdline4��s���� zSchedulerPlugin._get_cmdlinec�������������C���s����t�j��}|j���i�}x�|j��D�]�}yN|�j|�}|d�}|||<�d|krnx&|d�j��D�]}|�j|�}|||<�qTW�W�q�ttfk r��}�z$|jtj ks�|jtj kr�wn��W�Y�d�d�}~X�qX�qW�|S�)Nr9���rw���)r�����pidstats�reload_threadsr2���r�����keys�OSError�IOError�errno�ENOENT�ESRCH)r ����ps� processes�procr���r9����er���r���r���� get_processes>��s$���� zSchedulerPlugin.get_processesc�������������C���s@���|�j�j|�}|�j�j|�}|�j�j|�}tjd|||f���||fS�)Nz8Read scheduler policy '%s' and priority '%d' of PID '%d')ra���r:���r7���rF���rh����debug)r ���r9���r ���� sched_strr ���r���r���r����_get_rtW��s����zSchedulerPlugin._get_rtc�������������C���s��|�j�j|�}tjd|||f���yB|�j�j|�}|�j�j|�}||k�sJ||kr`tjd||||f���W�n4�ttfk r��}�ztjd|���W�Y�d�d�}~X�nX�y|�j�j |||��W�n`�ttfk �r�}�z>t |d�r�|jtjkr�tjd|���ntjd||f���W�Y�d�d�}~X�nX�d�S�)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) ra���r7���rh���r����rH���rJ���r�����SystemErrorr����r?����hasattrr����r����)r ���r9���r=���r>���r����Zprio_minZprio_maxr����r���r���r����_set_rt_��s*���� zSchedulerPlugin._set_rtc�������������C���s���|d�d�t�jj@�dkS�)N�stat�flagsr���)r����ZpidstatZ PF_KTHREAD)r ���r����r���r���r���r����{��s����zSchedulerPlugin._is_kthreadc�������������C���s��yjt�j|�}|d�j��rd|d�d�dkr8tjd|���n(|�j|�rRtjd|���ntjd|���dS�dS�W�n��ttfk r��}�zF|j t j ks�|j t jkr�tjd |���dS�tjd ||f���d S�W�Y�d�d�}~X�n8�t tfk �r�}�ztjd ||f���dS�d�}~X�nX�d�S�)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: %sre���������r����)r����r����Zis_bound_to_cpurh���r����r�����warnr����r����r����r����r����r����rb����KeyError)r ���r9���r����r����r���r���r����_affinity_changeable���s2���� z$SchedulerPlugin._affinity_changeablec�������������C���s\���y|�j�|�}W�n(�tk r6���t|�j�}||�j�|<�Y�nX�|jd�krX|jd�krX||_||_d�S�)N)rz���r����r���r���r ���r ���)r ���r9���r ���r ����paramsr���r���r����_store_orig_process_rt���s���� z&SchedulerPlugin._store_orig_process_rtc�������������C���s����d}|d�kr|d�kr|S�y:|�j�|�\}}|d�kr4|}|�j|||��|�j|||��W�nt�ttfk r��}�zTt|d�r�|jtjkr�tj d|���||�j kr�|�j |=�d}ntjd||f���W�Y�d�d�}~X�nX�|S�)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����rh���r����rz���r����)r ���r9���r=���r>����contZ prev_schedZ prev_prior����r���r���r����_tune_process_rt���s&���� z SchedulerPlugin._tune_process_rtc�������������C���s���t�|�d�d��dkS�)Nrj���zcgroup.)r����)r ���r���r���r���r����_is_cgroup_affinity���s����z#SchedulerPlugin._is_cgroup_affinityFc�������������C���sb���y|�j�|�}W�n(�tk r6���t|�j�}||�j�|<�Y�nX�|jd�kr^|jd�kr^|rX||_n||_d�S�)N)rz���r����r���r���r���r���)r ���r9���r���� is_cgroupr����r���r���r����_store_orig_process_affinity���s���� z,SchedulerPlugin._store_orig_process_affinityc�������������C���sp���xj|�j�jdtjt|�df�dd�jd�D�]@}y&|jd�d�dd���}|dkrP|S�d S��tk rf���Y�q(X�q(W�d S�) Nz%s/%s/%sr���T)�no_error� z:cpuset:r���rO���r����)r���� read_filerR���ZPROCFS_MOUNT_POINTr�����split� IndexError)r ���r9����lr���r���r���r����_get_cgroup_affinity���s����, z$SchedulerPlugin._get_cgroup_affinityc�������������C���sB���|�j�|�}|�j}|dkr$d||f�}|�jjd|�t|�dd��d�S�)Nr����z%s/%sz%s/tasksT)r����)rl����_cgroup_mount_pointr���� write_to_filer����)r ���r9���r����pathr���r���r����_set_cgroup���s ���� zSchedulerPlugin._set_cgroupc�������������C���s,���|dd���}t�|t��o"t|�dk}||fS�)Nrj���r���)r�����listrk���)r ���r���r����r���r���r����_parse_cgroup_affinity���s����z&SchedulerPlugin._parse_cgroup_affinityc������� ������C���s����d}|d�kr|S�yd|�j�|�\}}|r<|�j|�}|�j||��n(|�j|�}|rX|�j|||�}|�j||��|�j|||��W�nt�ttfk r��}�zTt |d�r�|j t jkr�tj d|���||�jkr�|�j|=�d}ntjd||f���W�Y�d�d�}~X�nX�|S�)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����rh���r����rz���r����) r ���r9���r���� intersectr����r����r���� prev_affinityr����r���r���r����_tune_process_affinity���s4���� z&SchedulerPlugin._tune_process_affinityc�������������C���sF���|�j�|||�}|sd�S�|�j||�}|�s2||�jkr6d�S�||�j|�_d�S�)N)r����r����rz���r���)r ���r9���r���r=���r>���r���r����r���r���r���� _tune_process ��s����zSchedulerPlugin._tune_processc�������������C���sf���|�j�j|�}|d�kr.|dkr.tjd|���dS�yt|�}W�n"�tk r\���tjd|���dS�X�||fS�)Nr���z>Invalid scheduler: %s. Scheduler and priority will be ignored.z=Invalid priority: %s. Scheduler and priority will be ignored.)NN)NN)ra���r6���rh���r����rT���rf���)r ���r5���Zstr_priorityr ���r ���r���r���r����_convert_sched_params��s����z%SchedulerPlugin._convert_sched_paramsc�������������C���sD���|dkrd�}n2|�j�|�r|}n"|�jj|�}|s@tjd|���d�}|S�)Nr���z)Invalid affinity: %s. It will be ignored.)r����r����hex2cpulistrh���r����)r ���Zstr_affinityr���r���r���r����_convert_affinity"��s���� z!SchedulerPlugin._convert_affinityc�������������C���s6���|\}}}}}|�j�||�\}}|�j|�}|||||fS�)N)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�}ytj|tj��W�n4�tk rT�}�ztjd||f���W�Y�d�d�}~X�nX�|�jj d|df�|�jj d|�j�df�dd�dd�s�tjd|���d�S�)Nz%s/%sz Unable to create cgroup '%s': %szcpuset.memsT)r����z3Unable to initialize 'cpuset.mems ' for cgroup '%s')r����r)����mkdirrR����DEF_CGROUP_MODEr����rh���r����r���r����r����)r ���r���r����r����r���r���r����_cgroup_create_group6��s����$z$SchedulerPlugin._cgroup_create_groupc�������������C���s@���|�j�d�k r"|�j�|�jkr"|�j|�j���x|�jD�]}|�j|��q*W�d�S�)N)r����r����r����)r ����cgr���r���r����_cgroup_initialize_groupsA��s����z)SchedulerPlugin._cgroup_initialize_groupsc�������������C���s����t�jd��ytj|�jtj��W�n0�tk rN�}�zt�jd|���W�Y�d�d�}~X�nX�|�j j dddddd|�jg�\}}|dkr�t�jd |�j���d�S�) NzInitializing cgroups settingsz'Unable to create cgroup mount point: %sZmountz-tr���z-oZcpusetr���zUnable to mount '%s')rh���r����r)����makedirsr����rR���r����r����r����r����execute)r ���r�����ret�outr���r���r����_cgroup_initializeG��s���� z"SchedulerPlugin._cgroup_initializec�������������C���sH���yt�j|��W�n4�tk rB�}�ztjd||f���W�Y�d�d�}~X�nX�d�S�)Nz#Unable to remove directory '%s': %s)r)����rmdirr����rh���r����)r ���r���r����r���r���r����_remove_dirQ��s����zSchedulerPlugin._remove_dirc�������������C���sX���x&t�|�j�D�]}|�jd|�j|f���qW�|�jd�k rT|�j|�jkrT|�jd|�j|�jf���d�S�)Nz%s/%s)�reversedr����r����r����r����)r ���r����r���r���r����_cgroup_finalize_groupsW��s����z'SchedulerPlugin._cgroup_finalize_groupsc�������������C���sl���t�jd��|�jjd|�jg�\}}|dkr<t�jd|�j���dS�|�j|�j��tjj |�j�}|dkrh|�j|��d�S�)NzRemoving cgroups settingsZumountr���zUnable to umount '%s'Fr����) rh���r����r���r����r����r����r����r)���r�����dirname)r ���r����r�����dr���r���r����_cgroup_finalize]��s���� z SchedulerPlugin._cgroup_finalizec�������������C���s����|dkrt�jd||f���nt�jd|���d�S�d|�j|df�}|r~|�jj|ddd�j��}|dkrl||�j|<�nt�jd |���d�S�|�jj||dd �s�t�j d||f���d�S�)NrO���z$Setting cgroup '%s' affinity to '%s'z.Skipping cgroup '%s', empty affinity requestedz%s/%s/%szcpuset.cpus�ERRT)�err_retr����zIRefusing to set affinity of cgroup '%s', reading original affinity failed)r����z+Unable to set affinity '%s' for cgroup '%s') rh���r����r����r���r�����stripr~����errr����r����)r ���r���r����backupr����Z orig_affinityr���r���r����_cgroup_set_affinity_oneh��s����z(SchedulerPlugin._cgroup_set_affinity_onec�������������C���s~���|�j�r d�S�tjd��|�jd�k rH|�jd�k rH|�j|�jkrH|�j|�j|�jdd��x*|�jj��D�]}|�j|d�|d�dd��qTW�d|�_�d�S�)NzSetting cgroups affinitiesT)r��r���r���)r���rh���r����r���r����r����r��r0���)r ���r����r���r���r����_cgroup_set_affinityy��s���� z$SchedulerPlugin._cgroup_set_affinityc�������������C���s6���t�jd��x&|�jj��D�]}|�j|d�|d���qW�d�S�)NzRestoring cgroups affinitiesr���r���)rh���r����r~���r0���r��)r ���r����r���r���r����_cgroup_restore_affinity���s���� z(SchedulerPlugin._cgroup_restore_affinityc����������#������sn���j�j|jd���_�jj�j�j|jd���dk�_�jj�j�j|jd���dk�_�j�j�j|jd����_ �jr|�j ����js��jr��j���tt ��j|���j���y�j��}W�n2�ttfk r��}�ztjd|���d�S�d�}~X�nX�dd��|jj��D��}�fd d�|D��}t|d d��d�}t��}i�|_x�|D�]�\�\}�����ytj���W�n<�tjk �r��}�ztjd t������w0W�Y�d�d�}~X�nX��fdd�|j��D��}t������fdd�|D���} |j| ��tjddt��������g|j�<��q0W�x4|j��D�](\} \}�������j| |�������q�W��j j!�j"�j#���j$�rj|j%�rjt&j'�j(|gd�|_)|j)j*���d�S�)Nr����r�����1r����r����zIerror applying tuning, cannot get information about running processes: %sc�������������S���s$���g�|�]\}}|t�|�jd�d�f�qS�)�:����)r����r����)r*���ro���r���r���r���r���rp������s����z:SchedulerPlugin._instance_apply_static.<locals>.<listcomp>c����������������s6���g�|�].\}}t�jd�|�rt|�dkr|��j|�f�qS�)zgroup\.����)�re�matchrk���r����)r*���ro���r����)r ���r���r���rp������s���c�������������S���s���|�d�d�S�)Nr���r���r���)Zoption_valsr���r���r����<lambda>���s����z8SchedulerPlugin._instance_apply_static.<locals>.<lambda>)�keyz(error compiling regular expression: '%s'c����������������s(���g�|�] \}}t�j��|�d�k r||f�qS�)N)r���search)r*���r9���r���)r%���r���r���rp������s����c���������� ������s$���g�|�]\}}||������ff�qS�r���r���)r*���r9���r���)r���ro���r ���r����r ���r���r���rp������s���z(?<!\\)\((?!\?)z(?:)�target�args)+rm���rn���r����r����r���rV����_cgroup_mount_point_init�_cgroup_groups_initrl���r����r����r����rQ���rN����_instance_apply_staticr ��r����r����r����rh���r����r����r0����sortedr.���� _sched_lookupr���compiler�����update�subr����ry����setr^���rz���rS���rx���r����ZThread�_thread_code�_thread�start)r ���r����r����r����Z sched_cfgZbufZ sched_allr����r����r=���r9���r���)rd���)r���ro���r ���r%���r����r ���r ���r���r�����s^���� z&SchedulerPlugin._instance_apply_staticc�������������C���s����y|�j���}W�n2�ttfk r>�}�ztjd|���d�S�d�}~X�nX�x�|�jj��D�]x\}}||ksL||�|jkrlqL|jd�k r�|j d�k r�|�j ||j|j ��|jd�k r�|�j||j��qL|j d�k rL|�j||j ��qLW�i�|�_|�jj|�j��d�S�)NzKerror unapplying tuning, cannot get information about running processes: %s)r����r����r����rh���r����rz���r0���r���r ���r ���r����r���r����r���r����ry���r}���r^���)r ���r����r����r9���Zorig_paramsr���r���r���r|������s&���� z$SchedulerPlugin._restore_ps_affinityc�������������C���s����t�tj�}d}xr|dkr�|dkr�|�jjd|�j|df�ddd�}|d krvx.|jd�D�] }|�jjd |�jdf�|dd ��qRW�|d8�}qW�|dkr�tj d|���d�S�)N� rO���r���z%s/%s/%sZtasksT)r��r����r����z%s/%s)r����r���z(Unable to cleanup tasks from cgroup '%s')rO���r"��) rT���rR���ZCGROUP_CLEANUP_TASKS_RETRYr���r����r����r����r����rh���r����)r ���r���Zcnt�datar����r���r���r����_cgroup_cleanup_tasks_one���s���� z)SchedulerPlugin._cgroup_cleanup_tasks_onec�������������C���s@���|�j�d�k r"|�j�|�jkr"|�j|�j���x|�jD�]}|�j|��q*W�d�S�)N)r����r����r$��)r ���r����r���r���r����_cgroup_cleanup_tasks���s����z%SchedulerPlugin._cgroup_cleanup_tasksc����������������sp���t�t|��j||��|�jr2|jr2|jj���|jj���|�j ���|�j ���|�j���|�jsV|�j r^|�j���|�j rl|�j���d�S�)N)rQ���rN����_instance_unapply_staticrS���rx���r����r��r ���joinr|���r ��r%��r��r��r����r��)r ���r����Z full_rollback)rd���r���r���r&�����s���� z(SchedulerPlugin._instance_unapply_staticc�������������C���s����t�jd|���d|�j|df�}|�jj|ddd�}|dkr<dS�|�jj|�jj|��}|�jj|�jj|��}d|�}||kr�t�jtj ||f���dS�t�j tj|||f���dS�d�S�) NzVerifying cgroup '%s' affinityz%s/%s/%szcpuset.cpusr��T)r��r����zcgroup '%s' affinityF)rh���r����r����r���r�����cpulist2stringZcpulist_packr{���rR����STR_VERIFY_PROFILE_VALUE_OKr�����STR_VERIFY_PROFILE_VALUE_FAIL)r ���r���r���r�����current_affinityZaffinity_descriptionr���r���r����_cgroup_verify_affinity_one���s ���� z+SchedulerPlugin._cgroup_verify_affinity_onec�������������C���sr���t�jd��d}|�jd�k rB|�jd�k rB|�j|�jkrB|o@|�j|�j|�j�}x*|�jj��D�]}|oh|�j|d�|d��}qNW�|S�)NzVeryfying cgroups affinitiesTr���r���)rh���r����r���r����r����r,��r0���)r ���r����r����r���r���r����_cgroup_verify_affinity ��s���� z'SchedulerPlugin._cgroup_verify_affinityc����������������s$���t�t|��j|||�}|�j��}|o"|S�)N)rQ���rN����_instance_verify_staticr-��)r ���r�����ignore_missingZdevicesZret1Zret2)rd���r���r���r.����s����z'SchedulerPlugin._instance_verify_staticc������� ������C���s����y|�j�|�}W�n^�ttfk rl�}�z>|jtjks<|jtjkrLtjd|���ntjd||f���d�S�d�}~X�nX�|�j j |j||�}|d�k r�||�jkr�tjd||t |�f���|\}}} |�j||||| ��|�jj|�j|�j��d�S�)Nz3Failed 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����rh���r����r����r���Z re_lookupr��rz���r����r����ry���r��r^���) r ���r����r9���r%���r���r�����vr=���r>���r���r���r���r����_add_pid��s$���� zSchedulerPlugin._add_pidc�������������C���s6���||�j�kr2|�j�|=�tjd|���|�jj|�j|�j���d�S�)Nz)removed PID %d from the rollback database)rz���rh���r����ry���r��r^���)r ���r����r9���r���r���r����_remove_pid0��s ���� zSchedulerPlugin._remove_pidc������� ������C���s����|�j�j|j�}tj��}|jj��}x|D�]}|j|��q&W�x�|jj ��s�t |j|�jd���dkr:|jj ���r:d}x�|r�d}xt|�jD�]j}|jj |�}|r~d}|jtjks�|�jr�|jtjkr�|�j|t|j�|��q~|jtjkr~|�j|t|j���q~W�qnW�q:W�d�S�)Ni���r���TF)r���Zre_lookup_compiler���select�pollr`���r�����registerr����Zis_setrk���rU���r]���Zread_on_cpurs���r\���ZRECORD_COMM�_perf_process_fork_valueZRECORD_FORKr1��rT����tidZRECORD_EXITr2��) r ���r����r%���r4��Zfdsr����Zread_eventsZcpuZeventr���r���r���r��7��s&���� $zSchedulerPlugin._thread_coder����)� per_devicec�������������C���s:���|rd�S�|r6|d�k r6dj�dd��tjdt|��D���|�_d�S�)N�|c�������������S���s���g�|�]}d�|��qS�)z(%s)r���)r*���r0��r���r���r���rp���V��s����z8SchedulerPlugin._cgroup_ps_blacklist.<locals>.<listcomp>z(?<!\\);)r'��r��r����r����r[���)r ����enablingr����verifyr/��r���r���r����_cgroup_ps_blacklistP��s����z$SchedulerPlugin._cgroup_ps_blacklistr����c�������������C���s:���|rd�S�|r6|d�k r6dj�dd��tjdt|��D���|�_d�S�)Nr9��c�������������S���s���g�|�]}d�|��qS�)z(%s)r���)r*���r0��r���r���r���rp���^��s����z1SchedulerPlugin._ps_whitelist.<locals>.<listcomp>z(?<!\\);)r'��r��r����r����rY���)r ���r:��r���r;��r/��r���r���r���rY���X��s����zSchedulerPlugin._ps_whitelistr����c�������������C���s:���|rd�S�|r6|d�k r6dj�dd��tjdt|��D���|�_d�S�)Nr9��c�������������S���s���g�|�]}d�|��qS�)z(%s)r���)r*���r0��r���r���r���rp���f��s����z1SchedulerPlugin._ps_blacklist.<locals>.<listcomp>z(?<!\\);)r'��r��r����r����rZ���)r ���r:��r���r;��r/��r���r���r���rZ���`��s����zSchedulerPlugin._ps_blacklistr����c�������������C���s6���|rd�S�|r2|d�k r2|dkr$||�_�n|�jj|�|�_�d�S�)Nr�����ignore)r����r=��)�_default_irq_smp_affinity_valuer����cpulist_unpack)r ���r:��r���r;��r/��r���r���r����_default_irq_smp_affinityh��s����z)SchedulerPlugin._default_irq_smp_affinityr����c�������������C���s*���|rd�S�|r&|d�k r&|�j�j|�dk|�_d�S�)Nr��)r���rV���r6��)r ���r:��r���r;��r/��r���r���r����_perf_process_forks��s����z"SchedulerPlugin._perf_process_forkc�������������C���s"���|�j�j|�}tjd||f���|S�)NzRead affinity '%s' of PID %d)ra���rA���rh���r����)r ���r9����resr���r���r���r������s����zSchedulerPlugin._get_affinityc�������������C���s����t�jd||f���y|�jj||��dS��ttfk r��}�zXt|d�r`|jtjkr`t�jd|���n.|�j |�}|dksz|d kr�t�j d|||f���dS�d�}~X�nX�d�S�) Nz'Setting CPU affinity of PID %d to '%s'.Tr����z4Failed to set affinity of PID %d, the task vanished.r���re���z,Failed to set affinity of PID %d to '%s': %sFr����)rh���r����ra���rC���r����r����r����r����r����r����r����)r ���r9���r���r����rB��r���r���r���r�������s���� zSchedulerPlugin._set_affinityc�������������C���s"���t�|�jt�|��}|rt|�S�|S�)N)r���intersectionr����)r ���Z affinity1Z affinity2Z affinity3Zaffr���r���r���r�������s����z'SchedulerPlugin._get_intersect_affinityc������� ���������s>����fdd�|D��}��j�dkr.��fdd�|D��}��jdkrJ��fdd�|D��}tdd��|D���}x�|D�]�}y��j||��}W�nb�ttfk r��}�zB|jtjks�|jtjkr�t j d|���nt jd||f���wbW�Y�d�d�}~X�nX���j||d d �} | s�qb|��j k�r |��j |�_|�rbd||�krb��j||�d�j��|d ��qbW�d�S�)Nc����������������s(���g�|�] }t�j��j��j|��d�k r|�qS�)N)r��r��rY����_get_stat_comm)r*���r0��)r ���r���r���rp������s���� z9SchedulerPlugin._set_all_obj_affinity.<locals>.<listcomp>rO���c����������������s(���g�|�] }t�j��j��j|��d�kr|�qS�)N)r��r��rZ���rD��)r*���r0��)r ���r���r���rp������s���� c����������������s(���g�|�] }t�j��j��j|��d�kr|�qS�)N)r��r��r[����_get_stat_cgroup)r*���r0��)r ���r���r���rp������s���� c�������������S���s���g�|�]}|j�|f�qS�r���)r9���)r*���r0��r���r���r���rp������s����z3Failed to get cmdline of PID %d, the task vanished.zARefusing to set affinity of PID %d, failed to get its cmdline: %sT)r����rw���)rZ���r[���r.���r����r����r����r����r����r����rh���r����r����r����rz���r����_set_all_obj_affinityr2���) r ���Zobjsr���rw���ZpslZpsdr9���r���r����r����r���)r ���r���rF�����s6���� z%SchedulerPlugin._set_all_obj_affinityc���������� ���C���s(���y|d�S��t�ttfk r"���dS�X�d�S�)NZcgroupsrO���)r����r����r����)r ���r&���r���r���r���rE�����s����z SchedulerPlugin._get_stat_cgroupc���������� ���C���s,���y|d�d�S��t�ttfk r&���dS�X�d�S�)Nr����ru���rO���)r����r����r����)r ���r&���r���r���r���rD�����s����zSchedulerPlugin._get_stat_commc�������������C���s`���y&t�j��}|j���|�j|j��|d��W�n4�ttfk rZ�}�ztjd|���W�Y�d�d�}~X�nX�d�S�)NFzIerror applying tuning, cannot get information about running processes: %s) r����r����r����rF��r2���r����r����rh���r����)r ���r���r����r����r���r���r����_set_ps_affinity���s����z SchedulerPlugin._set_ps_affinityc�������������C���s����yJ|�j�j|�}tjd||f���d|�}t|d��}|j|��W�d�Q�R�X�dS��ttfk r��}�zLt|d�r�|j t j kr�|�r�tjd|���d S�tjd|||f���dS�W�Y�d�d�}~X�nX�d�S�)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 supportedre���z0Failed to set SMP affinity of IRQ %s to '%s': %sr���r����r����)r����cpulist2hexrh���r����r�����writer����r����r����r����ZEIOr����)r ���rP���r���Z restoring�affinity_hex�filenamer#���r����r���r���r����_set_irq_affinity���s"����z!SchedulerPlugin._set_irq_affinityc�������������C���s|���y>|�j�j|�}tjd|���tdd��}|j|��W�d�Q�R�X�W�n8�ttfk rv�}�ztjd||f���W�Y�d�d�}~X�nX�d�S�)Nz(Setting default SMP IRQ affinity to '%s'z/proc/irq/default_smp_affinityrH��z2Failed to set default SMP IRQ affinity to '%s': %s) r���rI��rh���r����r����rJ��r����r����r����)r ���r���rK��r#���r����r���r���r����_set_default_irq_affinity���s����z)SchedulerPlugin._set_default_irq_affinityc������� ��� ���C���s"��t���}tj��}x�|j��D�]�}y"||�d�}tjd||f���W�n�tk rT���wY�nX�|�j|||�}t|�t|�krvq|�j ||d�}|dkr�||j |<�q|d kr|jj|��qW�|�j jd�}|�j j|�}|�jdkr�|�j|||�}n|�jdkr�|�j}|�jdk�r|�j|��||_|�jj|�j|��d�S�) Nr���zRead affinity of IRQ '%s': '%s'Fr���re���z/proc/irq/default_smp_affinityr����r=��r����)r���r����� interruptsr����rh���r����r����r����r��rM��r���r����appendr���r����r����r>��rN��r���ry���r_���) r ���r����irq_originalr���rP���r����r���rB��Zprev_affinity_hexr���r���r����_set_all_irq_affinity���s6���� z%SchedulerPlugin._set_all_irq_affinityc�������������C���sn���|�j�j|�jd��}|d�krd�S�x$|jj��D�]\}}|�j||d��q(W�|�jdkr\|j}|�j|��|�j�j |�j��d�S�)NTr=��) ry���r4���r_���r���r0���rM��r>��r���rN��r}���)r ���rQ��rP���r���r���r���r����_restore_all_irq_affinity��s���� z)SchedulerPlugin._restore_all_irq_affinityc�������������C���sF���t�|�jt�|��}|r,tjtj||f���ntjtj|||f���|S�)N)r���issubsetrh���r{���rR���r)��r����r*��)r ����irq_description�correct_affinityr+��rB��r���r���r����_verify_irq_affinity#��s���� z$SchedulerPlugin._verify_irq_affinityc�������������C���s����|�j�j|�jd��}tj��}d}x�|j��D�]�}||jkrR|rRd|�}tjt j |���q&y<||�d�}tjd||f���d|�} |�j| ||�s�d}W�q&�t k r����w&Y�q&X�q&W�|�jjd�} |�jj| �}|�jdkr�|�jd ||�jd kr�|n|�j��r�d}|S�)NTz-IRQ %s does not support changing SMP affinityr���z#Read SMP affinity of IRQ '%s': '%s'zSMP affinity of IRQ %sFz/proc/irq/default_smp_affinityr=��zdefault IRQ SMP affinityr����)ry���r4���r_���r����rO��r����r���rh���r{���rR���Z STR_VERIFY_PROFILE_VALUE_MISSINGr����rW��r����r���r����r����r>��)r ���rV��r/��rQ��r���rB��rP����descriptionr+��rU��Zcurrent_affinity_hexr���r���r����_verify_all_irq_affinity/��s8���� z(SchedulerPlugin._verify_all_irq_affinityr����� ���)r8��r ���c������� ������C���s����d�}d�|�_�|d�k rrt|�jj|��}t|�j�}|j|�rRt||��}|�jj|�|�_�n |�jj|�j�}tj d||f���|sz|r�|d�kr�d�S�|r�|�j ||�S�|r�|�jr�|�j���d|�j�} n|} |�j | ��|�j|��n|�j���d�S�)NzJInvalid isolated_cores specified, '%s' does not match available cores '%s'z cgroup.%s)r���r��r���r?��r]���rT��r����r(��rh���r����rY��r����r ��rG��rR��rS��) r ���r:��r���r;��r/��r����isolatedZpresentZstr_cpusZps_affinityr���r���r����_isolated_coresN��s.���� zSchedulerPlugin._isolated_coresc�������������C���s����d|||f�}|�j�j|�}|r"|S�d||f�}tjj|�sv|dkrPd||f�}nd|||f�}d|�}|�jd�krvd|�_||�j�|<�|S�)Nz%s_%s_%sz/proc/sys/kernel/%s_%srO���z%s/%sz%s/%s/%sz/sys/kernel/debug/%sT)rX���r4���r)���r�����existsrW���)r ����prefix� namespace�knobr��r����r���r���r����_get_sched_knob_pathn��s���� z$SchedulerPlugin._get_sched_knob_pathc�������������C���sJ���|�j�j|�j|||�d�d�}|d�krFtjd|���|�jrFtjd��d|�_|S�)N)r��zError reading '%s'zUThis may not work with Secure Boot or kernel_lockdown (this hint is logged only once)F)r���r����ra��rh���r����rW���)r ���r^��r_��r`��r#��r���r���r����_get_sched_knob��s���� zSchedulerPlugin._get_sched_knobc�������������C���s>���|d�krd�S�|s:|�j�j|�j|||�|�s:tjd||f���|S�)Nz Error writing value '%s' to '%s')r���r����ra��rh���r����)r ���r^��r_��r`��r����simr���r���r����_set_sched_knob���s����zSchedulerPlugin._set_sched_knobr����c�������������C���s���|�j�ddd�S�)NrO���r=����min_granularity_ns)rb��)r ���r���r���r����_get_sched_min_granularity_ns���s����z-SchedulerPlugin._get_sched_min_granularity_nsc�������������C���s���|�j�ddd||�S�)NrO���r=���re��)rd��)r ���r���rc��r���r���r����_set_sched_min_granularity_ns���s����z-SchedulerPlugin._set_sched_min_granularity_nsr����c�������������C���s���|�j�ddd�S�)NrO���r=���� latency_ns)rb��)r ���r���r���r����_get_sched_latency_ns���s����z%SchedulerPlugin._get_sched_latency_nsc�������������C���s���|�j�ddd||�S�)NrO���r=���rh��)rd��)r ���r���rc��r���r���r����_set_sched_latency_ns���s����z%SchedulerPlugin._set_sched_latency_nsr����c�������������C���s���|�j�ddd�S�)NrO���r=����wakeup_granularity_ns)rb��)r ���r���r���r���� _get_sched_wakeup_granularity_ns���s����z0SchedulerPlugin._get_sched_wakeup_granularity_nsc�������������C���s���|�j�ddd||�S�)NrO���r=���rk��)rd��)r ���r���rc��r���r���r���� _set_sched_wakeup_granularity_ns���s����z0SchedulerPlugin._set_sched_wakeup_granularity_nsr����c�������������C���s���|�j�ddd�S�)NrO���r=����tunable_scaling)rb��)r ���r���r���r����_get_sched_tunable_scaling���s����z*SchedulerPlugin._get_sched_tunable_scalingc�������������C���s���|�j�ddd||�S�)NrO���r=���rn��)rd��)r ���r���rc��r���r���r����_set_sched_tunable_scaling���s����z*SchedulerPlugin._set_sched_tunable_scalingr����c�������������C���s���|�j�ddd�S�)NrO���r=����migration_cost_ns)rb��)r ���r���r���r����_get_sched_migration_cost_ns���s����z,SchedulerPlugin._get_sched_migration_cost_nsc�������������C���s���|�j�ddd||�S�)NrO���r=���rq��)rd��)r ���r���rc��r���r���r����_set_sched_migration_cost_ns���s����z,SchedulerPlugin._set_sched_migration_cost_nsr����c�������������C���s���|�j�ddd�S�)NrO���r=���� nr_migrate)rb��)r ���r���r���r����_get_sched_nr_migrate���s����z%SchedulerPlugin._get_sched_nr_migratec�������������C���s���|�j�ddd||�S�)NrO���r=���rt��)rd��)r ���r���rc��r���r���r����_set_sched_nr_migrate���s����z%SchedulerPlugin._set_sched_nr_migrater����c�������������C���s���|�j�ddd�S�)Nr=����numa_balancing� scan_delay_ms)rb��)r ���r���r���r����!_get_numa_balancing_scan_delay_ms���s����z1SchedulerPlugin._get_numa_balancing_scan_delay_msc�������������C���s���|�j�ddd||�S�)Nr=���rw��rx��)rd��)r ���r���rc��r���r���r����!_set_numa_balancing_scan_delay_ms���s����z1SchedulerPlugin._set_numa_balancing_scan_delay_msr����c�������������C���s���|�j�ddd�S�)Nr=���rw���scan_period_min_ms)rb��)r ���r���r���r����&_get_numa_balancing_scan_period_min_ms���s����z6SchedulerPlugin._get_numa_balancing_scan_period_min_msc�������������C���s���|�j�ddd||�S�)Nr=���rw��r{��)rd��)r ���r���rc��r���r���r����&_set_numa_balancing_scan_period_min_ms���s����z6SchedulerPlugin._set_numa_balancing_scan_period_min_msr����c�������������C���s���|�j�ddd�S�)Nr=���rw���scan_period_max_ms)rb��)r ���r���r���r����&_get_numa_balancing_scan_period_max_ms���s����z6SchedulerPlugin._get_numa_balancing_scan_period_max_msc�������������C���s���|�j�ddd||�S�)Nr=���rw��r~��)rd��)r ���r���rc��r���r���r����&_set_numa_balancing_scan_period_max_ms���s����z6SchedulerPlugin._set_numa_balancing_scan_period_max_msr����c�������������C���s���|�j�ddd�S�)Nr=���rw���scan_size_mb)rb��)r ���r���r���r���� _get_numa_balancing_scan_size_mb���s����z0SchedulerPlugin._get_numa_balancing_scan_size_mbc�������������C���s���|�j�ddd||�S�)Nr=���rw��r���)rd��)r ���r���rc��r���r���r���� _set_numa_balancing_scan_size_mb���s����z0SchedulerPlugin._set_numa_balancing_scan_size_mb)F)F)F)F)F)_r���r���r���rK���r���ri���r����r�����classmethodr����rl���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 ��r��r|���r$��r%��r&��r,��r-��r.��r1��r2��r��Zcommand_customr<��rY���rZ���r@��rA��r����r����r����rF��rE��rD��rG��rM��rN��rR��rS��rW��rY��r\��ra��rb��rd��Zcommand_getrf��Zcommand_setrg��ri��rj��rl��rm��ro��rp��rr��rs��ru��rv��ry��rz��r|��r}��r��r���r���r���� __classcell__r���r���)rd���r���rN�������s������"> < " rN���) rO���r���Z decoratorsZ tuned.logsZtunedr��� subprocessr����r\���r3��Ztuned.constsrR���r����Ztuned.utils.commandsr���r����r)���r����rg���r���rb���rM���Zlogsr4���rh����objectr���r���r���rL���ZPluginrN���r���r���r���r����<module>���s0��� /