1. 20 4月, 2008 16 次提交
    • P
      sched: fair-group: SMP-nice for group scheduling · 18d95a28
      Peter Zijlstra 提交于
      Implement SMP nice support for the full group hierarchy.
      
      On each load-balance action, compile a sched_domain wide view of the full
      task_group tree. We compute the domain wide view when walking down the
      hierarchy, and readjust the weights when walking back up.
      
      After collecting and readjusting the domain wide view, we try to balance the
      tasks within the task_groups. The current approach is a naively balance each
      task group until we've moved the targeted amount of load.
      
      Inspired by Srivatsa Vaddsgiri's previous code and Abhishek Chandra's H-SMP
      paper.
      
      XXX: there will be some numerical issues due to the limited nature of
           SCHED_LOAD_SCALE wrt to representing a task_groups influence on the
           total weight. When the tree is deep enough, or the task weight small
           enough, we'll run out of bits.
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      CC: Abhishek Chandra <chandra@cs.umn.edu>
      CC: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      18d95a28
    • H
      sched, cpuset: customize sched domains, core · 1d3504fc
      Hidetoshi Seto 提交于
      [rebased for sched-devel/latest]
      
       - Add a new cpuset file, having levels:
           sched_relax_domain_level
      
       - Modify partition_sched_domains() and build_sched_domains()
         to take attributes parameter passed from cpuset.
      
       - Fill newidle_idx for node domains which currently unused but
         might be required if sched_relax_domain_level become higher.
      
       - We can change the default level by boot option 'relax_domain_level='.
      Signed-off-by: NHidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      1d3504fc
    • P
      sched: fix the task_group hierarchy for UID grouping · eff766a6
      Peter Zijlstra 提交于
      UID grouping doesn't actually have a task_group representing the root of
      the task_group tree. Add one.
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      eff766a6
    • D
      sched: allow the group scheduler to have multiple levels · ec7dc8ac
      Dhaval Giani 提交于
      This patch makes the group scheduler multi hierarchy aware.
      
      [a.p.zijlstra@chello.nl: rt-parts and assorted fixes]
      Signed-off-by: NDhaval Giani <dhaval@linux.vnet.ibm.com>
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      ec7dc8ac
    • M
      sched: add new set_cpus_allowed_ptr function · cd8ba7cd
      Mike Travis 提交于
      Add a new function that accepts a pointer to the "newly allowed cpus"
      cpumask argument.
      
      int set_cpus_allowed_ptr(struct task_struct *p, const cpumask_t *new_mask)
      
      The current set_cpus_allowed() function is modified to use the above
      but this does not result in an ABI change.  And with some compiler
      optimization help, it may not introduce any additional overhead.
      
      Additionally, to enforce the read only nature of the new_mask arg, the
      "const" property is migrated to sub-functions called by set_cpus_allowed.
      This silences compiler warnings.
      Signed-off-by: NMike Travis <travis@sgi.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      cd8ba7cd
    • M
      cpumask: add show cpu map functions · 9d1fe323
      Mike Travis 提交于
        * Add cpu_sysdev_class functions to display the following maps
          with cpulist_scnprintf().
      
      	cpu_online_map
      	cpu_present_map
      	cpu_possible_map
      
        * Small change to include/linux/sysdev.h to allow the attribute
          name and label to be different (to avoid collision with the
          "attr_online" entry for bringing cpus on- and off-line.)
      
      Cc: H. Peter Anvin <hpa@zytor.com>
      Signed-off-by: NMike Travis <travis@sgi.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      9d1fe323
    • M
      x86: convert cpumask_of_cpu macro to allocated array · 9f0e8d04
      Mike Travis 提交于
        * Here is a simple patch to use an allocated array of cpumasks to
          represent cpumask_of_cpu() instead of constructing one on the stack.
          It's based on the Kconfig option "HAVE_CPUMASK_OF_CPU_MAP" which is
          currently only set for x86_64 SMP.  Otherwise the the existing
          cpumask_of_cpu() is used but has been changed to produce an lvalue
          so a pointer to it can be used.
      
      Cc: H. Peter Anvin <hpa@zytor.com>
      Signed-off-by: NChristoph Lameter <clameter@sgi.com>
      Signed-off-by: NMike Travis <travis@sgi.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      9f0e8d04
    • M
      cpumask: add CPU_MASK_ALL_PTR macro · 321a8e9d
      Mike Travis 提交于
        * Add a static cpumask_t variable "CPU_MASK_ALL_PTR" to use as
          a pointer reference to CPU_MASK_ALL.  This reduces where possible
          the instances where CPU_MASK_ALL allocates and fills a large
          array on the stack.  Used only if NR_CPUS > BITS_PER_LONG.
      
        * Change init/main.c to use new set_cpus_allowed_ptr().
      
      Depends on:
      	[sched-devel]: sched: add new set_cpus_allowed_ptr function
      
      Cc: H. Peter Anvin <hpa@zytor.com>
      Signed-off-by: NMike Travis <travis@sgi.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      321a8e9d
    • M
      cpumask: reduce stack usage in SD_x_INIT initializers · 7c16ec58
      Mike Travis 提交于
        * Remove empty cpumask_t (and all non-zero/non-null) variables
          in SD_*_INIT macros.  Use memset(0) to clear.  Also, don't
          inline the initializer functions to save on stack space in
          build_sched_domains().
      
        * Merge change to include/linux/topology.h that uses the new
          node_to_cpumask_ptr function in the nr_cpus_node macro into
          this patch.
      
      Depends on:
      	[mm-patch]: asm-generic-add-node_to_cpumask_ptr-macro.patch
      	[sched-devel]: sched: add new set_cpus_allowed_ptr function
      
      Cc: H. Peter Anvin <hpa@zytor.com>
      Signed-off-by: NMike Travis <travis@sgi.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      7c16ec58
    • M
      generic: reduce stack pressure in sched_affinity · b53e921b
      Mike Travis 提交于
        * Modify sched_affinity functions to pass cpumask_t variables by reference
          instead of by value.
      
        * Use new set_cpus_allowed_ptr function.
      
      Depends on:
      	[sched-devel]: sched: add new set_cpus_allowed_ptr function
      
      Cc: Paul Jackson <pj@sgi.com>
      Cc: Cliff Wickman <cpw@sgi.com>
      Signed-off-by: NMike Travis <travis@sgi.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      b53e921b
    • M
      cpuset: modify cpuset_set_cpus_allowed to use cpumask pointer · f9a86fcb
      Mike Travis 提交于
        * Modify cpuset_cpus_allowed to return the currently allowed cpuset
          via a pointer argument instead of as the function return value.
      
        * Use new set_cpus_allowed_ptr function.
      
        * Cleanup CPU_MASK_ALL and NODE_MASK_ALL uses.
      
      Depends on:
      	[sched-devel]: sched: add new set_cpus_allowed_ptr function
      Signed-off-by: NMike Travis <travis@sgi.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      f9a86fcb
    • M
      asm-generic: add node_to_cpumask_ptr macro · aa6b5446
      Mike Travis 提交于
      Create a simple macro to always return a pointer to the node_to_cpumask(node)
      value.  This relies on compiler optimization to remove the extra indirection:
      
          #define node_to_cpumask_ptr(v, node) 		\
      	    cpumask_t _##v = node_to_cpumask(node), *v = &_##v
      
      For those systems with a large cpumask size, then a true pointer
      to the array element can be used:
      
          #define node_to_cpumask_ptr(v, node)		\
      	    cpumask_t *v = &(node_to_cpumask_map[node])
      
      A node_to_cpumask_ptr_next() macro is provided to access another
      node_to_cpumask value.
      
      The other change is to always include asm-generic/topology.h moving the
      ifdef CONFIG_NUMA to this same file.
      
      Note: there are no references to either of these new macros in this patch,
      only the definition.
      
      Based on 2.6.25-rc5-mm1
      
      # alpha
      Cc: Richard Henderson <rth@twiddle.net>
      
      # fujitsu
      Cc: David Howells <dhowells@redhat.com>
      
      # ia64
      Cc: Tony Luck <tony.luck@intel.com>
      
      # powerpc
      Cc: Paul Mackerras <paulus@samba.org>
      Cc: Anton Blanchard <anton@samba.org>
      
      # sparc
      Cc: David S. Miller <davem@davemloft.net>
      Cc: William L. Irwin <wli@holomorphy.com>
      
      # x86
      Cc: H. Peter Anvin <hpa@zytor.com>
      Signed-off-by: NMike Travis <travis@sgi.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      aa6b5446
    • M
      cpumask: add cpumask_scnprintf_len function · 30ca60c1
      Mike Travis 提交于
      Add a new function cpumask_scnprintf_len() to return the number of
      characters needed to display "len" cpumask bits.  The current method
      of allocating NR_CPUS bytes is incorrect as what's really needed is
      9 characters per 32-bit word of cpumask bits (8 hex digits plus the
      seperator [','] or the terminating NULL.)  This function provides the
      caller the means to allocate the correct string length.
      
      Cc: Paul Jackson <pj@sgi.com>
      Signed-off-by: NMike Travis <travis@sgi.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      30ca60c1
    • P
      sched: rt-group: synchonised bandwidth period · d0b27fa7
      Peter Zijlstra 提交于
      Various SMP balancing algorithms require that the bandwidth period
      run in sync.
      
      Possible improvements are moving the rt_bandwidth thing into root_domain
      and keeping a span per rt_bandwidth which marks throttled cpus.
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      d0b27fa7
    • I
      time: add ns_to_ktime() · 57d3da29
      Ingo Molnar 提交于
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      57d3da29
    • I
      sched: remove sysctl_sched_batch_wakeup_granularity · 50df5d6a
      Ingo Molnar 提交于
      it's unused.
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      50df5d6a
  2. 19 4月, 2008 7 次提交
  3. 18 4月, 2008 17 次提交
    • P
      [INET]: Uninline the __inet_inherit_port call. · 53083773
      Pavel Emelyanov 提交于
      This deblats ~200 bytes when ipv6 and dccp are 'y'.
      
      Besides, this will ease compilation issues for patches
      I'm working on to make inet hash tables more scalable 
      wrt net namespaces.
      Signed-off-by: NPavel Emelyanov <xemul@openvz.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      53083773
    • P
      [INET]: Drop the inet_inherit_port() call. · e56d8b8a
      Pavel Emelyanov 提交于
      As I can see from the code, two places (tcp_v6_syn_recv_sock and
      dccp_v6_request_recv_sock) that call this one already run with
      BHs disabled, so it's safe to call __inet_inherit_port there.
      
      Besides (in case I missed smth with code review) the calltrace
      tcp_v6_syn_recv_sock
       `- tcp_v4_syn_recv_sock
           `- __inet_inherit_port
      and the similar for DCCP are valid, but assumes BHs to be disabled.
      Signed-off-by: NPavel Emelyanov <xemul@openvz.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e56d8b8a
    • B
      ide: remove ide_init_default_irq() macro · 273b8385
      Bartlomiej Zolnierkiewicz 提交于
      * Use ide_default_irq() instead of ide_init_default_irq() in
        ide_generic host driver (so the correct IRQ is always set
        regardless of CONFIG_PCI / CONFIG_BLK_DEV_IDEPCI).
      
      * Remove no longer needed ide_init_default_irq() macro.
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      273b8385
    • B
      ide: remove ide_default_io_ctl() macro · 9dfcd15a
      Bartlomiej Zolnierkiewicz 提交于
      It is always == '((base) + 0x206)' if CONFIG_IDE_ARCH_OBSOLETE_DEFAULTS=y
      and it is not needed otherwise (arm, blackfin, parisc, ppc64, sh, sparc[64]).
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      9dfcd15a
    • B
      ide: add CONFIG_IDE_ARCH_OBSOLETE_DEFAULTS (take 2) · 0e33555f
      Bartlomiej Zolnierkiewicz 提交于
      * Add CONFIG_IDE_ARCH_OBSOLETE_DEFAULTS to drivers/ide/Kconfig and use
        it instead of defining IDE_ARCH_OBSOLETE_DEFAULTS in <arch/ide.h>.
      
      v2:
      * Define ide_default_irq() in ide-probe.c/ns87415.c if not already defined
        and drop defining ide_default_irq() for CONFIG_IDE_ARCH_OBSOLETE_DEFAULTS=n.
      
        [ Thanks to Stephen Rothwell and David Miller for noticing the problem. ]
      
      Cc: Stephen Rothwell <sfr@canb.auug.org.au>
      Cc: David Miller <davem@davemloft.net>
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      0e33555f
    • B
      ppc: remove ppc_ide_md · 1d850bd0
      Bartlomiej Zolnierkiewicz 提交于
      * Add special cases for pplus and prep to ide_default_{irq,io_base}()
        (+ FIXMEs about the need to use IDE platform host driver instead).
      
      * Remove no longer needed ppc_ide_md and struct ide_machdep_calls.
      
      * Then remove <linux/ide.h> include from:
        - arch/powerpc/kernel/setup_32.c
        - arch/ppc/kernel/ppc_ksyms.c
        - arch/ppc/kernel/setup.c
        - arch/ppc/platforms/pplus.c
        - arch/ppc/platforms/prep_setup.c
      
      There should be no functional changes caused by this patch.
      
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      1d850bd0
    • B
    • B
      ide: add generic packet command representation ide_atapi_pc · 8303b46e
      Borislav Petkov 提交于
      This new struct unifies ide{-floppy,-tape,-scsi}'s view of a packet command. For now,
      it represents the common denominator between the three drivers while adding driver-
      specific members at the end of the struct which will be merged/simplified into the
      generic ATAPI handling code in later steps, or removed completely.
      
      Bart:
      - move struct ide_atapi_pc outside of #ifdef/#endif CONFIG_IDE_PROC_FS
      Signed-off-by: NBorislav Petkov <petkovbb@gmail.com>
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      8303b46e
    • B
      ide: remove IDE_*_REG macros · 23579a2a
      Bartlomiej Zolnierkiewicz 提交于
      * Add IDE_{ALTSTATUS,IREASON,BCOUNTL,BCOUNTH}_OFFSET defines.
      
      * Remove IDE_*_REG macros - this results in more readable
        and slightly smaller code.
      
      There should be no functional changes caused by this patch.
      
      Cc: Borislav Petkov <petkovbb@gmail.com>
      Acked-by: NSergei Shtylyov <sshtylyov@ru.mvista.com>
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      23579a2a
    • B
      ide: add ide_atapi_{discard_data,write_zeros} inline helpers · 7616c0ad
      Bartlomiej Zolnierkiewicz 提交于
      Add ide_atapi_{discard_data,write_zeros} inline helpers to <linux/ide.h>
      and use them instead of home-brewn helpers in ide-{floppy,tape,scsi}.
      
      There should be no functional changes caused by this patch.
      
      Cc: Borislav Petkov <petkovbb@gmail.com>
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      7616c0ad
    • B
      ide: remove ide_init_hwif_ports() · e6bfa38a
      Bartlomiej Zolnierkiewicz 提交于
      ide_init_hwif_ports() is only used by init_ide_data() now, inline it there.
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      e6bfa38a
    • B
      ide: remove ->hold field from ide_hwif_t (take 2) · 2304dc64
      Bartlomiej Zolnierkiewicz 提交于
      ->hold is write-only now, remove it.
      
      v2:
      * v1 missed bast-ide, palm_bk3710, ide-cs and delkin_cb host drivers.
      Acked-by: NSergei Shtylyov <sshtylyov@ru.mvista.com>
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      2304dc64
    • B
      ide: remove broken/dangerous HDIO_[UNREGISTER,SCAN]_HWIF ioctls (take 3) · 93de00fd
      Bartlomiej Zolnierkiewicz 提交于
      hdparm explicitely marks HDIO_[UNREGISTER,SCAN]_HWIF ioctls as DANGEROUS
      and given the number of bugs we can assume that there are no real users:
      
      * DMA has no chance of working because DMA resources are released by
        ide_unregister() and they are never allocated again.
      
      * Since ide_init_hwif_ports() is used for ->io_ports[] setup the ioctls
        don't work for almost all hosts with "non-standard" (== non ISA-like)
        layout of IDE taskfile registers (there is a lot of such host drivers).
      
      * ide_port_init_devices() is not called when probing IDE devices so:
        - drive->autotune is never set and IDE host/devices are not programmed
          for the correct PIO/DMA transfer modes (=> possible data corruption)
        - host specific I/O 32-bit and IRQ unmasking settings are not applied
          (=> possible data corruption)
        - host specific ->port_init_devs method is not called (=> no luck with
          ht6560b, qd65xx and opti621 host drivers)
      
      * ->rw_disk method is not preserved (=> no HPT3xxN chipsets support).
      
      * ->serialized flag is not preserved (=> possible data corruption when
         using icside, aec62xx (ATP850UF chipset), cmd640, cs5530, hpt366
         (HPT3xxN chipsets), rz1000, sc1200, dtc2278 and ht6560b host drivers).
      
      * ->ack_intr method is not preserved (=> needed by ide-cris, buddha,
        gayle and macide host drivers).
      
      * ->sata_scr[] and sata_misc[] is cleared by ide_unregister() and it
        isn't initialized again (SiI3112 support needs them).
      
      * To issue an ioctl() there need to be at least one IDE device present
        in the system.
      
      * ->cable_detect method is not preserved + it is not called when probing
        IDE devices so cable detection is broken (however since DMA support is
        also broken it doesn't really matter ;-).
      
      * Some objects which may have already been freed in ide_unregister()
        are restored by ide_hwif_restore() (i.e. ->hwgroup).
      
      * ide_register_hw() may unregister unrelated IDE ports if free ide_hwifs[]
        slot cannot be found.
      
      * When IDE host drivers are modular unregistered port may be re-used by
        different host driver that owned it first causing subtle bugs.
      
      Since we now have a proper warm-plug support remove these ioctls,
      then remove no longer needed:
      - ide_register_hw() and ide_hwif_restore() functions
      - 'init_default' and 'restore' arguments of ide_unregister()
      - zeroeing of hwif->{dma,extra}_* fields in ide_unregister()
      
      As an added bonus IDE core code size shrinks by ~3kB (x86-32).
      
      v2:
      * fix ide_unregister() arguments in cleanup_module() (Andrew Morton).
      
      v3:
      * fix ide_unregister() arguments in palm_bk3710.c.
      Acked-by: NSergei Shtylyov <sshtylyov@ru.mvista.com>
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      93de00fd
    • B
      ide: remove obsoleted "idex=base[,ctl[,irq]]" kernel parameters (take 2) · 9a0e77f2
      Bartlomiej Zolnierkiewicz 提交于
      * Remove obsoleted "idex=base[,ctl[,irq]]" kernel parameters
        and update Documentation/ide/ide.txt.
      
      * Remove no longer needed ide_forced chipset type.
      
      v2:
      * is_chipset_set[] -> is_chipset_set in ide.c.
      
      * Documentation/ide/ide.txt fix.
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      9a0e77f2
    • B
      ide: add warm-plug support for IDE devices (take 2) · f74c9141
      Bartlomiej Zolnierkiewicz 提交于
      * Add 'struct class ide_port_class' ('ide_port' class) and a 'struct
        device *portdev' ('ide_port' class device) in ide_hwif_t.
      
      * Register 'ide_port' class in ide_init() and unregister it in
        cleanup_module().
      
      * Create ->portdev in ide_register_port () and unregister it in
        ide_unregister().
      
      * Add "delete_devices" class device attribute for unregistering IDE devices
        on a port and "scan" one for probing+registering IDE devices on a port.
      
      * Add ide_sysfs_register_port() helper for registering "delete_devices"
        and "scan" attributes with ->portdev.  Call it in ide_device_add_all().
      
      * Document IDE warm-plug support in Documentation/ide/warm-plug-howto.txt.
      
      v2:
      * Convert patch from using 'struct class_device' to use 'struct device'.
        (thanks to Kay Sievers for doing it)
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      f74c9141
    • B
      ide: remove dead/obsolete ->busproc method · 50672e5d
      Bartlomiej Zolnierkiewicz 提交于
      ->busproc method is used by HDIO_SET_BUSSTATE ioctl but it has no chance
      of working as intended (in 2.4.x days) because to issue an ioctl there
      is a device node needed and:
      
      - for BUSSTATE_TRISTATE+OFF it is too late (devices are already gone)
      
      - for BUSSTATE_TRISTATE+ON it is too early (devices are not registered yet)
      
      Just remove ->busproc method for now (it was only implemented by hpt366,
      siimage and tc86c001 host drivers).
      
      Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      50672e5d
    • B
      ide: rework PowerMac media-bay support (take 2) · 2dde7861
      Bartlomiej Zolnierkiewicz 提交于
      Rework PowerMac media-bay support in such way that instead of
      un/registering the IDE interface we un/register IDE devices:
      
      * Add ide_port_scan() helper for probing+registerering devices on a port.
      
      * Rename ide_port_unregister_devices() to __ide_port_unregister_devices().
      
      * Add ide_port_unregister_devices() helper for unregistering devices on a port.
      
      * Add 'ide_hwif_t *cd_port' to 'struct media_bay_info', pass 'hwif' instead
        of hwif->index to media_bay_set_ide_infos() and use it to setup 'cd_port'.
      
      * Use ide_port_unregister_devices() instead of ide_unregister()
        and ide_port_scan() instead of ide_register_hw() in media_bay_step().
      
      * Unexport ide_register_hw() and make it static.
      
      v2:
      * Fix build by adding <linux/ide.h> include to <asm-powerpc/mediabay.h>.
        (Reported by Michael/Kamalesh/Andrew).
      
      Cc: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
      Cc: Michael Ellerman <michael@ellerman.id.au>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      2dde7861