From owner-freebsd-current@freebsd.org Tue Aug 4 14:38:16 2015 Return-Path: Delivered-To: freebsd-current@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 746DF9B2CEB for ; Tue, 4 Aug 2015 14:38:16 +0000 (UTC) (envelope-from rizzo.unipi@gmail.com) Received: from mail-la0-x22e.google.com (mail-la0-x22e.google.com [IPv6:2a00:1450:4010:c03::22e]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id F36F41E15 for ; Tue, 4 Aug 2015 14:38:15 +0000 (UTC) (envelope-from rizzo.unipi@gmail.com) Received: by labgo9 with SMTP id go9so8732027lab.3 for ; Tue, 04 Aug 2015 07:38:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:date:message-id:subject:from:to:cc:content-type; bh=gWH/TtVRiJB+nEQlF2vPLjXm6fbSx0o2wgo1jM55nYM=; b=wweRn9uFKy8aBB+JwfhkZitz5n9eMLyVbSINfJAYGgE/wn5WDa8xUnQ9OD/fIlPX6W 0s11vCDxslCFluXMkW9mMlTxxuQ02NE7SqTfgW2ZGAkxkOvKoBC27gz13YRZPEjecBOy ohFuJGHr6xzqEUpJcNxn4jgICwO6a5FUQyTcXvbbZoTyNIa/ypvXic0d04yddFvmm6fp 7k4DaW28fD0l//sacSuBCI9QkFElxCDIqQQMcxRrL+aOGTkza+Ez1R519kgZm60+Hbol f1AIHAl7qA50ALh7tCkAiogdeDWk+y9i4BQ9OYof4N/UiTUhFMmAvdVDuj3qRPdMC5uG iZlA== MIME-Version: 1.0 X-Received: by 10.112.220.7 with SMTP id ps7mr3845719lbc.72.1438699094056; Tue, 04 Aug 2015 07:38:14 -0700 (PDT) Sender: rizzo.unipi@gmail.com Received: by 10.114.80.133 with HTTP; Tue, 4 Aug 2015 07:38:14 -0700 (PDT) Date: Tue, 4 Aug 2015 16:38:14 +0200 X-Google-Sender-Auth: ZQu1S-V9ai0MrYLMdgvzALi04GY Message-ID: Subject: proper way to terminate a kthread when the parent process dies ? From: Luigi Rizzo To: freebsd-current Cc: Luigi Rizzo , Stefano Garzarella , Giuseppe Lettieri Content-Type: text/plain; charset=UTF-8 X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Aug 2015 14:38:16 -0000 Hi, we have a doubt on the proper way to terminate a kernel thread that has been associated to a user process U within a system call with kthread_add( .. , .., p, ... ) (p is the struct proc * of the calling process, U) When U terminates and goes into kern_exit.c :: exit1() the kernel thread sees the following conditions: P_SHOULDSTOP(td->td_proc) is TRUE td->td_flags has TDF_ASTPENDING | TDF_NEEDSUSPCHK set We are not sure what is the proper way to terminate our kernel thread, whose body is the following: while (must_run) { // someone will set must_run = 0 kthread_suspend_check(); // void work_or_short_tsleep(); // potentially se } kthread_exit(); We have seen different ways for the 1. if (P_SHOULDSTOP(td->td_proc) break; // kthread_exit() is called outside the loop 2. if (P_SHOULDSTOP(td->td_proc) thread_suspend_check(0); // which then terminates the thread // this is done in sys/rpc/svc.c We are a bit unsure whether calling the thread_*() function in a kthread is correct -- but there is an example in the kernel. Variants involve locking td->td_proc (but is it necessary ? The process won't go away until all child threads die), or checking the td_tdflags instead of the parent process' flags. So what is the correct way ? cheers luigi -- -----------------------------------------+------------------------------- Prof. Luigi RIZZO, rizzo@iet.unipi.it . Dip. di Ing. dell'Informazione http://www.iet.unipi.it/~luigi/ . Universita` di Pisa TEL +39-050-2217533 . via Diotisalvi 2 Mobile +39-338-6809875 . 56122 PISA (Italy) -----------------------------------------+-------------------------------