Bug 1210449

Summary: weak-modules uses dd extremely inefficiently
Product: Red Hat Enterprise Linux 7 Reporter: Gordan Bobic <gordan>
Component: kmodAssignee: David Shea <dshea>
Status: CLOSED ERRATA QA Contact: Shaohui Deng <shdeng>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 7.1CC: ccui, lilu
Target Milestone: rc   
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: kmod-20-5 Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2015-11-19 03:31:31 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Attachments:
Description Flags
weak-modules dd ibs/skip modification
none
use skipcpio to strip early_cpio none

Description Gordan Bobic 2015-04-09 18:47:53 UTC
Created attachment 1012781 [details]
weak-modules dd ibs/skip modification

Description of problem:
The /sbin/weak-modules script invokes dd to work on the initramfs image as follows:
dd if="$input" of="${tmpdir}/post_early_cpio.img" ibs=1 skip="$(cpio_len "$input")" 2>/dev/null

This is extremely inefficient because it iterates byte by byte through the whole initramfs image to skip the first $(cpio_len $input) bytes. This takes minutes even on a high end x86-64 machine.

What would be far more sensible is to do the following:
dd if="$input" of="${tmpdir}/post_early_cpio.img" skip=1 ibs="$(cpio_len "$input")" 2>/dev/null

which works in blocks of size $(cpio_len $input) and skips the first one. Working on blocks 10s of 1000s of times bigger, this takes a fraction of a second.

Version-Release number of selected component (if applicable):
kmod-14-10.el7.x86_64

Attached is a patch to fix this.

Comment 2 David Shea 2015-05-14 15:15:03 UTC
Created attachment 1025465 [details]
use skipcpio to strip early_cpio

Thanks for the patch. Actually, what I could do instead is use dracut's skipcpio (in /usr/lib/dracut) to strip off the early cpio image and then just remove that implementation of cpio in shell entirely. That should speed things up a good bit. Patch attached.

Comment 3 Gordan Bobic 2015-05-14 15:30:08 UTC
Is skipcpio faster than dd count=1 (or close enough that it doesn't matter)?

Comment 4 David Shea 2015-05-14 15:32:30 UTC
Almost certainly, since it would also be replacing the three other dd calls called for each of the half-dozen or so files in early_cpio.

Comment 8 errata-xmlrpc 2015-11-19 03:31:31 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://rhn.redhat.com/errata/RHBA-2015-2119.html