From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 44AACC35280 for ; Wed, 2 Oct 2019 12:32:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 18A7121A4C for ; Wed, 2 Oct 2019 12:32:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570019579; bh=IvBhPwmzCuDK5a0zT9AP+G+1dk9/67FyCXMdsLkEDDo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=TWER9kyMGKuvqEknl2XxTAFHxDupR36m+pP6MbCrtG+Y2YF8XKCqWCV4U5wQWqSgJ p39+K4+trg7v7ltwUjlwIhytNEYPZzoRCoWzTlO0wehXVewxEVxA1WfOpHZmp0eNBn YgWel+c+uOVlcHNkh9RZLI7XV3Ox+0cauwAEIRJg= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725935AbfJBMc6 (ORCPT ); Wed, 2 Oct 2019 08:32:58 -0400 Received: from mail.kernel.org ([198.145.29.99]:34230 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725848AbfJBMc6 (ORCPT ); Wed, 2 Oct 2019 08:32:58 -0400 Received: from localhost (unknown [193.47.165.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 959D82133F; Wed, 2 Oct 2019 12:32:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570019577; bh=IvBhPwmzCuDK5a0zT9AP+G+1dk9/67FyCXMdsLkEDDo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K0V40a5Iz9oygb5GWSkrECOdpe5xUlknPAIm/SsT2I1KljUP68yLouyESuylYCmIP p5rfm9UYu8B6kJR8CO0P1nyReLyLD63zkwqhGxvMK7Jj55Lwn8gVeDBJ9ugTUjZLXw jfnmDLc0rUz7TWmyEXx5DhXD2zfFEV0zB2Z/K04o= From: Leon Romanovsky To: Doug Ledford , Jason Gunthorpe Cc: Leon Romanovsky , RDMA mailing list Subject: [PATCH rdma-next 2/2] RDMA/core: Check that process is still alive before sending it to the users Date: Wed, 2 Oct 2019 15:32:45 +0300 Message-Id: <20191002123245.18153-3-leon@kernel.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191002123245.18153-1-leon@kernel.org> References: <20191002123245.18153-1-leon@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org From: Leon Romanovsky The PID information can disappear asynchronically because task can be killed and moved to zombie state. In such case, PID will be zero in similar way to the kernel tasks. Recognize such situation where we are asking to return orphaned object and simply skip filling PID attribute. As part of this change, document the same scenario in counter.c code. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/counters.c | 14 ++++++++++++-- drivers/infiniband/core/nldev.c | 31 ++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/drivers/infiniband/core/counters.c b/drivers/infiniband/core/counters.c index 12ba2685abcf..47c551a0bcb0 100644 --- a/drivers/infiniband/core/counters.c +++ b/drivers/infiniband/core/counters.c @@ -149,8 +149,18 @@ static bool auto_mode_match(struct ib_qp *qp, struct rdma_counter *counter, struct auto_mode_param *param = &counter->mode.param; bool match = true; - /* Ensure that counter belongs to the right PID */ - if (task_pid_nr(counter->res.task) != task_pid_nr(qp->res.task)) + /* + * Ensure that counter belongs to the right PID. + * This operation can race with user space which kills + * the process and leaves QP and counters orphans. + * + * It is not a big deal because exitted task will leave both + * QP and counter in the same bucket of zombie process. Just ensure + * that process is still alive before procedding. + * + */ + if (task_pid_nr(counter->res.task) != task_pid_nr(qp->res.task) || + !task_pid_nr(qp->res.task)) return false; if (auto_mask & RDMA_COUNTER_MASK_QP_TYPE) diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c index 71bc08510064..c6fe0c52f6dc 100644 --- a/drivers/infiniband/core/nldev.c +++ b/drivers/infiniband/core/nldev.c @@ -399,20 +399,35 @@ static int fill_res_info(struct sk_buff *msg, struct ib_device *device) static int fill_res_name_pid(struct sk_buff *msg, struct rdma_restrack_entry *res) { + int err = 0; + pid_t pid; + /* * For user resources, user is should read /proc/PID/comm to get the * name of the task file. */ if (rdma_is_kernel_res(res)) { - if (nla_put_string(msg, RDMA_NLDEV_ATTR_RES_KERN_NAME, - res->kern_name)) - return -EMSGSIZE; - } else { - if (nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_PID, - task_pid_vnr(res->task))) - return -EMSGSIZE; + err = nla_put_string(msg, RDMA_NLDEV_ATTR_RES_KERN_NAME, + res->kern_name); + goto out; } - return 0; + + pid = task_pid_vnr(res->task); + /* + * PID == 0 returns in two scenarios: + * 1. It is kernel task, but because we checked above, it won't be possible. + * 2. Task is dead and in zombie state. There is no need to print PID anymore. + */ + if (pid) + /* + * This part is racy, task can be killed and PID will be zero right + * here but it is ok, next query won't return PID. We don't promise + * real-time reflection of SW objects. + */ + err = nla_put_u32(msg, RDMA_NLDEV_ATTR_RES_PID, pid); + +out: + return err ? -EMSGSIZE : 0; } static bool fill_res_entry(struct ib_device *dev, struct sk_buff *msg, -- 2.20.1