You are not logged in.

#51 2019-03-02 12:34:41

gcr
Member
Registered: 2019-02-25
Posts: 14

Re: Huge memory leak on linux kernel 4.18

Ok, I understood. But can I install versions from archive and then build just two kernels, one which doesn't has leak and one which has?

Last edited by gcr (2019-03-02 12:37:27)

Offline

#52 2019-03-02 12:45:45

loqs
Member
Registered: 2014-03-06
Posts: 9,286

Re: Huge memory leak on linux kernel 4.18

Unfortunately between v4.18 and v4.19 there are 7596 commits which do not have builds which is why you need to build the kernel at least 13 times
to divide those 7596 commits into two at each step until you are left with only one commit which will be the cause.

Offline

#53 2019-03-02 15:12:44

gcr
Member
Registered: 2019-02-25
Posts: 14

Re: Huge memory leak on linux kernel 4.18

Found that memory leak starts at 4.19.2 kernel. At 4.19.1 is ok

Offline

#54 2019-03-02 16:57:03

loqs
Member
Registered: 2014-03-06
Posts: 9,286

Re: Huge memory leak on linux kernel 4.18

The following assumes the base-devel group and git are installed and I recomend enabling Makepkg#Parallel_compilation to reduce build times

$ git clone git://git.archlinux.org/svntogit/packages.git --single-branch --branch "packages/linux"
$ cd packages/trunk
$ git checkout a1ed5d19d5982b1e77afe4949be6b867c088d50f #4.19.2.arch1-1
$ cd ../..
$ cp -r packages/trunk linux-git
$ rm -rf packages
$ cd linux-git
# Edit replace the PKGBUILD with the one below
$ makepkg -rsi #this is to confirm 4.19.2 as built on your system does have the issue update bootloader for new kernel if needed

$ cd linux-git/src/linux
$ git checkout v4.19.1
$ cd ../..
$ makepkg -ersi #this is to confirm 4.19.1 as built on your system does not have the issue select the default option for all prompted options

$ cd linux-git/src/linux/
$ git bisect start
$ git bisect good v4.19.1
$ git bisect bad v4.19.2
$ cd ../..
$ makepkg -ersif

$ cd linux-git/src/linux/
$ git bisect $result #substitue good or bad here
$ cd ../..
$ makepkg -ersif #repeat these four lines and test the generated kernel until git has found the bad commit

PKGBUILD

# Maintainer: Boohbah <boohbah at gmail.com>
# Contributor: Tobias Powalowski <tpowa@archlinux.org>
# Contributor: Thomas Baechler <thomas@archlinux.org>
# Contributor: Jonathan Chan <jyc@fastmail.fm>
# Contributor: misc <tastky@gmail.com>
# Contributor: NextHendrix <cjones12 at sheffield.ac.uk>

pkgbase=linux-git
_srcname=linux
pkgver=0
pkgrel=1
arch=('x86_64')
url="https://www.kernel.org/"
license=('GPL2')
makedepends=('kmod' 'inetutils' 'bc' 'libelf')
options=('!strip')
source=(#'git+https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git#tag=xX.Y'
        'git+https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git#tag=v4.19.2'
  'config'   # the main kernel config file
  '60-linux.hook'  # pacman hook for depmod
  '90-linux.hook'  # pacman hook for initramfs regeneration
  'linux.preset'   # standard config files for mkinitcpio ramdisk
)

sha256sums=('SKIP'
            '986918689166b88f03579bda4a5a964ec4a1db18423b89981ba58da7e35e8e89'
            'ae2e95db94ef7176207c690224169594d49445e04249d2499e9d2fbc117a0b21'
            '75f99f5239e03238f88d1a834c50043ec32b1dc568f2cc291b07d04718483919'
            'ad6344badc91ad0630caacde83f7f9b97276f80d26a20619a87952be65492c65')

