Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752602AbbFMSCI (ORCPT ); Sat, 13 Jun 2015 14:02:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40843 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750749AbbFMSCD (ORCPT ); Sat, 13 Jun 2015 14:02:03 -0400 Date: Sat, 13 Jun 2015 20:00:56 +0200 From: Oleg Nesterov To: Ingo Molnar Cc: Linus Torvalds , Waiman Long , Thomas Gleixner , Denys Vlasenko , Borislav Petkov , Andrew Morton , Andy Lutomirski , linux-mml@vger.kernel.org, Linux Kernel Mailing List , Brian Gerst , "H. Peter Anvin" , Peter Zijlstra Subject: Re: [PATCH 07/12] x86/virt/guest/xen: Remove use of pgd_list from the Xen guest code Message-ID: <20150613180056.GB29379@redhat.com> References: <1434031637-9091-1-git-send-email-mingo@kernel.org> <1434031637-9091-8-git-send-email-mingo@kernel.org> <20150612072302.GA7509@gmail.com> <20150612080425.GC8759@gmail.com> <20150612203832.GA18966@redhat.com> <20150613072635.GA30388@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150613072635.GA30388@gmail.com> User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1700 Lines: 60 On 06/13, Ingo Molnar wrote: > > * Oleg Nesterov wrote: > > > > So we could add tsk->mm_leader or so, > > > > No, no, please do not. Just do something like > > > > for_each_process(p) { > > > > for_each_thread(p, t) { > > So far that's what the for_each_process_thread() iterations I added do, right? Not really, > > if (t->mm) { > > do_something(t->mm); > > break; ^^^^^ Note this "break". We stop the inner loop right after we find a thread "t" with ->mm != NULL. In the likely case t == p (group leader) so the inner loop stops on the 1st iteration. > > But either way I don't understand what protects this ->mm. Perhaps this needs > > find_lock_task_mm(). > > That's indeed a bug: I'll add task_lock()/unlock() before looking at ->mm. Well, in this particular case we are safe. As Boris explained this is called from stop_machine(). But sync_global_pgds() is not safe. > find_lock_task_mm() is not needed IMHO: we have a stable reference to 't', as > task can only go away via RCU expiry, and all the iterations I added are (supposed > to) be RCU safe. Sure, you can do lock/unlock by hand. But find_lock_task_mm() can simplify the code because it checks subthreads if group_leader->mm == NULL. You can simply do rcu_read_lock(); for_each_process(p) { t = find_lock_task_mm(p); if (!t) continue; do_something(t->mm); task_unlock(t); } rcu_read_unlock(); Oleg. -- 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/