On Wed, Jan 06, 2021 at 12:53:45PM +0100, Mark Kettenis wrote:
> > Date: Wed, 6 Jan 2021 21:29:52 +1000
> > From: Jonathan Matthew <[email protected]>
> > 
> > On Wed, Jan 06, 2021 at 10:52:48AM +0100, Mark Kettenis wrote:
> > > > Date: Wed, 6 Jan 2021 20:29:09 +1100
> > > > From: Jonathan Gray <[email protected]>
> > > > 
> > > > On Tue, Jan 05, 2021 at 10:28:20PM -1000, [email protected] wrote:
> > > > > I tested with a Protectli FW1 router (dmesg below) forwarding packets
> > > > > between two test machines. The latency spikes occur when running 
> > > > > headless
> > > > > beginning with this commit:
> > > > 
> > > > As the interrupt is handled via msi it wouldn't be a shared interrupt
> > > > related problem.
> > > > 
> > > > Perhaps some drm kernel thread, but I can't think of anything that would
> > > > be doing work with no display connected.
> > > 
> > > Could be the kernel periodically polling whether a monitor is
> > > attached.  Some generations of the Intel graphics hardware have broken
> > > hardware hotplug detection.  And some rely on polling i2c code to
> > > detect a VGA monitor.
> > > 
> > > Don't know this hardware.  If it has a VGA port that's left
> > > unconnected it might help to actually connect it.  Maybe one of those
> > > dongles that fake a VGA monitor would do.
> > > 
> > > Disabling inteldrm(4) would also help.
> > 
> > On my home router, which is a similar kind of machine, various drm work 
> > queue
> > threads use a fair bit of cpu time.  I normally have inteldrm disabled just
> > for that - I hadn't noticed it causing latency problems, it just seemed 
> > wrong
> > that my router spent more cpu time on drm stuff than on forwarding packets.
> > 
> > inteldrm0 at pci0 dev 2 function 0 "Intel HD Graphics" rev 0x35
> > drm0 at inteldrm0
> > inteldrm0: msi, CHERRYVIEW, gen 8
> > inteldrm0: 1024x768, 32bpp
> > 
> > It has one displayport and two hdmi, no vga, so hopefully analog hotplug
> > isn't involved.
> 
> HDMI may be in the same boat.  And I think there are cases where the
> VBIOS still advertises an (unconnected) VGA port even if there is no
> physical output.
> 
> > $ vmstat -zi 
> > interrupt                       total     rate
> > irq0/clock                     241657      396
> > irq0/ipi                        17830       29
> > irq96/acpi0                         0        0
> > irq144/inteldrm0                  469        0
> > irq97/ahci0                     50442       82
> > irq98/xhci0                        25        0
> > irq176/azalia0                      1        0
> > irq99/ppb0                          0        0
> > irq114/re0                      12914       21
> > irq100/ppb1                         0        0
> > irq115/re1                      13261       21
> > irq101/ppb2                         0        0
> > irq116/athn0                        0        0
> > irq102/ichiic0                      0        0
> > irq145/com0                       118        0
> > irq146/pckbc0                       0        0
> > irq147/pckbc0                       0        0
> > Total                          336717      551
> > 
> > This is what the drm workqueue threads have done in 15 minutes uptime:
> > 
> > root     85080  0.0  0.0     0     0 ??  DK      9:06PM    0:00.00 (drmlwq)
> > root     65272  0.0  0.0     0     0 ??  DK      9:06PM    0:00.00 (drmtskl)
> > root     39235  0.0  0.0     0     0 ??  DK      9:06PM    0:00.00 (drmlwq)
> > root     65215  0.0  0.0     0     0 ??  DK      9:06PM    0:01.00 (drmlwq)
> > root     62266  0.0  0.0     0     0 ??  DK      9:06PM    0:00.00 (drmlwq)
> > root     20339  0.0  0.0     0     0 ??  DK      9:06PM    0:00.00 (drmubwq)
> > root     62920  0.0  0.0     0     0 ??  DK      9:06PM    0:00.00 (drmubwq)
> > root     58454  0.0  0.0     0     0 ??  DK      9:06PM    0:01.00 (drmubwq)
> > root     75983  0.0  0.0     0     0 ??  DK      9:06PM    0:00.00 (drmubwq)
> > root     31352  0.0  0.0     0     0 ??  DK      9:06PM    0:00.01 (drmhpwq)
> > root     23634  0.0  0.0     0     0 ??  DK      9:06PM    0:00.00 (drmhpwq)
> > root     95926  0.0  0.0     0     0 ??  DK      9:06PM    0:00.00 (drmhpwq)
> > root     38038  0.0  0.0     0     0 ??  DK      9:06PM    0:07.10 (drmwq)
> > root     10622  0.0  0.0     0     0 ??  DK      9:06PM    0:06.50 (drmwq)
> > root     68591  0.0  0.0     0     0 ??  DK      9:06PM    0:01.00 (drmhpwq)
> > root     97843  0.0  0.0     0     0 ??  DK      9:06PM    0:11.41 (drmwq)
> > root     36773  0.5  0.0     0     0 ??  DK      9:06PM    0:10.98 (drmwq)
> > 
> > I can work on gathering some profiling data with dt etc. if that would help.
> 
> Yes, that may be helpful.
> 
> If you're not running X, there really shouldn't be much activity.
> Really just the software hotplug detection and maybe some power
> management.  But the monitor detection code uses delay(9) in some of
> its code paths, so that may result in more accumulated CPU cycles than
> one would naively expect.

With no X running and not much else happening on the system, running 
btrace -e 'profile:hz:97 { printf("%s\n", kstack) }', virtually all the
traces that aren't in acpicpu_idle look like this:

tsc_delay+0x68
gmbus_wait+0x3c4
gmbus_xfer_read+0x170
do_gmbus_xfer+0x2ae
gmbus_xfer+0x7b
i2c_transfer+0x5a
drm_do_probe_ddc_edid+0x24d
drm_get_edid+0x4d
intel_hdmi_set_edid+0x69
intel_hdmi_detect+0xb1
drm_helper_probe_detect+0xed
output_poll_execute+0x14b
taskq_thread+0x81
proc_trampoline+0x1c

which looks like hdmi detection as you guessed.

Reply via email to