ó
æ”\c           @   s­   d  d l  m Z d  d l Td d l Z d d l m Z d d l j Z d d l	 Z	 d d l
 Z
 d d l Z d d l Z d d l Z e j j ƒ  Z d e j f d „  ƒ  YZ d S(   i   (   t   base(   t   *iÿÿÿÿN(   t   commandst   CPULatencyPluginc           B   s¬  e  Z d  Z d „  Z d „  Z d „  Z e d „  ƒ Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z e d d e ƒd „  ƒ Z e d ƒ e d „ ƒ Z d d „ Z  e d d e d d ƒd  „  ƒ Z! e d ƒ e d! „ ƒ Z" d" „  Z# e d# d e ƒd$ „  ƒ Z$ d% „  Z% d& „  Z& d' „  Z' e d# ƒ e d( „ ƒ Z( RS()   sP   
	Plugin for tuning CPU options. Powersaving, governor, required latency, etc.
	c         O   sŒ   t  t |  ƒ j | | Ž  t |  _ d |  _ t |  _ t |  _ t |  _	 t |  _
 t |  _ d  |  _ d  |  _ d  |  _ i  |  _ t ƒ  |  _ d  S(   Nt   x86_64(   t   superR   t   __init__t   Truet   _has_pm_qost   _archt   Falset   _is_x86t	   _is_intelt   _is_amdt   _has_energy_perf_biast   _has_intel_pstatet   Nonet   _min_perf_pct_savet   _max_perf_pct_savet   _no_turbo_savet   _governors_mapR   t   _cmd(   t   selft   argst   kwargs(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyR      s    											c         C   sU   t  |  _ t ƒ  |  _ x- |  j j d ƒ D] } |  j j | j ƒ q( Wt ƒ  |  _ d  S(   Nt   cpu(	   R   t   _devices_supportedt   sett   _free_devicest   _hardware_inventoryt   get_devicest   addt   sys_namet   _assigned_devices(   R   t   device(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _init_devices(   s
    	c         C   s&   g  | D] } |  j  j d | ƒ ^ q S(   NR   (   R   t
   get_device(   R   t   devicest   x(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _get_device_objects1   s    c         C   sJ   i
 d d 6d d 6d d 6d  d 6d  d 6d  d	 6d  d
 6d  d 6d  d 6d  d 6S(   Ngš™™™™™É?t   load_thresholdid   t   latency_lowiè  t   latency_hight   force_latencyt   governort   sampling_down_factort   energy_perf_biast   min_perf_pctt   max_perf_pctt   no_turbo(   R   (   R   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _get_config_options4   s    c         C   sè   d d d d d g } t  j ƒ  |  _ |  j | k rª t j ƒ  } | j j d ƒ } | d k ri t |  _ n- | d k s | d	 k r t |  _	 n	 t |  _ t
 j d
 | ƒ n t
 j d |  j ƒ |  j t k rä |  j ƒ  |  j ƒ  n  d  S(   NR   t   i686t   i585t   i486t   i386t	   vendor_idt   GenuineIntelt   AuthenticAMDt   HygonGenuines$   We are running on an x86 %s platforms   We are running on %s (non x86)(   t   platformt   machineR	   t   procfst   cpuinfot   tagst   getR   R   R   t   logt   infot   _check_energy_perf_biast   _check_intel_pstate(   R   t   intel_archsR   t   vendor(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _check_archC   s    	
c         C   s   t  |  _ d } |  j j d d g d t j | g ƒd } | d k rR t |  _ n) | d k  rn t j d ƒ n t j d ƒ d  S(   Ni   t   x86_energy_perf_policys   -rt	   no_errorsi    sg   unable to run x86_energy_perf_policy tool, ignoring CPU energy performance bias, is the tool installed?sX   your CPU doesn't support MSR_IA32_ENERGY_PERF_BIAS, ignoring CPU energy performance bias(	   R
   R   R   t   executet   errnot   ENOENTR   RA   t   warning(   R   t   retcode_unsupportedt   retcode(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRC   ^   s    	+c         C   s2   t  j j d ƒ |  _ |  j r. t j d ƒ n  d  S(   Ns$   /sys/devices/system/cpu/intel_pstates   intel_pstate detected(   t   ost   patht   existsR   RA   RB   (   R   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRD   i   s    	c         C   s.   t  | ƒ } |  j j t  | ƒ j d d ƒ ƒ S(   NR   t    (   t   strR   t   is_cpu_onlinet   replace(   R   R"   t   sd(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _is_cpu_onlinen   s    c         C   s   t  j j d | ƒ S(   Ns3   /sys/devices/system/cpu/%s/cpufreq/scaling_governor(   RP   RQ   RR   (   R   R"   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _cpu_has_scaling_governorr   s    c         C   sL   |  j  | ƒ s$ t j d | ƒ t S|  j | ƒ sH t j d | ƒ t St S(   Ns   '%s' is not online, skippings.   there is no scaling governor fo '%s', skipping(   RX   RA   t   debugR
   RY   R   (   R   R"   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _check_cpu_can_change_governoru   s    c         C   s  t  | _ t | _ t |  j j ƒ  ƒ d | k rà t  | _ y t j	 t
 j t j ƒ |  _ Wn. t k
 r‰ t j d t
 j ƒ t |  _ n Xd  |  _ | j d d  k rÊ |  j j d d  ƒ | _ t  | _ n	 d  | _ |  j ƒ  n t | _ t j d | j ƒ t | j ƒ d | _ d  S(   Ni    s-   Unable to open '%s', disabling PM_QoS controlR+   t   loadsI   Latency settings from non-first CPU plugin instance '%s' will be ignored.(   R   t   _has_static_tuningR
   t   _has_dynamic_tuningt   listt
   _instancest   valuest   _first_instanceRP   t   opent   constst   PATH_CPU_DMA_LATENCYt   O_WRONLYt   _cpu_latency_fdt   OSErrorRA   t   errorR   R   t   _latencyt   optionst   _monitors_repositoryt   createt   _load_monitorRG   RB   t   namet   assigned_devicest   _first_device(   R   t   instance(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _instance_init~   s$    						c         C   sQ   | j  rM |  j r% t j |  j ƒ n  | j d  k	 rM |  j j | j ƒ qM n  d  S(   N(	   Rb   R   RP   t   closeRg   Rn   R   Rl   t   delete(   R   Rr   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _instance_cleanup™   s
    		c         C   s   |  j  j d | d  ƒ j ƒ  S(   Ns'   /sys/devices/system/cpu/intel_pstate/%s(   R   t	   read_fileR   t   strip(   R   t   attr(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _get_intel_pstate_attr    s    c         C   s*   | d  k	 r& |  j j d | | ƒ n  d  S(   Ns'   /sys/devices/system/cpu/intel_pstate/%s(   R   R   t   write_to_file(   R   Ry   t   val(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _set_intel_pstate_attr£   s    c         C   s3   | d  k r d  S|  j | ƒ } |  j | | ƒ | S(   N(   R   Rz   R}   (   R   Ry   t   valuet   v(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _getset_intel_pstate_attr§   s
    c         C   s°   t  t |  ƒ j | ƒ | j s# d  S| j d } | d  k	 rL |  j | ƒ n  |  j r¬ |  j d | j d ƒ |  _	 |  j d | j d ƒ |  _
 |  j d | j d ƒ |  _ n  d  S(   NR+   R/   R0   R1   (   R   R   t   _instance_apply_staticRb   Rk   R   t   _set_latencyR   R€   R   R   R   (   R   Rr   t   force_latency_value(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyR   ®   s    		c         C   sk   t  t |  ƒ j | | ƒ | j rg |  j rg |  j d |  j ƒ |  j d |  j ƒ |  j d |  j ƒ n  d  S(   NR/   R0   R1   (	   R   R   t   _instance_unapply_staticRb   R   R}   R   R   R   (   R   Rr   t   full_rollback(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyR„   ¼   s
    c         C   s   |  j  | | ƒ d  S(   N(   t   _instance_update_dynamic(   R   Rr   R"   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _instance_apply_dynamicÄ   s    c         C   sh   | | j  k r d  S| j j ƒ  d } | | j d k  rP |  j | j d ƒ n |  j | j d ƒ d  S(   Nt   systemR(   R*   R)   (   Rq   Rn   t   get_loadRk   R‚   (   R   Rr   R"   R\   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyR†   Ç   s    c         C   s   d  S(   N(    (   R   Rr   R"   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _instance_unapply_dynamicÒ   s    c         C   sj   t  | ƒ } |  j rf |  j | k rf t j d | ƒ t j d | ƒ } t j |  j	 | ƒ | |  _ n  d  S(   Ns   setting new cpu latency %dt   i(
   t   intR   Rj   RA   RB   t   structt   packRP   t   writeRg   (   R   t   latencyt   latency_bin(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyR‚   Õ   s    c         C   s    |  j  j d | ƒ j ƒ  j ƒ  S(   Ns>   /sys/devices/system/cpu/%s/cpufreq/scaling_available_governors(   R   Rw   Rx   t   split(   R   R"   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _get_available_governorsÝ   s    R,   t
   per_devicec         C   s,  |  j  | ƒ s d  St | ƒ } | j d ƒ } g  | D] } | j ƒ  ^ q5 } x1 | D]) } t | ƒ d k rT t j d ƒ d  SqT W|  j | ƒ } x• | D]m } | | k rä | sà t j	 d | | f ƒ |  j
 j d | | ƒ n  Pq— | s— t j d | | f ƒ q— q— Wt j d d j | ƒ ƒ d  } | S(	   Nt   |i    s.   The 'governor' option contains an empty value.s!   setting governor '%s' on cpu '%s's3   /sys/devices/system/cpu/%s/cpufreq/scaling_governors7   Ignoring governor '%s' on cpu '%s', it is not supporteds.   None of the scaling governors is supported: %ss   , (   R[   R   RT   R’   Rx   t   lenRA   Ri   R“   RB   R   R{   RZ   t   warnt   join(   R   t	   governorsR"   t   simR,   t   available_governors(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _set_governorà   s2    			c         C   sz   d  } |  j | ƒ s d  S|  j j d | d | ƒj ƒ  } t | ƒ d k rV | } n  | d  k rv t j d | ƒ n  | S(   Ns3   /sys/devices/system/cpu/%s/cpufreq/scaling_governort   no_errori    s*   could not get current governor on cpu '%s'(   R   R[   R   Rw   Rx   R–   RA   Ri   (   R   R"   t   ignore_missingR,   t   data(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _get_governorý   s    "	t   ondemandc         C   s   d | S(   Ns7   /sys/devices/system/cpu/cpufreq/%s/sampling_down_factor(    (   R   R,   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _sampling_down_factor_path  s    R-   t   priorityi
   c         C   s  d  } | |  j k r% |  j j ƒ  n  d  |  j | <|  j | ƒ } | d  k rb t j d | ƒ d  S| t |  j j ƒ  ƒ k r| |  j | <|  j | ƒ } t	 j
 j | ƒ sÆ t j d | | f ƒ d  St | ƒ } | st j d | | f ƒ |  j j | | ƒ qn  | S(   NsI   ignoring sampling_down_factor setting for CPU '%s', cannot match governorsT   ignoring sampling_down_factor setting for CPU '%s', governor '%s' doesn't support its6   setting sampling_down_factor to '%s' for governor '%s'(   R   R   t   clearR    RA   RZ   R_   Ra   R¢   RP   RQ   RR   RT   RB   R   R{   (   R   R-   R"   Rš   R|   R,   RQ   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _set_sampling_down_factor  s&    c         C   s`   |  j  | d | ƒ} | d  k r% d  S|  j | ƒ } t j j | ƒ sJ d  S|  j j | ƒ j ƒ  S(   NRž   (	   R    R   R¢   RP   RQ   RR   R   Rw   Rx   (   R   R"   Rž   R,   RQ   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _get_sampling_down_factor)  s    c         C   s=   |  j  j d d | t | ƒ g d t ƒ\ } } } | | f S(   NRH   s   -ct
   return_err(   R   RJ   RT   R   (   R   t   cpu_idR~   RO   t   outt   err_msg(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _try_set_energy_perf_bias3  s    	R.   c   	      C   s"  |  j  | ƒ s$ t j d | ƒ d  S|  j r| s| j d ƒ } | j d ƒ } x¼ | D]  } | j ƒ  } t j d | | f ƒ |  j | | ƒ \ } } | d k rÀ t j	 d | | f ƒ PqX | d k  rá t j
 d | ƒ PqX t j d | | f ƒ qX Wt j
 d	 | ƒ n  t | ƒ Sd  Sd  S(
   Ns   %s is not online, skippingR   R•   s2   Trying to set energy_perf_bias to '%s' on cpu '%s'i    s5   energy_perf_bias successfully set to '%s' on cpu '%s's"   Failed to set energy_perf_bias: %ssH   Could not set energy_perf_bias to '%s' on cpu '%s', trying another valuesP   Failed to set energy_perf_bias on cpu '%s'. Is the value in the profile correct?(   RX   RA   RZ   R   R   t   lstripR’   Rx   R«   RB   Ri   RT   (	   R   R.   R"   Rš   R¨   t   valsR|   RO   Rª   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _set_energy_perf_bias<  s6    						
c         C   sY   y t  | ƒ } WnB t k
 rT } y t  | d ƒ } WqU t k
 rP } | } qU Xn X| S(   Ni   (   RŒ   t
   ValueError(   R   t   sR   t   e(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _try_parse_num]  s    c         C   s.   i d d 6d d 6d d 6j  |  j | ƒ | ƒ S(   Nt   performancei    t   normali   t	   powersavei   (   R@   R²   (   R   R°   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _energy_perf_policy_to_humanh  s    c         C   s<   i d d 6d d 6d d 6d d 6d	 d
 6j  |  j | ƒ | ƒ S(   NR³   i    s   balance-performancei   R´   i   s   balance-poweri   t   poweri   (   R@   R²   (   R   R°   (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _energy_perf_policy_to_human_v2l  s    

c   	      C   sñ   d  } |  j | ƒ s* t j d | ƒ d  S|  j rí | j d ƒ } |  j j d d | d g ƒ \ } } | d k rí xu | j ƒ  D]d } | j	 ƒ  } t
 | ƒ d k rº |  j | d ƒ } Pq t
 | ƒ d	 k r |  j | d ƒ } Pq q Wqí n  | S(
   Ns   %s is not online, skippingR   RH   s   -cs   -ri    i   i   i   (   R   RX   RA   RZ   R   R¬   R   RJ   t
   splitlinesR’   R–   R¶   R¸   (	   R   R"   Rž   R.   R¨   RO   t   linest   linet   l(    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   _get_energy_perf_biast  s"    	$()   t   __name__t
   __module__t   __doc__R   R#   R'   t   classmethodR2   RG   RC   RD   RX   RY   R[   Rs   Rv   Rz   R}   R€   R   R
   R„   R‡   R†   RŠ   R‚   R“   t   command_setR   Rœ   t   command_getR    R¢   R¥   R¦   R«   R®   R²   R¶   R¸   R½   (    (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyR      sJ   																							!				!				(   RS   R    t
   decoratorst
   tuned.logst   tunedt   tuned.utils.commandsR   t   tuned.constsRd   RP   R   RK   R;   R=   t   logsR@   RA   t   PluginR   (    (    (    s<   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt   <module>   s   
