Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932696AbbGVHrA (ORCPT ); Wed, 22 Jul 2015 03:47:00 -0400 Received: from mail.skyhub.de ([78.46.96.112]:60328 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932189AbbGVHq5 (ORCPT ); Wed, 22 Jul 2015 03:46:57 -0400 Date: Wed, 22 Jul 2015 09:46:49 +0200 From: Borislav Petkov To: Pan Xinhui Cc: "linux-kernel@vger.kernel.org" , Thomas Gleixner , mingo@redhat.com, hpa@zytor.com, x86@kernel.org, bp@suse.de, toshi.kani@hp.com, jgross@suse.com, mcgrof@suse.com, "mnipxh@163.com" , "yanmin_zhang@linux.intel.com" Subject: Re: [PATCH V3] x86/mm/pat: Do a small optimization and fix in reserve_memtype Message-ID: <20150722074649.GD7979@nazgul.tnic> References: <55AF2C68.5010304@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <55AF2C68.5010304@intel.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2799 Lines: 83 On Wed, Jul 22, 2015 at 01:38:48PM +0800, Pan Xinhui wrote: > From: Pan Xinhui > > It's more reasonable to unlock memtype_lock right after > rbt_memtype_check_insert. memtype_lock protects all data stored in > rb-tree from multiple access. It's not cool to call kfree, pr_info, etc > with this lock held. So move spin_unlock a little ahead. > > If *new* succeed to be stored into the rb-tree, we might hit panic. > Because we access *new* in dprintk "cattr_name(new->type)". Data stored > in the rb-tree might be freed at any possbile time. It's abviously wrong > to access such data without lock held. As new->type might be changed in > rbt_memtype_check_insert, so save new->type to actual_type, then use > actual_type in dprintk. > > Signed-off-by: Pan Xinhui > --- > change from v2: > update comments. > change from V1: > fix an access of *new* without memtype_lock held. > --- > arch/x86/mm/pat.c | 15 +++++++++------ > 1 file changed, 9 insertions(+), 6 deletions(-) This patch still doesn't update the comments over memtype_lock. > > diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c > index 188e3e0..894a096 100644 > --- a/arch/x86/mm/pat.c > +++ b/arch/x86/mm/pat.c > @@ -538,22 +538,25 @@ int reserve_memtype(u64 start, u64 end, enum page_cache_mode req_type, > new->type = actual_type; > > spin_lock(&memtype_lock); > - > err = rbt_memtype_check_insert(new, new_type); > + /* > + * new->type might be changed in rbt_memtype_check_insert. > + * So save new->type to actual_type as dprintk uses it. > + * We are not allowed to touch new after unlocking memtype_lock. > + */ > + actual_type = new->type; We already assign actual_type to new->type above. I think the dprintk needs actual_type and not what new->type has been changed to as that is in new_type. > + spin_unlock(&memtype_lock); > + > if (err) { > pr_info("x86/PAT: reserve_memtype failed [mem %#010Lx-%#010Lx], track %s, req %s\n", > start, end - 1, > cattr_name(new->type), cattr_name(req_type)); > kfree(new); > - spin_unlock(&memtype_lock); > - > return err; > } > > - spin_unlock(&memtype_lock); > - > dprintk("reserve_memtype added [mem %#010Lx-%#010Lx], track %s, req %s, ret %s\n", > - start, end - 1, cattr_name(new->type), cattr_name(req_type), > + start, end - 1, cattr_name(actual_type), cattr_name(req_type), > new_type ? cattr_name(*new_type) : "-"); > > return err; > -- > 1.9.1 -- Regards/Gruss, Boris. ECO tip #101: Trim your mails when you reply. -- -- 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/