Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759250AbbFBOPq (ORCPT ); Tue, 2 Jun 2015 10:15:46 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39844 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759118AbbFBOPc (ORCPT ); Tue, 2 Jun 2015 10:15:32 -0400 Message-ID: <556DBA7C.3020909@redhat.com> Date: Tue, 02 Jun 2015 16:15:24 +0200 From: Jerome Marchand User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Peter Zijlstra CC: Ingo Molnar , linux-kernel@vger.kernel.org Subject: Re: [PATCH] fix a race between /proc/lock_stat and module unloading References: <1432903635-27272-1-git-send-email-jmarchan@redhat.com> <20150602093043.GY19282@twins.programming.kicks-ass.net> <556D7D45.3040207@redhat.com> <20150602105013.GS3644@twins.programming.kicks-ass.net> In-Reply-To: <20150602105013.GS3644@twins.programming.kicks-ass.net> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="sCGTq24RDgheD3xOnaqqjGtQvSKdxTUpf" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3895 Lines: 121 This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --sCGTq24RDgheD3xOnaqqjGtQvSKdxTUpf Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable On 06/02/2015 12:50 PM, Peter Zijlstra wrote: > On Tue, Jun 02, 2015 at 11:54:13AM +0200, Jerome Marchand wrote: >> >> I guess I jumped to conclusion here and my explanation is wrong. Howev= er >> there is still a bug which occurs when the kernel tries to access >> class->name is seq_stats: >> >> [ 43.533732] BUG: unable to handle kernel paging request at >> ffffffffa03181ce >> [ 43.534006] IP: [] strnlen+0x9/0x50 >=20 > Does something like so cure things? Yes, I can't reproduce the issue anymore. >=20 > --- > kernel/locking/lockdep.c | 3 ++- > kernel/locking/lockdep_proc.c | 22 +++++++++++++++++----- > 2 files changed, 19 insertions(+), 6 deletions(-) >=20 > diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c > index a0831e1b99f4..50ed2685f937 100644 > --- a/kernel/locking/lockdep.c > +++ b/kernel/locking/lockdep.c > @@ -3900,7 +3900,8 @@ static void zap_class(struct lock_class *class) > list_del_rcu(&class->hash_entry); > list_del_rcu(&class->lock_entry); > =20 > - class->key =3D NULL; > + WRITE_ONCE(class->key, NULL); > + WRITE_ONCE(class->name, NULL); > } > =20 > static inline int within(const void *addr, void *start, unsigned long = size) > diff --git a/kernel/locking/lockdep_proc.c b/kernel/locking/lockdep_pro= c.c > index ef43ac4bafb5..03946779eacc 100644 > --- a/kernel/locking/lockdep_proc.c > +++ b/kernel/locking/lockdep_proc.c > @@ -426,10 +426,12 @@ static void seq_lock_time(struct seq_file *m, str= uct lock_time *lt) > =20 > static void seq_stats(struct seq_file *m, struct lock_stat_data *data)= > { > - char name[39]; > - struct lock_class *class; > + struct lockdep_subclass_key *ckey; > struct lock_class_stats *stats; > + struct lock_class *class; > int i, namelen; > + char name[39]; > + char *cname; > =20 > class =3D data->class; > stats =3D &data->stats; > @@ -440,15 +442,25 @@ static void seq_stats(struct seq_file *m, struct = lock_stat_data *data) > if (class->subclass) > namelen -=3D 2; > =20 > - if (!class->name) { > + rcu_read_lock_sched(); > + cname =3D rcu_dereference_sched(class->name); > + ckey =3D rcu_dereference_sched(class->key); > + > + if (!cname && !ckey) { > + rcu_read_unlock_sched(); > + return; > + > + } else if (!cname) { > char str[KSYM_NAME_LEN]; > const char *key_name; > =20 > - key_name =3D __get_key_name(class->key, str); > + key_name =3D __get_key_name(ckey, str); > snprintf(name, namelen, "%s", key_name); > } else { > - snprintf(name, namelen, "%s", class->name); > + snprintf(name, namelen, "%s", cname); > } > + rcu_read_unlock_sched(); > + > namelen =3D strlen(name); > if (class->name_version > 1) { > snprintf(name+namelen, 3, "#%d", class->name_version); >=20 --sCGTq24RDgheD3xOnaqqjGtQvSKdxTUpf Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAEBCAAGBQJVbbqAAAoJEHTzHJCtsuoCPqkH/0xyVWe/gE4NM/u0iXct/p4G Eu+T1ci94odzMSFHC1t8TMbJ/+5XiX0XzAdmVUGplX/EB1Gr/k5qXQu2qVy+EpUv xkpQf5dnnPrxKAhabO4LiXMiB7ONFvB89eiEMJgnRnqCk2K5BrkVoi+Ffe7riqwS +BNDJ4U5D43t/X81KFm78Sj19+TVlM/GDHXKtGN+d8co1tTLZBRce9VCLpFql4bQ R/n53a3foOs5Zwzc6zYl9JE4Tzl8iwmMpFkxcC8WfGxxFL101i/qHUp0bJXDAlfT BaOqLhMwuNrLNC5ZkOywHJxLvZpHLkLCNt+41/+AK64/7XnAJeozskHXHSpRnU8= =NwOx -----END PGP SIGNATURE----- --sCGTq24RDgheD3xOnaqqjGtQvSKdxTUpf-- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/