Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp3519804img; Mon, 25 Mar 2019 11:58:43 -0700 (PDT) X-Google-Smtp-Source: APXvYqwMMw2M1USLQ3RiKrW8MaA80VLr00oC7PCd8VH0GPmKt5qNuihzmV0ROrN1RBvhB4xdsHub X-Received: by 2002:a63:3f8b:: with SMTP id m133mr24441396pga.91.1553540323903; Mon, 25 Mar 2019 11:58:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553540323; cv=none; d=google.com; s=arc-20160816; b=vi5cp7SbntxqeogpExuQ/jzuMqPMNmzfq2ILdz+9NPtuhdIIMH4dnvh8l4hCrrlM3Z zdiMSriyYVUg5aNP69juiZ/8wCwACmZA4BgnHax3xwUnJGC8y7doBib7x0zuqFUbPtp1 1x/5th0j1DIL6XT2xSHYpbPlm4K+xquWLgXm3PSnpAYDZtmlyrVlEnN34RB3J2/hwLYa gDxDiqz7Epcff4YknM3Rhe6BUIZZMN4n5C+YSZCLMTi4XE/xdjWSuAchRuIplpi1orNk 8C5h0r9ASImfIrHYDm6ZkLO/r+ru//01921nXyTUT2ZypTLGVBHXAiROXDHG4NByK3QT EJoQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=neIOP1aM1ltwCw3PcbDK4f1c+iSCYsKZkeuI3K2FKX8=; b=F+olYiSooOF+IBfzc8i+xNT9sVYfnzjzg619GJ0pDKk9bhmewRA54sMJStrV/CNR02 kBJq36OWvoauN+qSuAJim7YVVyXBlvfqUfYeQJTNWBfgER5DAmh3SQbsa0BggmQV+ub0 ZC6LmKULONKTZ8N/QvAIQOlwcW5wx7skRkt9Z4ZMufXyK4unfSgDjZ1YsQBexuo1ea75 EzXVxs2xJ5h4guelaQDd687iqkH9MHuiuXQLr9Rxo70hVRrvSprJNPN6MgvYHkL24M4o 3Neq9kDu4TQR1m5nNwXOMvuY2tSbodYcmEFy0kfZ3NFSLIxWjmmkJHNyHMJ9ov3FWqVl A7TA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=n9g0tgMy; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 3si15689147plx.386.2019.03.25.11.58.28; Mon, 25 Mar 2019 11:58:43 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=n9g0tgMy; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729963AbfCYS5e (ORCPT + 99 others); Mon, 25 Mar 2019 14:57:34 -0400 Received: from mail-ua1-f66.google.com ([209.85.222.66]:37223 "EHLO mail-ua1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729072AbfCYS5d (ORCPT ); Mon, 25 Mar 2019 14:57:33 -0400 Received: by mail-ua1-f66.google.com with SMTP id x1so3391802uaj.4 for ; Mon, 25 Mar 2019 11:57:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=neIOP1aM1ltwCw3PcbDK4f1c+iSCYsKZkeuI3K2FKX8=; b=n9g0tgMyYb5SHd9a+OJnMQcGkyXjoJUA1nTmEyAtl202TUSpGirkFg9opm5GJAI5yt 9YIvDtWLJ8f3W7v0ELATASt6BDXK6G6KkHAwHIrRUcvUQPpN393oXC/5QnfReXeTkqY7 8OYmotafC4Lq+gelcDt5MqmgWTSWHH1/U+kAHp35WD+FR2rDIKmtXEteDB09xyIkPQXt iRTgdB2KHdM3hGGYdXslrnz00cwIJHCdgzFo4FGW1dLve8b9uE7VpBaMk+exjaxwKE67 YXhENqJrhyT0jMx548Wg1OuFvWMhkqsAz/vRgQnKEg4DCLXmhZHdvklpdy7J+m1TA6yN 1IoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=neIOP1aM1ltwCw3PcbDK4f1c+iSCYsKZkeuI3K2FKX8=; b=SOHlGJ1mEYJiy2Opo39VHujaGdRDrE7k8wDfb1G02R2ygbIe/S5DnyzPR7pyUjSd/M 4uXum3lgxbbLU03i3E0Zc7JHTWk4/R4BWOuOFI+WDtDss8U6FXSUR3EXQkHNJjk+audp fuzSWxxx7J2tG6obfpUfSrUsKweBwXCft29EMd7QatxcAdHrFH+t3FmTAEzV3uA33qRS owNfjoFwgTwXE9uV7WhdMQUyAlb1Vhj6H0j6aBeI0BcSbImhGOSXGmJ5qGTV3HERh1Bs LpeMzGyM7jrZGNmQ0zP0ENZ8KIu4E8fj4tr+NfPo+il3mFyeh6n0nlv63OCTP+KeYNoV uLDg== X-Gm-Message-State: APjAAAXpcj4o3+/dvUkaeeOvh5mJD+akW2n00jfdGL0AJgzRxN2RpfQh qJRsVHAVeuvv1mdmxTeJwks8rmHqpBcIO7mfU9vFCQ== X-Received: by 2002:ab0:72c2:: with SMTP id g2mr15056633uap.112.1553540252082; Mon, 25 Mar 2019 11:57:32 -0700 (PDT) MIME-Version: 1.0 References: <20190325162052.28987-1-christian@brauner.io> <20190325173614.GB25975@google.com> In-Reply-To: From: Daniel Colascione Date: Mon, 25 Mar 2019 11:57:20 -0700 Message-ID: Subject: Re: [PATCH 0/4] pid: add pidctl() To: Jonathan Kowalski Cc: Joel Fernandes , Christian Brauner , Jann Horn , Konstantin Khlebnikov , Andy Lutomirski , David Howells , "Serge E. Hallyn" , "Eric W. Biederman" , Linux API , linux-kernel , Arnd Bergmann , Kees Cook , Alexey Dobriyan , Thomas Gleixner , Michael Kerrisk-manpages , "Dmitry V. Levin" , Andrew Morton , Oleg Nesterov , Nagarathnam Muthusamy , Aleksa Sarai , Al Viro Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Mar 25, 2019 at 11:19 AM Jonathan Kowalski wrote: > > On Mon, Mar 25, 2019 at 5:53 PM Daniel Colascione wrote: > > > > [..snip..] > > > > I don't like the idea of having one kind of pollfd be pollable and > > another not. Such an interface would be confusing for users. If, as > > you suggest below, we instead make the procfs-less FD the only thing > > we call a "pidfd", then this proposal becomes less confusing and more > > viable. > > That's certainly on the table, we remove the ability to open > /proc/ and use the dir fd with pidfd_send_signal. I'm in favor of > this. > > > > But.. one thing we could do for Daniel usecase is if a /proc/pid directory fd > > > can be translated into a "pidfd" using another syscall or even a node, like > > > /proc/pid/handle or something. I think this is what Christian suggested in > > > the previous threads. > > > > /proc/pid/handle, if I understand correctly, "translates" a > > procfs-based pidfd to a non-pidfd one. The needed interface would have > > to perform the opposite translation, providing a procfs directory for > > a given pidfd. > > > > > And also for the translation the other way, add a syscall or modify > > > translate_fd or something, to covert a anon_inode pidfd into a /proc/pid > > > directory fd. Then the user is welcomed to do openat(2) on _that_ directory fd. > > > Then we modify pidfd_send_signal to only send signals to pure pidfd fds, not > > > to /proc/pid directory fds. > > > > This approach would work, but there's one subtlety to take into > > account: which procfs? You'd want to take, as inputs, 1) the procfs > > root you want, and 2) the pidfd, this way you could return to the user > > a directory FD in the right procfs. > > > > I don't think metadata access is in the scope of such a pidfd itself. It should be possible to write a race-free pkill(1) using pidfds. Without metadata access tied to the pidfd somehow, that can't be done. > > > Should we work on patches for these? Please let us know if this idea makes > > > sense and thanks a lot for adding us to the review as well. > > > > I would strongly prefer that we not merge pidctl (or whatever it is) > > without a story for metadata access, be it your suggestion or > > something else. > > IMO, this is out of scope for a process handle. Hence, the need for > metadata access musn't stall it as is. On the contrary, rather than metadata being out of scope, metadata access is essential. Given a file handle (an FD), you can learn about the file backing that handle by using fstat(2). Given a socket handle (a socket FD), you can learn about the socket with getsockopt(2) and ioctl(2). It would be strange not to be able, similarly, to learn things about a process given a handle (a pidfd) to that process. I want process handles to be "boring" in that they let users query and manipulate processes mostly like they manipulate other resources. > If you really need this, the pid this pidfd is mapped to can be > exposed through fdinfo (which is perfectly fine for your case as you > use /proc anyway). This means you can reliably determine if you're > opening it for the same pid (and it hasn't been recycled) because this > pidfd will be pollable for state change (in the future). Exposing it > through fdinfo isn't a problem, pid ns is bound to the process during > its lifetime, it's a process creation time property, so the value > isn't going to change anyway. So you can do all metadata access you > want subsequently. Thanks for the proposal. I'm a bit confused. Are you suggesting that we report the numeric FD in fdinfo? Are you saying it should work basically like this? int get_oom_score_adj(int pidfd) { unique_fd fdinfo_fd = open(fmt("/proc/self/fdinfo/%d", pidfd)); string fdinfo = read_all(fdinfo_fd); numeric_pid = parse_fdinfo_for_line("pid"); unique_fd procdir_fd = open(fmt("/proc/%d", numeric_pid), O_DIRECTORY); if(!is_pidfd_alive(pidfd)) { return -1; /* process died */ } /* LIVENESS CHECK */ // We know the process named by pidfd was called NUMERIC_PID // in our namespace (because fdinfo told us) and we know that the named process // was alive after we successfully opened its /proc/pid directory, therefore, // PROCDIR_FD and PIDFD must refer to the same underlying process. unique_fd oom_adj_score_fd = openat(procdir_fd, "oom_score_adj"); return parse_int(read_all(oom_adj_score_fd)); } While this interface functions correctly, I have two concerns: 1) the number of system calls necessary is very large -- by my count, starting with the pifd, we need six, not counting the follow-on close(2) calls (which would bring the total to nine[1]), and 2) it's "fail unsafe": IMHO, most users in practice will skip the line marked "LIVENESS CHECK", and as a result, their code will appear to work but contain subtle race conditions. An explicit interface to translate from a (PIDFD, PROCFS_ROOT) tuple to a /proc/pid directory file descriptor would be both more efficient and fail-safe. [1] as a separate matter, it'd be nice to have a batch version of close(2).