summaryrefslogtreecommitdiff
path: root/usr/src/uts/common
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2020-07-09 11:42:13 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2020-07-09 11:42:13 +0000
commit466fd238ca24f5d17cd0b74a70dfc36ab67a624b (patch)
tree6fadeb6f60d7720619c51da693dc4d571e0df7e3 /usr/src/uts/common
parentb97f5b09ef2e4af27e3cc4addd8abe5fc7c4d817 (diff)
parent4a663bac9c5f9f82a5f633bc9639bbee3c2317ff (diff)
downloadillumos-joyent-466fd238ca24f5d17cd0b74a70dfc36ab67a624b.tar.gz
[illumos-gate merge]
commit 4a663bac9c5f9f82a5f633bc9639bbee3c2317ff 12904 Update nvme health logpage and temp thresholds commit 480497bc2ff96b447dc09403a6c187a1593ac1ec 12934 sockfs rights test should close unneeded descriptors commit fdb2a7e9480266dfaa0b5aaa0e1237456552f332 12881 sparcv9: add __multi3 commit 7fc77f3f3f63424c569601711f173702dbfd5c45 12927 loader: move zfs_boot_args to bootargs.h commit 1c0fc4547783fdfd7365d5d483e2750915523d44 6089 The comment for svc_callout_find() should be improved commit 66373fa702508a0a41753138f0b10f985c7e058d 12902 epoll should nominally support EPOLLEXCLUSIVE commit 33f84ecfada5880d94e9bfc5af7954d41e5664d5 12924 blkdev needs to be better at handling attach failures
Diffstat (limited to 'usr/src/uts/common')
-rw-r--r--usr/src/uts/common/io/blkdev/blkdev.c49
-rw-r--r--usr/src/uts/common/io/nvme/nvme.c22
-rw-r--r--usr/src/uts/common/rpc/svc.c4
-rw-r--r--usr/src/uts/common/sys/epoll.h2
-rw-r--r--usr/src/uts/common/sys/nvme.h27
5 files changed, 82 insertions, 22 deletions
diff --git a/usr/src/uts/common/io/blkdev/blkdev.c b/usr/src/uts/common/io/blkdev/blkdev.c
index 07fa32da1d..0718aebf7b 100644
--- a/usr/src/uts/common/io/blkdev/blkdev.c
+++ b/usr/src/uts/common/io/blkdev/blkdev.c
@@ -25,6 +25,7 @@
* Copyright 2016 Nexenta Systems, Inc. All rights reserved.
* Copyright 2017 The MathWorks, Inc. All rights reserved.
* Copyright 2019 Western Digital Corporation.
+ * Copyright 2020 Joyent, Inc.
*/
#include <sys/types.h>
@@ -228,8 +229,10 @@ struct bd_queue {
static void bd_prop_update_inqstring(dev_info_t *, char *, char *, size_t);
static void bd_create_inquiry_props(dev_info_t *, bd_drive_t *);
static void bd_create_errstats(bd_t *, int, bd_drive_t *);
+static void bd_destroy_errstats(bd_t *);
static void bd_errstats_setstr(kstat_named_t *, char *, size_t, char *);
static void bd_init_errstats(bd_t *, bd_drive_t *);
+static void bd_fini_errstats(bd_t *);
static int bd_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
static int bd_attach(dev_info_t *, ddi_attach_cmd_t);
@@ -490,6 +493,21 @@ bd_create_errstats(bd_t *bd, int inst, bd_drive_t *drive)
bd->d_errstats->ks_private = bd;
kstat_install(bd->d_errstats);
+ bd_init_errstats(bd, drive);
+}
+
+static void
+bd_destroy_errstats(bd_t *bd)
+{
+ if (bd->d_errstats != NULL) {
+ bd_fini_errstats(bd);
+ kstat_delete(bd->d_errstats);
+ bd->d_errstats = NULL;
+ } else {
+ kmem_free(bd->d_kerr, sizeof (struct bd_errstats));
+ bd->d_kerr = NULL;
+ mutex_destroy(&bd->d_errmutex);
+ }
}
static void
@@ -707,7 +725,6 @@ bd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
bd_create_inquiry_props(dip, &drive);
bd_create_errstats(bd, inst, &drive);
- bd_init_errstats(bd, &drive);
bd_update_state(bd);
bd->d_queues = kmem_alloc(sizeof (*bd->d_queues) * bd->d_qcount,
@@ -732,19 +749,23 @@ bd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
drive.d_lun >= 0 ? DDI_NT_BLOCK_CHAN : DDI_NT_BLOCK,
CMLB_FAKE_LABEL_ONE_PARTITION, bd->d_cmlbh, 0);
if (rv != 0) {
- cmlb_free_handle(&bd->d_cmlbh);
- kmem_cache_destroy(bd->d_cache);
- mutex_destroy(&bd->d_ksmutex);
- mutex_destroy(&bd->d_ocmutex);
- mutex_destroy(&bd->d_statemutex);
- cv_destroy(&bd->d_statecv);
bd_queues_free(bd);
+ bd_destroy_errstats(bd);
+ cmlb_free_handle(&bd->d_cmlbh);
+
if (bd->d_ksp != NULL) {
kstat_delete(bd->d_ksp);
bd->d_ksp = NULL;
} else {
kmem_free(bd->d_kiop, sizeof (kstat_io_t));
+ bd->d_kiop = NULL;
}
+
+ kmem_cache_destroy(bd->d_cache);
+ cv_destroy(&bd->d_statecv);
+ mutex_destroy(&bd->d_statemutex);
+ mutex_destroy(&bd->d_ocmutex);
+ mutex_destroy(&bd->d_ksmutex);
ddi_soft_state_free(bd_state, inst);
return (DDI_FAILURE);
}
@@ -797,6 +818,7 @@ bd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
default:
return (DDI_FAILURE);
}
+
if (bd->d_ksp != NULL) {
kstat_delete(bd->d_ksp);
bd->d_ksp = NULL;
@@ -804,15 +826,7 @@ bd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
kmem_free(bd->d_kiop, sizeof (kstat_io_t));
}
- if (bd->d_errstats != NULL) {
- bd_fini_errstats(bd);
- kstat_delete(bd->d_errstats);
- bd->d_errstats = NULL;
- } else {
- kmem_free(bd->d_kerr, sizeof (struct bd_errstats));
- mutex_destroy(&bd->d_errmutex);
- }
-
+ bd_destroy_errstats(bd);
cmlb_detach(bd->d_cmlbh, 0);
cmlb_free_handle(&bd->d_cmlbh);
if (bd->d_devid)
@@ -2052,11 +2066,12 @@ bd_attach_handle(dev_info_t *dip, bd_handle_t hdl)
ddi_set_parent_data(child, hdl);
hdl->h_child = child;
- if (ndi_devi_online(child, 0) == NDI_FAILURE) {
+ if (ndi_devi_online(child, 0) != NDI_SUCCESS) {
cmn_err(CE_WARN, "%s%d: failed bringing node %s@%s online",
ddi_driver_name(dip), ddi_get_instance(dip),
hdl->h_name, hdl->h_addr);
(void) ndi_devi_free(child);
+ hdl->h_child = NULL;
return (DDI_FAILURE);
}
diff --git a/usr/src/uts/common/io/nvme/nvme.c b/usr/src/uts/common/io/nvme/nvme.c
index 317926948b..b06866e9e7 100644
--- a/usr/src/uts/common/io/nvme/nvme.c
+++ b/usr/src/uts/common/io/nvme/nvme.c
@@ -4339,7 +4339,6 @@ nvme_ioctl_get_features(nvme_t *nvme, int nsid, nvme_ioctl_t *nioc,
switch (feature) {
case NVME_FEAT_ARBITRATION:
case NVME_FEAT_POWER_MGMT:
- case NVME_FEAT_TEMPERATURE:
case NVME_FEAT_ERROR:
case NVME_FEAT_NQUEUES:
case NVME_FEAT_INTR_COAL:
@@ -4350,6 +4349,27 @@ nvme_ioctl_get_features(nvme_t *nvme, int nsid, nvme_ioctl_t *nioc,
return (EINVAL);
break;
+ case NVME_FEAT_TEMPERATURE:
+ if (nsid != 0)
+ return (EINVAL);
+ res = nioc->n_arg & 0xffffffffUL;
+ if (NVME_VERSION_ATLEAST(&nvme->n_version, 1, 2)) {
+ nvme_temp_threshold_t tt;
+
+ tt.r = res;
+ if (tt.b.tt_thsel != NVME_TEMP_THRESH_OVER &&
+ tt.b.tt_thsel != NVME_TEMP_THRESH_UNDER) {
+ return (EINVAL);
+ }
+
+ if (tt.b.tt_tmpsel > NVME_TEMP_THRESH_MAX_SENSOR) {
+ return (EINVAL);
+ }
+ } else if (res != 0) {
+ return (EINVAL);
+ }
+ break;
+
case NVME_FEAT_INTR_VECT:
if (nsid != 0)
return (EINVAL);
diff --git a/usr/src/uts/common/rpc/svc.c b/usr/src/uts/common/rpc/svc.c
index 9ea26934b5..12cd548af3 100644
--- a/usr/src/uts/common/rpc/svc.c
+++ b/usr/src/uts/common/rpc/svc.c
@@ -1026,8 +1026,8 @@ svc_xprt_cleanup(SVCMASTERXPRT *xprt, bool_t detached)
* table for an entry with a matching RPC program number `prog'
* and a version range that covers `vers'.
* - if it finds a matching entry it returns pointer to the dispatch routine
- * - otherwise it returns NULL and, if `minp' or `maxp' are not NULL,
- * fills them with, respectively, lowest version and highest version
+ * - otherwise it returns NULL and fills both vers_min and vers_max
+ * with, respectively, lowest version and highest version
* supported for the program `prog'
*/
static SVC_DISPATCH *
diff --git a/usr/src/uts/common/sys/epoll.h b/usr/src/uts/common/sys/epoll.h
index f2e4b90ab7..3b38d9f629 100644
--- a/usr/src/uts/common/sys/epoll.h
+++ b/usr/src/uts/common/sys/epoll.h
@@ -11,6 +11,7 @@
/*
* Copyright (c) 2014, Joyent, Inc. All rights reserved.
+ * Copyright 2020 Oxide Computer Company
*/
#ifndef _SYS_EPOLL_H
@@ -60,6 +61,7 @@ typedef struct epoll_event {
#define EPOLLHUP 0x0010
#define EPOLLRDHUP 0x2000
+#define EPOLLEXCLUSIVE (1UL << 28) /* sets exclusive wake-up mode */
#define EPOLLWAKEUP (1UL << 29) /* no meaning; silently ignored */
#define EPOLLONESHOT (1UL << 30) /* translated to POLLONESHOT */
#define EPOLLET (1UL << 31) /* translated to POLLET */
diff --git a/usr/src/uts/common/sys/nvme.h b/usr/src/uts/common/sys/nvme.h
index 9a0d926dc5..1d54b05f21 100644
--- a/usr/src/uts/common/sys/nvme.h
+++ b/usr/src/uts/common/sys/nvme.h
@@ -436,7 +436,23 @@ typedef struct {
nvme_uint128_t hl_unsafe_shutdn; /* Unsafe Shutdowns */
nvme_uint128_t hl_media_errors; /* Media Errors */
nvme_uint128_t hl_errors_logged; /* Number of errors logged */
- uint8_t hl_rsvd2[512 - 192];
+ /* Added in NVMe 1.2 */
+ uint32_t hl_warn_temp_time; /* Warning Composite Temp Time */
+ uint32_t hl_crit_temp_time; /* Critical Composite Temp Time */
+ uint16_t hl_temp_sensor_1; /* Temperature Sensor 1 */
+ uint16_t hl_temp_sensor_2; /* Temperature Sensor 2 */
+ uint16_t hl_temp_sensor_3; /* Temperature Sensor 3 */
+ uint16_t hl_temp_sensor_4; /* Temperature Sensor 4 */
+ uint16_t hl_temp_sensor_5; /* Temperature Sensor 5 */
+ uint16_t hl_temp_sensor_6; /* Temperature Sensor 6 */
+ uint16_t hl_temp_sensor_7; /* Temperature Sensor 7 */
+ uint16_t hl_temp_sensor_8; /* Temperature Sensor 8 */
+ /* Added in NVMe 1.3 */
+ uint32_t hl_tmtemp_1_tc; /* Thermal Mgmt Temp 1 Transition # */
+ uint32_t hl_tmtemp_2_tc; /* Thermal Mgmt Temp 1 Transition # */
+ uint32_t hl_tmtemp_1_time; /* Time in Thermal Mgmt Temp 1 */
+ uint32_t hl_tmtemp_2_time; /* Time in Thermal Mgmt Temp 2 */
+ uint8_t hl_rsvd2[512 - 232];
} nvme_health_log_t;
/*
@@ -551,11 +567,18 @@ typedef struct {
typedef union {
struct {
uint16_t tt_tmpth; /* Temperature Threshold */
- uint16_t tt_rsvd;
+ uint16_t tt_tmpsel:4; /* Temperature Select */
+ uint16_t tt_thsel:2; /* Temperature Type */
+ uint16_t tt_resv:10;
} b;
uint32_t r;
} nvme_temp_threshold_t;
+#define NVME_TEMP_THRESH_MAX_SENSOR 8
+#define NVME_TEMP_THRESH_ALL 0xf
+#define NVME_TEMP_THRESH_OVER 0x00
+#define NVME_TEMP_THRESH_UNDER 0x01
+
/* Error Recovery Feature */
typedef union {
struct {