udev/net_id: Only read the first 64 bytes of PCI config space
authorJason S. McMullan <jason.mcmullan@gmail.com>
Fri, 22 May 2015 18:30:01 +0000 (20:30 +0200)
committerTom Gundersen <teg@jklm.no>
Fri, 22 May 2015 18:50:01 +0000 (20:50 +0200)
commit0454229c100a2113ba82df55703436d6cb2c492b
treed4b5f4d7a3cc9bc524835bbb161899675a59df9a
parent882897afeeb0eabb3eae04a6e54beff8cb206514
udev/net_id: Only read the first 64 bytes of PCI config space

The original code used fread(), which on some libc implementions
(ie glibc 2.17) would pre-read a full 4K (PAGE_SIZE) of the
PCI config space, when only 64 bytes were requested.

I have recently come across PCIe hardware which responds with
Completion Timeouts when accesses above 256 bytes are attempted.

This can cause server systems with GHES/AEPI support to cause
and immediate kernel panic due to the failed PCI transaction.

This change replaces the buffered fread() with an explict
unbuffered read() of 64 bytes, which corrects this issue by
only reading the guaranteed first 64 bytes of PCIe config space.
src/udev/udev-builtin-net_id.c