Systemd and Custom Early Init Script

Gordan Bobic gordan at bobich.net
Tue Feb 5 22:49:33 UTC 2013


On 02/05/2013 10:06 PM, Marko Vojinovic wrote:
> On Tue, 05 Feb 2013 19:32:34 +0000
> Gordan Bobic<gordan at bobich.net>  wrote:
>
>> I'm a not quite up to speed on systemd, so I'm hoping somebody here
>> might point me in the right direction WRT the Fedora systemd init
>> process flow.
>>
>> I'm trying to work around bug 529153:
>> https://bugzilla.redhat.com/show_bug.cgi?id=529153
>>
>> The closest to a workable solution I have come up with is:
>>
>> echo -n 0000:00:1c.0:pcie04
>>> /sys/bus/pci_express/drivers/pciehp/unbind
>>
>> So I need this to run as early as possible during the init sequence,
>> as soon as /sys is mounted.
>>
>> Before/after which services should this be done?
>
> Systemd does not execute sequentially, but in parallel, so there is no
> concept of before and after.
>
> What you want is to write a custom systemd unit file which requires that
> local-fs.target has already completed (that makes sure that the
> filesystem is already mounted) and then executes your command. Then
> systemd will make sure that your script gets executed at the first
> possible opportunity after the filesystem mount.
>
> So, you can either learn how to write a custom systemd unit file, or
> someone experienced in this should step in to help you. My
> understanding of systemd is still only descriptive at best.

Yes, I got that part mostly figured out:

My custom service is:

======
[Unit]
Description=pciehp disable
DefaultDependencies=no
After=local-fs.target

[Service]
Type=oneshot
ExecStart=echo -n 0000:00:1c.0:pcie04 > 
/sys/bus/pci_express/drivers/pciehp/unbind
======

Unfortunately, this isn't too useful on it's own because the machine is 
still stuck in the pciehp loop that makes it take hours to actually boot 
up, iterating over and over with:


pciehp 0000:00.1c.0:pcie04 Card present on Slot(0)
pciehp 0000:00.1c.0:pcie04 Card not present on Slot(0)

I got the device ID:
# lspci -n | grep 1c.0
00:1c.0 0604: 8086:3a40

And tried adding to the kernel parameters:
pci_stub="8086:3a40"

but that made no difference.

If I can get the machine to boot, doing:

echo -n 0000:00:1c.0:pcie04 > /sys/bus/pci_express/drivers

fixes the problem, but the only way I've been able to make it boot is by 
specifying "noapic noacpi nosmp quiet" as kernel boot parameters, and 
that is a bit wasteful on a 12-core 24-thread machine.

Extensive googling hasn't revealed any obvious way to disable pciehp 
when it is built into the kernel as it is in Fedora kernels or 
explicitly tell it to unbind (or preferably not bind in the first place) 
to a specific device.

If anyone has any ideas on this, I would very much like to hear about 
them. As it stands every Fedora and RHEL release since F11 is completely 
unusable on my machine, which seems like a pretty excessively 
long-standing bug.

Gordan


More information about the users mailing list