o
    _O                     @   sd   d dl mZ d dlm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jZdS )   )base)command_custom    )constsNc                       s   e Zd ZdZ f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eddddd Z  ZS )IrqbalancePluginz.
	Plugin for irqbalance settings management.
	c                    s$   t t| j|i | t | _d S N)superr   __init__perfcpu_map_cpus)selfargskwargs	__class__ A/usr/lib/python3/dist-packages/tuned/plugins/plugin_irqbalance.pyr	      s   zIrqbalancePlugin.__init__c                 C   s   d|_ d|_d S )NFT)_has_dynamic_tuning_has_static_tuningr   instancer   r   r   _instance_init   s   
zIrqbalancePlugin._instance_initc                 C   s   d S r   r   r   r   r   r   _instance_cleanup   s   z"IrqbalancePlugin._instance_cleanupc                 C   s   dd iS )Nbanned_cpusr   )clsr   r   r   _get_config_options   s   z$IrqbalancePlugin._get_config_optionsc              
   C   s   zt tjd}| W  d    W S 1 sw   Y  W d S  tyD } z|jtjkr2td nt	d|  W Y d }~d S d }~ww )Nrz>irqbalance sysconfig file is missing. Is irqbalance installed?z,Failed to read irqbalance sysconfig file: %s)
openr   IRQBALANCE_SYSCONFIG_FILEreadIOErrorerrnoENOENTlogwarnerror)r   fer   r   r   _read_irqbalance_sysconfig!   s   (z+IrqbalancePlugin._read_irqbalance_sysconfigc              
   C   sv   z t tjd}|| W d    W dS 1 sw   Y  W dS  ty: } ztd|  W Y d }~dS d }~ww )NwTz-Failed to write irqbalance sysconfig file: %sF)r   r   r   writer!   r$   r&   )r   contentr'   r(   r   r   r   _write_irqbalance_sysconfig,   s   
z,IrqbalancePlugin._write_irqbalance_sysconfigc                 C   s   |d|  S )NzIRQBALANCE_BANNED_CPUS=%s
r   )r   	sysconfigbanned_cpumaskr   r   r   _write_banned_cpus5   s   z#IrqbalancePlugin._write_banned_cpusc                 C   s4   g }| dD ]}td|s|| qd|S )N
z\s*IRQBALANCE_BANNED_CPUS=)splitrematchappendjoin)r   r.   linesliner   r   r   _clear_banned_cpus8   s   

z#IrqbalancePlugin._clear_banned_cpusc                 C   s4   | j jg ddgd\}}|dkrtd d S d S )N)	systemctlztry-restart
irqbalance   )	no_errorsr   z.Failed to restart irqbalance. Is it installed?)_cmdexecuter$   r%   )r   retcodeoutr   r   r   _restart_irqbalance?   s   
z$IrqbalancePlugin._restart_irqbalancec                 C   sD   |   }|d u r
d S | |}| ||}| |r |   d S d S r   )r)   r9   r0   r-   rB   )r   r/   r,   r   r   r   _set_banned_cpusH   s   

z!IrqbalancePlugin._set_banned_cpusc                 C   s8   |   }|d u r
d S | |}| |r|   d S d S r   )r)   r9   r-   rB   )r   r,   r   r   r   _restore_banned_cpusQ   s   

z%IrqbalancePlugin._restore_banned_cpusr   F)
per_devicec           	      C   s   d }|d ur5t | j|}t | j}||r!| jt|}nddd | jD }t	d||f  |s9|r?|d u r?d S |rCd S |rL| 
| d S |   d S )N,c                 S   s   g | ]}t |qS r   )str).0xr   r   r   
<listcomp>b   s    z1IrqbalancePlugin._banned_cpus.<locals>.<listcomp>zGInvalid banned_cpus specified, '%s' does not match available cores '%s')setr>   cpulist_unpackr   issubsetcpulist2hexlistr6   r$   r&   rC   rD   )	r   enablingvalueverifyignore_missingr/   bannedpresentstr_cpusr   r   r   _banned_cpusY   s"   

zIrqbalancePlugin._banned_cpus)__name__
__module____qualname____doc__r	   r   r   classmethodr   r)   r-   r0   r9   rB   rC   rD   r   rW   __classcell__r   r   r   r   r      s     
			
r   ) r   
decoratorsr   tunedr   
tuned.logsr"   r
   r3   logsgetr$   Pluginr   r   r   r   r   <module>   s    