_kernelname=${pkgbase#linux}
: ${_kernelname:=-ARCH}

pkgver() {
  cd "${_srcname}"

  git describe --long | sed -E 's/^v//;s/([^-]*-g)/r\1/;s/-/./g;s/\.rc/rc/'
}

prepare() {
  cd ${_srcname}

  cp -Tf ../config .config

  # set localversion to git commit
  sed -i "s|CONFIG_LOCALVERSION=.*|CONFIG_LOCALVERSION=\"${_kernelname}\"|g" ./.config
  sed -i "s|^.*CONFIG_LOCALVERSION_AUTO.*|CONFIG_LOCALVERSION_AUTO=y|" ./.config

  # don't run depmod on 'make install'. We'll do this ourselves in packaging
#  git tracks scripts/depmod.sh so do not change it when using the existing source dir for bisection
#  sed -i '2iexit 0' scripts/depmod.sh

  # get kernel version
  make prepare

  # load configuration
  # Configure the kernel. Replace the line below with one of your choice.
  #make menuconfig # CLI menu for configuration
  #make nconfig # new CLI menu for configuration
  #make xconfig # X-based configuration
  #make oldconfig # using old config from previous kernel version
  make olddefconfig # old config from previous kernel, defaults for new options
  # ... or manually edit .config
}

build() {
  cd ${_srcname}

  make bzImage modules
}

_package() {
  pkgdesc="The Linux kernel and modules (git version)"
  depends=('coreutils' 'linux-firmware' 'kmod' 'mkinitcpio>=0.7')
  optdepends=('crda: to set the correct wireless channels of your country')
  backup=("etc/mkinitcpio.d/${pkgbase}.preset")
  install=linux.install

  cd ${_srcname}

  # get kernel version
  _kernver="$(make kernelrelease)"
  _kernver=${_kernver%-dirty} #https://bbs.archlinux.org/viewtopic.php?id=236702
  _basekernel="$(make kernelversion)"
  _basekernel=${_basekernel%.*}

  mkdir -p "${pkgdir}"/{boot,usr/lib/modules}
  make INSTALL_MOD_PATH="${pkgdir}/usr" modules_install
  cp arch/x86/boot/bzImage "${pkgdir}/boot/vmlinuz-${pkgbase}"

  # make room for external modules
  local _extramodules="extramodules-${_basekernel}${_kernelname}"
  ln -s "../${_extramodules}" "${pkgdir}/usr/lib/modules/${_kernver}/extramodules"

  # add real version for building modules and running depmod from hook
  echo "${_kernver}" |
    install -Dm644 /dev/stdin "${pkgdir}/usr/lib/modules/${_extramodules}/version"

  # remove build and source links
  rm "${pkgdir}"/usr/lib/modules/${_kernver}/{source,build}

  # now we call depmod...
  depmod -b "${pkgdir}/usr" -F System.map "${_kernver}"

  # add vmlinux
  install -Dt "${pkgdir}/usr/lib/modules/${_kernver}/build" -m644 vmlinux

  # sed expression for following substitutions
  local _subst="
    s|%PKGBASE%|${pkgbase}|g
    s|%KERNVER%|${_kernver}|g
    s|%EXTRAMODULES%|${_extramodules}|g
  "

  # hack to allow specifying an initially nonexisting install file
  sed "${_subst}" "${startdir}/${install}" > "${startdir}/${install}.pkg"
  true && install=${install}.pkg

  # install mkinitcpio preset file
  sed "${_subst}" ../linux.preset |
    install -Dm644 /dev/stdin "${pkgdir}/etc/mkinitcpio.d/${pkgbase}.preset"

  # install pacman hooks
  sed "${_subst}" ../60-linux.hook |
    install -Dm644 /dev/stdin "${pkgdir}/usr/share/libalpm/hooks/60-${pkgbase}.hook"
  sed "${_subst}" ../90-linux.hook |
    install -Dm644 /dev/stdin "${pkgdir}/usr/share/libalpm/hooks/90-${pkgbase}.hook"
}

_package-headers() {
  pkgdesc="Header files and scripts for building modules for Linux kernel (git version)"

  cd ${_srcname}
  local _builddir="${pkgdir}/usr/lib/modules/${_kernver}/build"

  install -Dt "${_builddir}" -m644 Makefile .config Module.symvers
  install -Dt "${_builddir}/kernel" -m644 kernel/Makefile

  mkdir "${_builddir}/.tmp_versions"

  cp -t "${_builddir}" -a include scripts

  install -Dt "${_builddir}/arch/x86" -m644 arch/x86/Makefile
  install -Dt "${_builddir}/arch/x86/kernel" -m644 arch/x86/kernel/asm-offsets.s

  cp -t "${_builddir}/arch/x86" -a arch/x86/include

  install -Dt "${_builddir}/drivers/md" -m644 drivers/md/*.h
  install -Dt "${_builddir}/net/mac80211" -m644 net/mac80211/*.h

  # http://bugs.archlinux.org/task/13146
  install -Dt "${_builddir}/drivers/media/i2c" -m644 drivers/media/i2c/msp3400-driver.h

  # http://bugs.archlinux.org/task/20402
  install -Dt "${_builddir}/drivers/media/usb/dvb-usb" -m644 drivers/media/usb/dvb-usb/*.h
  install -Dt "${_builddir}/drivers/media/dvb-frontends" -m644 drivers/media/dvb-frontends/*.h
  install -Dt "${_builddir}/drivers/media/tuners" -m644 drivers/media/tuners/*.h

  # add xfs and shmem for aufs building
  mkdir -p "${_builddir}"/{fs/xfs,mm}

  # copy in Kconfig files
  find . -name Kconfig\* -exec install -Dm644 {} "${_builddir}/{}" \;

  # add objtool for external module building and enabled VALIDATION_STACK option
  install -Dt "${_builddir}/tools/objtool" tools/objtool/objtool

  # remove unneeded architectures
  local _arch
  for _arch in "${_builddir}"/arch/*/; do
    [[ ${_arch} == */x86/ ]] && continue
    rm -r "${_arch}"
  done

  # remove files already in linux-docs package
  rm -r "${_builddir}/Documentation"

  # remove now broken symlinks
  find -L "${_builddir}" -type l -printf 'Removing %P\n' -delete

  # Fix permissions
  chmod -R u=rwX,go=rX "${_builddir}"

  # strip scripts directory
  local _binary _strip
  while read -rd '' _binary; do
    case "$(file -bi "${_binary}")" in
      *application/x-sharedlib*)  _strip="${STRIP_SHARED}"   ;; # Libraries (.so)
      *application/x-archive*)    _strip="${STRIP_STATIC}"   ;; # Libraries (.a)
      *application/x-executable*) _strip="${STRIP_BINARIES}" ;; # Binaries
      *) continue ;;
    esac
    /usr/bin/strip ${_strip} "${_binary}"
  done < <(find "${_builddir}/scripts" -type f -perm -u+w -print0 2>/dev/null)
}

