summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavide Cavalca <dcavalca@fb.com>2020-02-26 10:23:49 -0800
committerDavide Cavalca <dcavalca@fb.com>2020-03-11 14:38:55 -0700
commit56b8a7abf1e44215a8a3ab4cba1e548dce551da7 (patch)
tree8b53dc80f19ca0154d1af8d27bd2d8f4828cc014
parent33be2b2b6cff60731067c1e95ae440c0b3c49ae5 (diff)
downloadohai-56b8a7abf1e44215a8a3ab4cba1e548dce551da7.tar.gz
irq: factor smp_affinity parsing to its own function
Signed-off-by: Davide Cavalca <dcavalca@fb.com>
-rw-r--r--lib/ohai/plugins/linux/irq.rb41
1 files changed, 23 insertions, 18 deletions
diff --git a/lib/ohai/plugins/linux/irq.rb b/lib/ohai/plugins/linux/irq.rb
index ad9db3cb..480ce143 100644
--- a/lib/ohai/plugins/linux/irq.rb
+++ b/lib/ohai/plugins/linux/irq.rb
@@ -20,6 +20,27 @@ Ohai.plugin(:Irq) do
depends "cpu"
provides "irq"
+ # Documentation: https://www.kernel.org/doc/Documentation/IRQ-affinity.txt
+ # format: comma-separate list of 32bit bitmask in hex
+ # each bit is a CPU, right to left ordering (i.e. CPU0 is rightmost)
+ def parse_smp_affinity(path, cpus)
+ masks = File.read(path).strip
+ bit_masks = []
+ masks.split(",").each do |mask|
+ if mask.length != 8
+ mask = "0" * (8 - mask.length) + mask
+ end
+ bit_masks << mask.to_i(16).to_s(2)
+ end
+ affinity_mask = bit_masks.join()
+ affinity_by_cpu = affinity_mask.split('').reverse()
+ smp_affinity_by_cpu = Mash.new
+ (0..cpus-1).each do |cpu|
+ smp_affinity_by_cpu[cpu] = affinity_by_cpu[cpu].to_i == 1 ? true : false
+ end
+ smp_affinity_by_cpu
+ end
+
collect_data(:linux) do
irq Mash.new
@@ -49,25 +70,9 @@ Ohai.plugin(:Irq) do
# Only regular IRQs have extra fields and affinity settings
if /\d+/.match(irqn)
irq[irqn][:type], irq[irqn][:vector], irq[irqn][:device] = fields[cpus].split
-
- # Documentation: https://www.kernel.org/doc/Documentation/IRQ-affinity.txt
- # format: comma-separate list of 32bit bitmask in hex
- # each bit is a CPU, right to left ordering (i.e. CPU0 is rightmost)
if File.exists?("/proc/irq/#{irqn}/smp_affinity")
- masks = File.read("/proc/irq/#{irqn}/smp_affinity").strip
- bit_masks = []
- masks.split(",").each do |mask|
- if mask.length != 8
- mask = "0" * (8 - mask.length) + mask
- end
- bit_masks << mask.to_i(16).to_s(2)
- end
- affinitize_mask = bit_masks.join()
- affinitize_by_cpu = affinitize_mask.split('').reverse()
- irq[irqn][:affinitize_by_cpu] = Mash.new
- (0..cpus-1).each do |cpu|
- irq[irqn][:affinitize_by_cpu][cpu] = affinitize_by_cpu[cpu].to_i == 1 ? true : false
- end
+ irq[irqn][:smp_affinity_by_cpu] =
+ parse_smp_affinity("/proc/irq/#{irqn}/smp_affinity", cpus)
end
# ERR and MIS do not have any extra fields
elsif fields[cpus]