Bug 1420462

Summary: thin-pool target usage leaves kmemleak reported leaks
Product: [Community] LVM and device-mapper Reporter: Zdenek Kabelac <zkabelac>
Component: device-mapperAssignee: Mike Snitzer <msnitzer>
Status: CLOSED CURRENTRELEASE QA Contact: cluster-qe <cluster-qe>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 2.02.169CC: agk, heinzm, jbrassow, msnitzer, prajnoha, zkabelac
Target Milestone: ---Flags: rule-engine: lvm-technical-solution?
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2021-01-06 23:08:52 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:

Description Zdenek Kabelac 2017-02-08 17:52:36 UTC
Description of problem:

No sure how real this issue is - but with lvm2 test suite run we kmemleak couple of this elements per each run.

unreferenced object 0xffff8bbcbad71f00 (size 256):
  comm "kworker/u4:2", pid 5875, jiffies 4298404175 (age 413.812s)
  hex dump (first 32 bytes):
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  backtrace:
    [<ffffffff8b9471ca>] kmemleak_alloc+0x4a/0xa0
    [<ffffffff8b28be2e>] kmem_cache_alloc+0x14e/0x2e0
    [<ffffffff8b21529d>] mempool_alloc_slab+0x1d/0x30
    [<ffffffff8b215019>] mempool_alloc+0x79/0x1e0
    [<ffffffff8b4572e7>] bio_alloc_bioset+0xa7/0x270
    [<ffffffffc02ec48a>] process_prepared_discard_passdown_pt1+0x7a/0x180 [dm_thin_pool]
    [<ffffffffc02eb38c>] process_discard_cell_passdown+0x15c/0x1e0 [dm_thin_pool]
    [<ffffffffc02e9821>] process_discard_bio+0xc1/0xf0 [dm_thin_pool]
    [<ffffffffc02ee7a1>] do_worker+0x781/0x900 [dm_thin_pool]
    [<ffffffff8b0d4d80>] process_one_work+0x260/0x750
    [<ffffffff8b0d52be>] worker_thread+0x4e/0x4a0
    [<ffffffff8b0dcacc>] kthread+0x12c/0x150
    [<ffffffff8b956fc1>] ret_from_fork+0x31/0x40
    [<ffffffffffffffff>] 0xffffffffffffffff


Version-Release number of selected component (if applicable):
Kernel  4.10-rc6

How reproducible:


Steps to Reproduce:
1.
2.
3.

Actual results:


Expected results:


Additional info:

Comment 1 Zdenek Kabelac 2017-04-18 07:59:23 UTC
Patch suggested with:

https://www.redhat.com/archives/dm-devel/2017-April/msg00286.html
(with full headers)

--
 drivers/md/dm-thin.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index 2b266a2..5742e5e 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -1069,6 +1069,7 @@ static void passdown_endio(struct bio *bio)
 	 * to unmap (we ignore err).
 	 */
 	queue_passdown_pt2(bio->bi_private);
+	bio_put(bio);
 }

Comment 2 Mike Snitzer 2021-01-06 23:08:52 UTC
Was fixed long ago with this upstream commit:

commit 948f581a53b704b984aa20df009f0a2b4cf7f907
Author: Dennis Yang <dennisyang>
Date:   Tue Apr 18 15:27:06 2017 +0800

    dm thin: fix a memory leak when passing discard bio down

    dm-thin does not free the discard_parent bio after all chained sub
    bios finished. The following kmemleak report could be observed after
    pool with discard_passdown option processes discard bios in
    linux v4.11-rc7. To fix this, we drop the discard_parent bio reference
    when its endio (passdown_endio) called.

    unreferenced object 0xffff8803d6b29700 (size 256):
      comm "kworker/u8:0", pid 30349, jiffies 4379504020 (age 143002.776s)
      hex dump (first 32 bytes):
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        01 00 00 00 00 00 00 f0 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff81a5efd9>] kmemleak_alloc+0x49/0xa0
        [<ffffffff8114ec34>] kmem_cache_alloc+0xb4/0x100
        [<ffffffff8110eec0>] mempool_alloc_slab+0x10/0x20
        [<ffffffff8110efa5>] mempool_alloc+0x55/0x150
        [<ffffffff81374939>] bio_alloc_bioset+0xb9/0x260
        [<ffffffffa018fd20>] process_prepared_discard_passdown_pt1+0x40/0x1c0 [dm_thin_pool]
        [<ffffffffa018b409>] break_up_discard_bio+0x1a9/0x200 [dm_thin_pool]
        [<ffffffffa018b484>] process_discard_cell_passdown+0x24/0x40 [dm_thin_pool]
        [<ffffffffa018b24d>] process_discard_bio+0xdd/0xf0 [dm_thin_pool]
        [<ffffffffa018ecf6>] do_worker+0xa76/0xd50 [dm_thin_pool]
        [<ffffffff81086239>] process_one_work+0x139/0x370
        [<ffffffff810867b1>] worker_thread+0x61/0x450
        [<ffffffff8108b316>] kthread+0xd6/0xf0
        [<ffffffff81a6cd1f>] ret_from_fork+0x3f/0x70
        [<ffffffffffffffff>] 0xffffffffffffffff

    Cc: stable.org
    Signed-off-by: Dennis Yang <dennisyang>
    Signed-off-by: Mike Snitzer <snitzer>