From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Tomer Tayar <ttayar@habana.ai>, Oded Gabbay <ogabbay@kernel.org>,
Sasha Levin <sashal@kernel.org>
Subject: [PATCH AUTOSEL 5.11 36/61] habanalabs: Disable file operations after device is removed
Date: Tue, 16 Mar 2021 20:55:10 -0400 [thread overview]
Message-ID: <20210317005536.724046-36-sashal@kernel.org> (raw)
In-Reply-To: <20210317005536.724046-1-sashal@kernel.org>
From: Tomer Tayar <ttayar@habana.ai>
[ Upstream commit ffd123fe839700366ea79b19ac3683bf56817372 ]
A device can be removed from the PCI subsystem while a process holds the
file descriptor opened.
In such a case, the driver attempts to kill the process, but as it is
still possible that the process will be alive after this step, the
device removal will complete, and we will end up with a process object
that points to a device object which was already released.
To prevent the usage of this released device object, disable the
following file operations for this process object, and avoid the cleanup
steps when the file descriptor is eventually closed.
The latter is just a best effort, as memory leak will occur.
Signed-off-by: Tomer Tayar <ttayar@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/misc/habanalabs/common/device.c | 40 ++++++++++++++++---
.../misc/habanalabs/common/habanalabs_ioctl.c | 12 ++++++
2 files changed, 46 insertions(+), 6 deletions(-)
diff --git a/drivers/misc/habanalabs/common/device.c b/drivers/misc/habanalabs/common/device.c
index 6785329eee27..82c0306a9210 100644
--- a/drivers/misc/habanalabs/common/device.c
+++ b/drivers/misc/habanalabs/common/device.c
@@ -93,12 +93,19 @@ void hl_hpriv_put(struct hl_fpriv *hpriv)
static int hl_device_release(struct inode *inode, struct file *filp)
{
struct hl_fpriv *hpriv = filp->private_data;
+ struct hl_device *hdev = hpriv->hdev;
+
+ filp->private_data = NULL;
+
+ if (!hdev) {
+ pr_crit("Closing FD after device was removed. Memory leak will occur and it is advised to reboot.\n");
+ put_pid(hpriv->taskpid);
+ return 0;
+ }
hl_cb_mgr_fini(hpriv->hdev, &hpriv->cb_mgr);
hl_ctx_mgr_fini(hpriv->hdev, &hpriv->ctx_mgr);
- filp->private_data = NULL;
-
hl_hpriv_put(hpriv);
return 0;
@@ -107,16 +114,19 @@ static int hl_device_release(struct inode *inode, struct file *filp)
static int hl_device_release_ctrl(struct inode *inode, struct file *filp)
{
struct hl_fpriv *hpriv = filp->private_data;
- struct hl_device *hdev;
+ struct hl_device *hdev = hpriv->hdev;
filp->private_data = NULL;
- hdev = hpriv->hdev;
+ if (!hdev) {
+ pr_err("Closing FD after device was removed\n");
+ goto out;
+ }
mutex_lock(&hdev->fpriv_list_lock);
list_del(&hpriv->dev_node);
mutex_unlock(&hdev->fpriv_list_lock);
-
+out:
put_pid(hpriv->taskpid);
kfree(hpriv);
@@ -136,8 +146,14 @@ static int hl_device_release_ctrl(struct inode *inode, struct file *filp)
static int hl_mmap(struct file *filp, struct vm_area_struct *vma)
{
struct hl_fpriv *hpriv = filp->private_data;
+ struct hl_device *hdev = hpriv->hdev;
unsigned long vm_pgoff;
+ if (!hdev) {
+ pr_err_ratelimited("Trying to mmap after device was removed! Please close FD\n");
+ return -ENODEV;
+ }
+
vm_pgoff = vma->vm_pgoff;
vma->vm_pgoff = HL_MMAP_OFFSET_VALUE_GET(vm_pgoff);
@@ -884,6 +900,16 @@ static int device_kill_open_processes(struct hl_device *hdev, u32 timeout)
return -EBUSY;
}
+static void device_disable_open_processes(struct hl_device *hdev)
+{
+ struct hl_fpriv *hpriv;
+
+ mutex_lock(&hdev->fpriv_list_lock);
+ list_for_each_entry(hpriv, &hdev->fpriv_list, dev_node)
+ hpriv->hdev = NULL;
+ mutex_unlock(&hdev->fpriv_list_lock);
+}
+
/*
* hl_device_reset - reset the device
*
@@ -1538,8 +1564,10 @@ void hl_device_fini(struct hl_device *hdev)
HL_PENDING_RESET_LONG_SEC);
rc = device_kill_open_processes(hdev, HL_PENDING_RESET_LONG_SEC);
- if (rc)
+ if (rc) {
dev_crit(hdev->dev, "Failed to kill all open processes\n");
+ device_disable_open_processes(hdev);
+ }
hl_cb_pool_fini(hdev);
diff --git a/drivers/misc/habanalabs/common/habanalabs_ioctl.c b/drivers/misc/habanalabs/common/habanalabs_ioctl.c
index d25892d61ec9..0805e1173d54 100644
--- a/drivers/misc/habanalabs/common/habanalabs_ioctl.c
+++ b/drivers/misc/habanalabs/common/habanalabs_ioctl.c
@@ -5,6 +5,8 @@
* All Rights Reserved.
*/
+#define pr_fmt(fmt) "habanalabs: " fmt
+
#include <uapi/misc/habanalabs.h>
#include "habanalabs.h"
@@ -667,6 +669,11 @@ long hl_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
const struct hl_ioctl_desc *ioctl = NULL;
unsigned int nr = _IOC_NR(cmd);
+ if (!hdev) {
+ pr_err_ratelimited("Sending ioctl after device was removed! Please close FD\n");
+ return -ENODEV;
+ }
+
if ((nr >= HL_COMMAND_START) && (nr < HL_COMMAND_END)) {
ioctl = &hl_ioctls[nr];
} else {
@@ -685,6 +692,11 @@ long hl_ioctl_control(struct file *filep, unsigned int cmd, unsigned long arg)
const struct hl_ioctl_desc *ioctl = NULL;
unsigned int nr = _IOC_NR(cmd);
+ if (!hdev) {
+ pr_err_ratelimited("Sending ioctl after device was removed! Please close FD\n");
+ return -ENODEV;
+ }
+
if (nr == _IOC_NR(HL_IOCTL_INFO)) {
ioctl = &hl_ioctls_control[nr];
} else {
--
2.30.1
next prev parent reply other threads:[~2021-03-17 0:57 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-17 0:54 [PATCH AUTOSEL 5.11 01/61] mt76: fix tx skb error handling in mt76_dma_tx_queue_skb Sasha Levin
2021-03-17 0:54 ` Sasha Levin
2021-03-17 0:54 ` Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 02/61] mt76: mt7915: only modify tx buffer list after allocating tx token id Sasha Levin
2021-03-17 0:54 ` Sasha Levin
2021-03-17 0:54 ` Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 03/61] net: stmmac: fix dma physical address of descriptor when display ring Sasha Levin
2021-03-17 0:54 ` Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 04/61] net: fec: ptp: avoid register access when ipg clock is disabled Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 05/61] powerpc/4xx: Fix build errors from mfdcr() Sasha Levin
2021-03-17 0:54 ` Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 06/61] atm: eni: dont release is never initialized Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 07/61] atm: lanai: dont run lanai_dev_close if not open Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 08/61] Revert "r8152: adjust the settings about MAC clock speed down for RTL8153" Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 09/61] ALSA: hda: ignore invalid NHLT table Sasha Levin
2021-03-17 0:54 ` Sasha Levin
2021-03-17 0:54 ` [Intel-wired-lan] [PATCH AUTOSEL 5.11 10/61] ixgbe: Fix memleak in ixgbe_configure_clsu32 Sasha Levin
2021-03-17 0:54 ` Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 11/61] scsi: ufs: ufs-qcom: Disable interrupt in reset path Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 12/61] blk-cgroup: Fix the recursive blkg rwstat Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 13/61] net: tehuti: fix error return code in bdx_probe() Sasha Levin
2021-03-17 0:54 ` [Intel-wired-lan] [PATCH AUTOSEL 5.11 14/61] net: intel: iavf: fix error return code of iavf_init_get_resources() Sasha Levin
2021-03-17 0:54 ` Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 15/61] sun/niu: fix wrong RXMAC_BC_FRM_CNT_COUNT count Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 16/61] gianfar: fix jumbo packets+napi+rx overrun crash Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 17/61] cifs: ask for more credit on async read/write code paths Sasha Levin
2021-03-17 0:54 ` [Cluster-devel] [PATCH AUTOSEL 5.11 18/61] gfs2: fix use-after-free in trans_drain Sasha Levin
2021-03-17 0:54 ` Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 19/61] cpufreq: blacklist Arm Vexpress platforms in cpufreq-dt-platdev Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 20/61] gpiolib: acpi: Add missing IRQF_ONESHOT Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 21/61] nfs: fix PNFS_FLEXFILE_LAYOUT Kconfig default Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 22/61] NFS: Correct size calculation for create reply length Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 23/61] net: hisilicon: hns: fix error return code of hns_nic_clear_all_rx_fetch() Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 24/61] net: wan: fix error return code of uhdlc_init() Sasha Levin
2021-03-17 0:54 ` Sasha Levin
2021-03-17 0:54 ` [PATCH AUTOSEL 5.11 25/61] net: davicom: Use platform_get_irq_optional() Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 26/61] net: enetc: set MAC RX FIFO to recommended value Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 27/61] atm: uPD98402: fix incorrect allocation Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 28/61] atm: idt77252: fix null-ptr-dereference Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 29/61] cifs: change noisy error message to FYI Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 30/61] irqchip/ingenic: Add support for the JZ4760 Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 31/61] kbuild: add image_name to no-sync-config-targets Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 32/61] kbuild: dummy-tools: fix inverted tests for gcc Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 33/61] umem: fix error return code in mm_pci_probe() Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 34/61] sparc64: Fix opcode filtering in handling of no fault loads Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 35/61] habanalabs: Call put_pid() when releasing control device Sasha Levin
2021-03-17 0:55 ` Sasha Levin [this message]
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 37/61] staging: rtl8192e: fix kconfig dependency on CRYPTO Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 38/61] u64_stats,lockdep: Fix u64_stats_init() vs lockdep Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 39/61] kselftest: arm64: Fix exit code of sve-ptrace Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 40/61] regulator: qcom-rpmh: Correct the pmic5_hfsmps515 buck Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 41/61] regulator: qcom-rpmh: Use correct buck for S1C regulator Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 42/61] block: Fix REQ_OP_ZONE_RESET_ALL handling Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 43/61] drm/amd/display: Enable pflip interrupt upon pipe enable Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 44/61] drm/amd/display: Revert dram_clock_change_latency for DCN2.1 Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 45/61] drm/amd/display: Enabled pipe harvesting in dcn30 Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 46/61] drm/amdgpu/display: Use wm_table.entries for dcn301 calculate_wm Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 47/61] drm/amdgpu: fb BO should be ttm_bo_type_device Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 48/61] drm/radeon: fix AGP dependency Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 49/61] nvme: simplify error logic in nvme_validate_ns() Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 50/61] nvme: add NVME_REQ_CANCELLED flag in nvme_cancel_request() Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 51/61] nvme-fc: set NVME_REQ_CANCELLED in nvme_fc_terminate_exchange() Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 52/61] nvme-fc: return NVME_SC_HOST_ABORTED_CMD when a command has been aborted Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 53/61] nvme-core: check ctrl css before setting up zns Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 54/61] nvme-rdma: Fix a use after free in nvmet_rdma_write_data_done Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 55/61] nvme-pci: add the DISABLE_WRITE_ZEROES quirk for a Samsung PM1725a Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 56/61] nfs: we don't support removing system.nfs4_acl Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 57/61] block: Suppress uevent for hidden device when removed Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 58/61] io_uring: cancel deferred requests in try_cancel Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 59/61] mm/fork: clear PASID for new mm Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 60/61] ia64: fix ia64_syscall_get_set_arguments() for break-based syscalls Sasha Levin
2021-03-17 0:55 ` Sasha Levin
2021-03-17 0:55 ` [PATCH AUTOSEL 5.11 61/61] ia64: fix ptrace(PTRACE_SYSCALL_INFO_EXIT) sign Sasha Levin
2021-03-17 0:55 ` Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210317005536.724046-36-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ogabbay@kernel.org \
--cc=stable@vger.kernel.org \
--cc=ttayar@habana.ai \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.