All of lore.kernel.org
 help / color / mirror / Atom feed
From: Petr Mladek <pmladek@suse.com>
To: Miroslav Benes <mbenes@suse.cz>
Cc: Jiri Kosina <jikos@kernel.org>,
	Josh Poimboeuf <jpoimboe@redhat.com>,
	Jason Baron <jbaron@akamai.com>,
	Joe Lawrence <joe.lawrence@redhat.com>,
	Jessica Yu <jeyu@kernel.org>,
	Evgenii Shatokhin <eshatokhin@virtuozzo.com>,
	live-patching@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v12 00/12]
Date: Thu, 11 Oct 2018 14:48:28 +0200	[thread overview]
Message-ID: <20181011124828.bc2reaplfisvergs@pathway.suse.cz> (raw)
In-Reply-To: <alpine.LSU.2.21.1808301353170.18557@pobox.suse.cz>

On Thu 2018-08-30 13:58:15, Miroslav Benes wrote:
> On Tue, 28 Aug 2018, Petr Mladek wrote:
> 
> > livepatch: Atomic replace feature
> > 
> > The atomic replace allows to create cumulative patches. They
> > are useful when you maintain many livepatches and want to remove
> > one that is lower on the stack. In addition it is very useful when
> > more patches touch the same function and there are dependencies
> > between them.
> > 
> > This version does another big refactoring based on feedback against
> > v11[*]. In particular, it removes the registration step, changes
> > the API and handling of livepatch dependencies. The aim is
> > to keep the number of possible variants on a sane level.
> > It helps the keep the feature "easy" to use and maintain.
> > 
> > [*] https://lkml.kernel.org/r/20180323120028.31451-1-pmladek@suse.com
> 
> Hi,
> 
> I've started to review the patch set. Running selftests with lockdep 
> enabled gives me...
> 
> ======================================================
> WARNING: possible circular locking dependency detected
> 4.17.0-rc1-klp_replace_v12-117114-gfedb3eba611d #218 Tainted: G              
> K  
> ------------------------------------------------------
> kworker/1:1/49 is trying to acquire lock:
> 00000000bb88dc17 (kn->count#186){++++}, at: kernfs_remove+0x23/0x40
> 
> but task is already holding lock:
> 0000000073632424 (klp_mutex){+.+.}, at: klp_transition_work_fn+0x17/0x40
> 
> which lock already depends on the new lock.
> 
> 
> the existing dependency chain (in reverse order) is:
> 
> -> #1 (klp_mutex){+.+.}:
>        lock_acquire+0xd4/0x220
>        __mutex_lock+0x75/0x920
>        mutex_lock_nested+0x1b/0x20
>        enabled_store+0x47/0x150
>        kobj_attr_store+0x12/0x20
>        sysfs_kf_write+0x4a/0x60
>        kernfs_fop_write+0x123/0x1b0
>        __vfs_write+0x2b/0x150
>        vfs_write+0xc7/0x1c0
>        ksys_write+0x49/0xa0
>        __x64_sys_write+0x1a/0x20
>        do_syscall_64+0x62/0x1b0
>        entry_SYSCALL_64_after_hwframe+0x49/0xbe
> 
> -> #0 (kn->count#186){++++}:
>        __lock_acquire+0xe9d/0x1240
>        lock_acquire+0xd4/0x220
>        __kernfs_remove+0x23c/0x2c0
>        kernfs_remove+0x23/0x40
>        sysfs_remove_dir+0x51/0x60
>        kobject_del+0x18/0x50
>        kobject_cleanup+0x4b/0x180
>        kobject_put+0x2a/0x50
>        __klp_free_patch+0x5b/0x60
>        klp_free_patch_nowait+0x12/0x30
>        klp_try_complete_transition+0x13e/0x180
>        klp_transition_work_fn+0x26/0x40
>        process_one_work+0x1d8/0x5d0
>        worker_thread+0x4d/0x3d0
>        kthread+0x113/0x150
>        ret_from_fork+0x3a/0x50
> 
> other info that might help us debug this:
> 
>  Possible unsafe locking scenario:
> 
>        CPU0                    CPU1
>        ----                    ----
>   lock(klp_mutex);
>                                lock(kn->count#186);
>                                lock(klp_mutex);
>   lock(kn->count#186);

Sigh, I overestimated the power of kobjects. I thought that this
must have been a false positive but it was not.

1. kernfs_fop_write() ignores kobj->kref. It takes care only
   of its own reference count, see kernfs_get_active().

2. kobj_put() takes care only of kobj->kref. The following
   code is called when the reference count reaches zero:

   + kobj_put()
     + kref_put()
       + kobject_release()
         + kobject_cleanup()
           + kobject_del()
	     + sysfs_remove_dir()
	       + kernfs_remove()
	         + __kernfs_remove().
		   + kernfs_drain()

    , where kernfs_drain() waits until all opened files
    are closed.

Now, we call kobj_put() under klp_mutex() when the sysfs
interface still exists. Files can be opened for
writing. As a result:

   + enabled_store() might wait for klp_mutex

   + kernfs_drain() would wait for enabled_store()
     with klp_mutex() taken.


I have reproduced this with some extra sleeps.

I am going to work on another solution.

Best Regards,
Petr

      reply	other threads:[~2018-10-11 12:48 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-28 14:35 [PATCH v12 00/12] Petr Mladek
2018-08-28 14:35 ` [PATCH v12 01/12] livepatch: Change void *new_func -> unsigned long new_addr in struct klp_func Petr Mladek
2018-08-31  8:37   ` Miroslav Benes
2018-08-28 14:35 ` [PATCH v12 02/12] livepatch: Helper macros to define livepatch structures Petr Mladek
2018-08-28 14:35 ` [PATCH v12 03/12] livepatch: Shuffle klp_enable_patch()/klp_disable_patch() code Petr Mladek
2018-08-31  8:38   ` Miroslav Benes
2018-08-28 14:35 ` [PATCH v12 04/12] livepatch: Consolidate klp_free functions Petr Mladek
2018-08-31 10:39   ` Miroslav Benes
2018-10-12 11:43     ` Petr Mladek
2018-08-28 14:35 ` [PATCH v12 05/12] livepatch: Refuse to unload only livepatches available during a forced transition Petr Mladek
2018-08-28 14:35 ` [PATCH v12 06/12] livepatch: Simplify API by removing registration step Petr Mladek
2018-09-05  9:34   ` Miroslav Benes
2018-10-12 13:01     ` Petr Mladek
2018-10-15 16:01       ` Miroslav Benes
2018-10-18 14:54         ` Petr Mladek
2018-10-18 15:30           ` Josh Poimboeuf
2018-10-19 12:16             ` Miroslav Benes
2018-10-19 14:36               ` Josh Poimboeuf
2018-10-22 13:25                 ` Petr Mladek
2018-10-23 16:39                   ` Josh Poimboeuf
2018-10-24  2:55                     ` Josh Poimboeuf
2018-10-24 11:14                     ` Petr Mladek
2018-08-28 14:35 ` [PATCH v12 07/12] livepatch: Use lists to manage patches, objects and functions Petr Mladek
2018-09-03 16:00   ` Miroslav Benes
2018-10-12 12:12     ` Petr Mladek
2018-08-28 14:35 ` [PATCH v12 08/12] livepatch: Add atomic replace Petr Mladek
2018-08-28 14:36 ` [PATCH v12 09/12] livepatch: Remove Nop structures when unused Petr Mladek
2018-09-04 14:50   ` Miroslav Benes
2018-08-28 14:36 ` [PATCH v12 10/12] livepatch: Atomic replace and cumulative patches documentation Petr Mladek
2018-09-04 15:15   ` Miroslav Benes
2018-08-28 14:36 ` [PATCH v12 11/12] livepatch: Remove ordering and refuse loading conflicting patches Petr Mladek
2018-08-28 14:36 ` [PATCH v12 12/12] selftests/livepatch: introduce tests Petr Mladek
2018-08-30 11:58 ` [PATCH v12 00/12] Miroslav Benes
2018-10-11 12:48   ` Petr Mladek [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181011124828.bc2reaplfisvergs@pathway.suse.cz \
    --to=pmladek@suse.com \
    --cc=eshatokhin@virtuozzo.com \
    --cc=jbaron@akamai.com \
    --cc=jeyu@kernel.org \
    --cc=jikos@kernel.org \
    --cc=joe.lawrence@redhat.com \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=live-patching@vger.kernel.org \
    --cc=mbenes@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.