diff options
author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2020-07-09 11:42:13 +0000 |
---|---|---|
committer | Jerry Jelinek <jerry.jelinek@joyent.com> | 2020-07-09 11:42:13 +0000 |
commit | 466fd238ca24f5d17cd0b74a70dfc36ab67a624b (patch) | |
tree | 6fadeb6f60d7720619c51da693dc4d571e0df7e3 /usr/src/uts/common | |
parent | b97f5b09ef2e4af27e3cc4addd8abe5fc7c4d817 (diff) | |
parent | 4a663bac9c5f9f82a5f633bc9639bbee3c2317ff (diff) | |
download | illumos-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.c | 49 | ||||
-rw-r--r-- | usr/src/uts/common/io/nvme/nvme.c | 22 | ||||
-rw-r--r-- | usr/src/uts/common/rpc/svc.c | 4 | ||||
-rw-r--r-- | usr/src/uts/common/sys/epoll.h | 2 | ||||
-rw-r--r-- | usr/src/uts/common/sys/nvme.h | 27 |
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 { |