From 77305054ef96576b24605b3c303570cd2e34b07b Mon Sep 17 00:00:00 2001 From: Whi copybara merger Date: Mon, 5 Jun 2023 18:11:15 +0000 Subject: [Copybara Auto Merge] Merge branch pro into android13-gs-pixel-5.10-udc edgetpu: hold mmap_lock around pin_user_pages mmap_lock must be held around call to pin_user_pages to protect against concurrent address space modifications. Bug: 283787360 edgetpu: usage-stats remove unnecessary out of memory log edgetpu: return -EIO for operations on device with bad firmware state GitOrigin-RevId: 2bde5e1f63d19540e003164600bd173b644dec57 Change-Id: I8ea1e112b54f76b9199d991501643aaf57985781 --- drivers/edgetpu/edgetpu-core.c | 5 ++--- drivers/edgetpu/edgetpu-device-group.c | 10 ++++++++++ drivers/edgetpu/edgetpu-kci.c | 15 +++++++++------ drivers/edgetpu/edgetpu-usage-stats.c | 5 +---- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/drivers/edgetpu/edgetpu-core.c b/drivers/edgetpu/edgetpu-core.c index 6973bdb..db806bf 100644 --- a/drivers/edgetpu/edgetpu-core.c +++ b/drivers/edgetpu/edgetpu-core.c @@ -380,11 +380,10 @@ int edgetpu_get_state_errno_locked(struct edgetpu_dev *etdev) { switch (etdev->state) { case ETDEV_STATE_BAD: - return -ENODEV; + case ETDEV_STATE_NOFW: + return -EIO; case ETDEV_STATE_FWLOADING: return -EAGAIN; - case ETDEV_STATE_NOFW: - return -EINVAL; default: break; } diff --git a/drivers/edgetpu/edgetpu-device-group.c b/drivers/edgetpu/edgetpu-device-group.c index 9b85679..c410ebc 100644 --- a/drivers/edgetpu/edgetpu-device-group.c +++ b/drivers/edgetpu/edgetpu-device-group.c @@ -1258,8 +1258,18 @@ static struct page **edgetpu_pin_user_pages(struct edgetpu_device_group *group, kvfree(pages); return ERR_PTR(-ENOMEM); } +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0) + down_read(¤t->mm->mmap_sem); +#else + mmap_read_lock(current->mm); +#endif ret = pin_user_pages(host_addr & PAGE_MASK, num_pages, foll_flags, pages, vmas); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0) + up_read(¤t->mm->mmap_sem); +#else + mmap_read_unlock(current->mm); +#endif kvfree(vmas); if (ret < 0) { etdev_dbg(etdev, "pin_user_pages failed %u:%pK-%u: %d", diff --git a/drivers/edgetpu/edgetpu-kci.c b/drivers/edgetpu/edgetpu-kci.c index 313e9f8..b3c3d4c 100644 --- a/drivers/edgetpu/edgetpu-kci.c +++ b/drivers/edgetpu/edgetpu-kci.c @@ -43,11 +43,14 @@ #endif /* A macro for KCIs to leave early when the device state is known to be bad. */ -#define RETURN_ERRNO_IF_ETDEV_NOT_GOOD(kci) \ +#define RETURN_ERRNO_IF_ETDEV_NOT_GOOD(kci, opstring) \ do { \ int ret = edgetpu_get_state_errno_locked(kci->mailbox->etdev); \ - if (ret) \ + if (ret) { \ + etdev_err(kci->mailbox->etdev, "%s failed: device state %u (%d)", \ + opstring, kci->mailbox->etdev->state, ret); \ return ret; \ + } \ } while (0) static inline u32 edgetpu_kci_queue_element_size(enum mailbox_queue_type type) @@ -805,7 +808,7 @@ int edgetpu_kci_join_group(struct edgetpu_kci *kci, u8 n_dies, u8 vid) if (!kci) return -ENODEV; - RETURN_ERRNO_IF_ETDEV_NOT_GOOD(kci); + RETURN_ERRNO_IF_ETDEV_NOT_GOOD(kci, "join group"); return edgetpu_kci_send_cmd_with_data(kci, &cmd, &detail, sizeof(detail)); } @@ -817,7 +820,7 @@ int edgetpu_kci_leave_group(struct edgetpu_kci *kci) if (!kci) return -ENODEV; - RETURN_ERRNO_IF_ETDEV_NOT_GOOD(kci); + RETURN_ERRNO_IF_ETDEV_NOT_GOOD(kci, "leave group"); return edgetpu_kci_send_cmd(kci, &cmd); } @@ -1046,7 +1049,7 @@ int edgetpu_kci_open_device(struct edgetpu_kci *kci, u32 mailbox_map, u32 client if (!kci) return -ENODEV; - RETURN_ERRNO_IF_ETDEV_NOT_GOOD(kci); + RETURN_ERRNO_IF_ETDEV_NOT_GOOD(kci, "open device"); if (vcid < 0) return edgetpu_kci_send_cmd(kci, &cmd); return edgetpu_kci_send_cmd_with_data(kci, &cmd, &detail, sizeof(detail)); @@ -1063,7 +1066,7 @@ int edgetpu_kci_close_device(struct edgetpu_kci *kci, u32 mailbox_map) if (!kci) return -ENODEV; - RETURN_ERRNO_IF_ETDEV_NOT_GOOD(kci); + RETURN_ERRNO_IF_ETDEV_NOT_GOOD(kci, "close device"); return edgetpu_kci_send_cmd(kci, &cmd); } diff --git a/drivers/edgetpu/edgetpu-usage-stats.c b/drivers/edgetpu/edgetpu-usage-stats.c index 9934ca6..ba9d673 100644 --- a/drivers/edgetpu/edgetpu-usage-stats.c +++ b/drivers/edgetpu/edgetpu-usage-stats.c @@ -959,11 +959,8 @@ void edgetpu_usage_stats_init(struct edgetpu_dev *etdev) ustats = devm_kzalloc(etdev->dev, sizeof(*etdev->usage_stats), GFP_KERNEL); - if (!ustats) { - etdev_warn(etdev, - "failed to allocate memory for usage stats\n"); + if (!ustats) return; - } hash_init(ustats->uid_hash_table); mutex_init(&ustats->usage_stats_lock); -- cgit v1.2.3