_package-docs() {
  pkgdesc="Kernel hackers manual - HTML documentation that comes with the Linux kernel (git version)"

  cd ${_srcname}
  local _builddir="${pkgdir}/usr/lib/modules/${_kernver}/build"

  mkdir -p "${_builddir}"
  cp -t "${_builddir}" -a Documentation

  # Fix permissions
  chmod -R u=rwX,go=rX "${_builddir}"
}

pkgname=("${pkgbase}" "${pkgbase}-headers" "${pkgbase}-docs")
for _p in ${pkgname[@]}; do
  eval "package_${_p}() {
    $(declare -f "_package${_p#${pkgbase}}")
    _package${_p#${pkgbase}}
  }"
done

# vim:set ts=8 sts=2 sw=2 et:

Last edited by loqs (2019-03-02 16:58:44)

Offline

#55 2019-03-03 15:55:19

gcr
Member
Registered: 2019-02-25
Posts: 14

Re: Huge memory leak on linux kernel 4.18

Very good instruction)

found bad commit 22083c028d0b3ee419232d25ce90367e5b25df8f

https://paste.ubuntu.com/p/vpkRcbz2JY/

Offline

#56 2019-03-03 16:25:26

seth
Member
Registered: 2012-09-03
Posts: 13,122

Re: Huge memory leak on linux kernel 4.18

That commit is supposed to be gone in https://cdn.kernel.org/pub/linux/kernel … Log-4.19.3
https://git.kernel.org/pub/scm/linux/ke … 6f3afbd435
It creeped back in w/ 4.19.6 https://git.kernel.org/pub/scm/linux/ke … ?h=v4.19.6 but I've no idea why.

=> kernels 4.19.3, 4.19.4 & 4.19.5 should not expose the leak?

Offline

#57 2019-03-03 17:14:22

gcr
Member
Registered: 2019-02-25
Posts: 14

Re: Huge memory leak on linux kernel 4.18

Well, yes

+ not leak
- leak

4.18.16 +
4.19.0 +
4.19.1 + (before that commit)
4.19.2 -
4.19.3 +
4.19.4 +
4.19.6 -
4.19.12 -
4.19.24 -
4.19.25 -
4.19.26 -

Offline

#58 2019-03-06 05:16:20

gcr
Member
Registered: 2019-02-25
Posts: 14

Re: Huge memory leak on linux kernel 4.18

Well, new 5.0 kernel also leaks

Offline

#59 2019-03-06 08:28:39

progandy
Member
Registered: 2012-05-17
Posts: 3,599

Re: Huge memory leak on linux kernel 4.18

You could try compiling linux 5.0 with commit 4abb951b reverted. If that resolves the issue, post the output of dmesg both with and without the revert. There might be some differences to find there.

And then report it upstream.

git revert -n 4abb951b73ff0a8a979113ef185651aa3c8da19b

Last edited by progandy (2019-03-06 08:33:38)


| alias CUTF='LANG=en_XX.UTF-8@POSIX ' |

Offline

#60 2019-03-06 08:34:09

seth
Member
Registered: 2012-09-03
Posts: 13,122

Re: Huge memory leak on linux kernel 4.18

https://bugzilla.kernel.org/
Present the linked commit history, make your case (leak) and require at least an explanation why it was re-added w/o further explanation. If you're lucky, this happend from a bad merge and will be reverted immediately.
According to the revert commit message, you loose nothing by reverting the commit (for it doesn't actually fix anything)

Edit: blast.

Last edited by seth (2019-03-06 08:34:55)

Offline

Board footer

Powered by FluxBB