Type punning is necessary for get/put unaligned but the use of a
packed struct violates strict aliasing rules, requiring
-fno-strict-aliasing to be passed to the C compiler. Switch to using
memcpy so that -fno-strict-aliasing isn't necessary.
Signed-off-by: Ian Rogers <irogers@google.com>
---
include/vdso/unaligned.h | 48 +++++++++++++++++++++++++++++++++++-----
1 file changed, 42 insertions(+), 6 deletions(-)
diff --git a/include/vdso/unaligned.h b/include/vdso/unaligned.h
index ff0c06b6513e..81f632e3c5eb 100644
--- a/include/vdso/unaligned.h
+++ b/include/vdso/unaligned.h
@@ -2,14 +2,50 @@
#ifndef __VDSO_UNALIGNED_H
#define __VDSO_UNALIGNED_H
-#define __get_unaligned_t(type, ptr) ({ \
- const struct { type x; } __packed * __get_pptr = (typeof(__get_pptr))(ptr); \
- __get_pptr->x; \
+#include <linux/string.h> // For memcpy.
+
+#define ____get_unaligned_type(type) type: (type)0
+/**
+ * __get_unaligned_t - read an unaligned value from memory.
+ * @ptr: the pointer to load from.
+ * @type: the type to load from the pointer.
+ *
+ * Use memcpy to affect an unaligned type sized load avoiding undefined behavior
+ * from approaches like type punning that require -fno-strict-aliasing in order
+ * to be correct. As type may be const, use _Generic to map to a non-const type
+ * - you can't memcpy into a const type. The void* cast silences ubsan warnings.
+ */
+#define __get_unaligned_t(type, ptr) ({ \
+ type __get_unaligned_map_ctrl = 0; \
+ typeof(_Generic(__get_unaligned_map_ctrl, \
+ ____get_unaligned_type(short int), \
+ ____get_unaligned_type(unsigned short int), \
+ ____get_unaligned_type(int), \
+ ____get_unaligned_type(unsigned int), \
+ ____get_unaligned_type(long), \
+ ____get_unaligned_type(unsigned long), \
+ ____get_unaligned_type(long long), \
+ ____get_unaligned_type(unsigned long long), \
+ default: (type)0 \
+ )) __get_unaligned_val; \
+ (void)__get_unaligned_map_ctrl; \
+ memcpy(&__get_unaligned_val, (void *)(ptr), sizeof(__get_unaligned_val)); \
+ __get_unaligned_val; \
})
-#define __put_unaligned_t(type, val, ptr) do { \
- struct { type x; } __packed * __put_pptr = (typeof(__put_pptr))(ptr); \
- __put_pptr->x = (val); \
+/**
+ * __put_unaligned_t - write an unaligned value to memory.
+ * @type: the type of the value to store.
+ * @val: the value to store.
+ * @ptr: the pointer to store to.
+ *
+ * Use memcpy to affect an unaligned type sized store avoiding undefined
+ * behavior from approaches like type punning that require -fno-strict-aliasing
+ * in order to be correct. The void* cast silences ubsan warnings.
+ */
+#define __put_unaligned_t(type, val, ptr) do { \
+ type __put_unaligned_val = (val); \
+ memcpy((void *)(ptr), &__put_unaligned_val, sizeof(__put_unaligned_val)); \
} while (0)
#endif /* __VDSO_UNALIGNED_H */
--
2.50.0.rc2.692.g299adb8693-goog
Hi Ian, kernel test robot noticed the following build warnings: [auto build test WARNING on linus/master] [also build test WARNING on v6.16-rc2 next-20250617] [cannot apply to tip/timers/vdso acme/perf/core] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Ian-Rogers/vdso-Switch-get-put-unaligned-from-packed-struct-to-memcpy/20250617-085916 base: linus/master patch link: https://lore.kernel.org/r/20250617005800.1410112-2-irogers%40google.com patch subject: [PATCH v1 1/3] vdso: Switch get/put unaligned from packed struct to memcpy config: i386-randconfig-062-20250617 (https://download.01.org/0day-ci/archive/20250618/202506180203.PSKW4lGq-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250618/202506180203.PSKW4lGq-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202506180203.PSKW4lGq-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) drivers/scsi/megaraid/megaraid_sas_base.c:4656:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] flags @@ got int @@ drivers/scsi/megaraid/megaraid_sas_base.c:4656:21: sparse: expected restricted __le16 [usertype] flags drivers/scsi/megaraid/megaraid_sas_base.c:4656:21: sparse: got int drivers/scsi/megaraid/megaraid_sas_base.c:4907:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] flags @@ got int @@ drivers/scsi/megaraid/megaraid_sas_base.c:4907:21: sparse: expected restricted __le16 [usertype] flags drivers/scsi/megaraid/megaraid_sas_base.c:4907:21: sparse: got int drivers/scsi/megaraid/megaraid_sas_base.c:6748:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] flags @@ got int @@ drivers/scsi/megaraid/megaraid_sas_base.c:6748:21: sparse: expected restricted __le16 [usertype] flags drivers/scsi/megaraid/megaraid_sas_base.c:6748:21: sparse: got int drivers/scsi/megaraid/megaraid_sas_base.c:4563:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] flags @@ got int @@ drivers/scsi/megaraid/megaraid_sas_base.c:4563:21: sparse: expected restricted __le16 [usertype] flags drivers/scsi/megaraid/megaraid_sas_base.c:4563:21: sparse: got int drivers/scsi/megaraid/megaraid_sas_base.c:204:26: sparse: sparse: symbol 'megasas_mgmt_info' was not declared. Should it be static? drivers/scsi/megaraid/megaraid_sas_base.c:293:31: sparse: sparse: restricted __le16 degrades to integer drivers/scsi/megaraid/megaraid_sas_base.c:299:31: sparse: sparse: cast from restricted __le16 drivers/scsi/megaraid/megaraid_sas_base.c:425:29: sparse: sparse: cast to restricted __le32 drivers/scsi/megaraid/megaraid_sas_base.c:1235:32: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] opcode @@ got restricted __le32 [usertype] opcode @@ drivers/scsi/megaraid/megaraid_sas_base.c:1235:32: sparse: expected unsigned int [usertype] opcode drivers/scsi/megaraid/megaraid_sas_base.c:1235:32: sparse: got restricted __le32 [usertype] opcode drivers/scsi/megaraid/megaraid_sas_base.c:2019:33: sparse: sparse: cast to restricted __le32 drivers/scsi/megaraid/megaraid_sas_base.c:2060:34: sparse: sparse: cast to restricted __le32 drivers/scsi/megaraid/megaraid_sas_base.c: note: in included file: drivers/scsi/megaraid/megaraid_sas.h:2485:32: sparse: sparse: array of flexible structures drivers/scsi/megaraid/megaraid_sas_base.c:4787:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] flags @@ got int @@ drivers/scsi/megaraid/megaraid_sas_base.c:4787:21: sparse: expected restricted __le16 [usertype] flags drivers/scsi/megaraid/megaraid_sas_base.c:4787:21: sparse: got int drivers/scsi/megaraid/megaraid_sas_base.c:5027:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] flags @@ got int @@ drivers/scsi/megaraid/megaraid_sas_base.c:5027:21: sparse: expected restricted __le16 [usertype] flags drivers/scsi/megaraid/megaraid_sas_base.c:5027:21: sparse: got int drivers/scsi/megaraid/megaraid_sas_base.c:5212:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] flags @@ got int @@ drivers/scsi/megaraid/megaraid_sas_base.c:5212:21: sparse: expected restricted __le16 [usertype] flags drivers/scsi/megaraid/megaraid_sas_base.c:5212:21: sparse: got int drivers/scsi/megaraid/megaraid_sas_base.c:5294:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] flags @@ got int @@ drivers/scsi/megaraid/megaraid_sas_base.c:5294:21: sparse: expected restricted __le16 [usertype] flags drivers/scsi/megaraid/megaraid_sas_base.c:5294:21: sparse: got int drivers/scsi/megaraid/megaraid_sas_base.c:6301:42: sparse: sparse: cast removes address space '__iomem' of expression drivers/scsi/megaraid/megaraid_sas_base.c:6300:57: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected unsigned int [noderef] [usertype] __iomem * @@ got unsigned int [usertype] * @@ drivers/scsi/megaraid/megaraid_sas_base.c:6300:57: sparse: expected unsigned int [noderef] [usertype] __iomem * drivers/scsi/megaraid/megaraid_sas_base.c:6300:57: sparse: got unsigned int [usertype] * drivers/scsi/megaraid/megaraid_sas_base.c:6305:34: sparse: sparse: cast removes address space '__iomem' of expression drivers/scsi/megaraid/megaraid_sas_base.c:6304:57: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected unsigned int [noderef] [usertype] __iomem * @@ got unsigned int [usertype] * @@ drivers/scsi/megaraid/megaraid_sas_base.c:6304:57: sparse: expected unsigned int [noderef] [usertype] __iomem * drivers/scsi/megaraid/megaraid_sas_base.c:6304:57: sparse: got unsigned int [usertype] * drivers/scsi/megaraid/megaraid_sas_base.c:6612:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] flags @@ got int @@ drivers/scsi/megaraid/megaraid_sas_base.c:6612:21: sparse: expected restricted __le16 [usertype] flags drivers/scsi/megaraid/megaraid_sas_base.c:6612:21: sparse: got int drivers/scsi/megaraid/megaraid_sas_base.c:6826:21: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __le16 [usertype] flags @@ got int @@ drivers/scsi/megaraid/megaraid_sas_base.c:6826:21: sparse: expected restricted __le16 [usertype] flags drivers/scsi/megaraid/megaraid_sas_base.c:6826:21: sparse: got int drivers/scsi/megaraid/megaraid_sas_base.c:7583:44: sparse: sparse: restricted __le32 degrades to integer drivers/scsi/megaraid/megaraid_sas_base.c:8200:23: sparse: sparse: incorrect type in assignment (different base types) @@ expected int crash_support @@ got restricted __le32 @@ drivers/scsi/megaraid/megaraid_sas_base.c:8200:23: sparse: expected int crash_support drivers/scsi/megaraid/megaraid_sas_base.c:8200:23: sparse: got restricted __le32 drivers/scsi/megaraid/megaraid_sas_base.c:8284:31: sparse: sparse: invalid assignment: &= drivers/scsi/megaraid/megaraid_sas_base.c:8284:31: sparse: left side has type restricted __le16 drivers/scsi/megaraid/megaraid_sas_base.c:8284:31: sparse: right side has type int >> drivers/scsi/megaraid/megaraid_sas_base.c:8438:32: sparse: sparse: Using plain integer as NULL pointer drivers/scsi/megaraid/megaraid_sas_base.c:8809:46: sparse: sparse: restricted __le32 degrades to integer vim +8438 drivers/scsi/megaraid/megaraid_sas_base.c fc62b3fc902152 drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-09-12 8225 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8226 /** c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8227 * megasas_mgmt_fw_ioctl - Issues management ioctls to FW c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8228 * @instance: Adapter soft state 2b46e5c14218c7 drivers/scsi/megaraid/megaraid_sas_base.c Damien Le Moal 2020-07-06 8229 * @user_ioc: User's ioctl packet 2b46e5c14218c7 drivers/scsi/megaraid/megaraid_sas_base.c Damien Le Moal 2020-07-06 8230 * @ioc: ioctl packet c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8231 */ c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8232 static int c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8233 megasas_mgmt_fw_ioctl(struct megasas_instance *instance, c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8234 struct megasas_iocpacket __user * user_ioc, c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8235 struct megasas_iocpacket *ioc) c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8236 { 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8237 struct megasas_sge64 *kern_sge64 = NULL; 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8238 struct megasas_sge32 *kern_sge32 = NULL; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8239 struct megasas_cmd *cmd; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8240 void *kbuff_arr[MAX_IOCTL_SGE]; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8241 dma_addr_t buf_handle = 0; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8242 int error = 0, i; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8243 void *sense = NULL; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8244 dma_addr_t sense_handle; 381d34e376e3d9 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8245 void *sense_ptr; 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8246 u32 opcode = 0; 201a810cc188af drivers/scsi/megaraid/megaraid_sas_base.c Anand Lodnoor 2020-01-14 8247 int ret = DCMD_SUCCESS; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8248 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8249 memset(kbuff_arr, 0, sizeof(kbuff_arr)); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8250 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8251 if (ioc->sge_count > MAX_IOCTL_SGE) { 1be1825453f6d7 drivers/scsi/megaraid/megaraid_sas_base.c Bjorn Helgaas 2015-07-07 8252 dev_printk(KERN_DEBUG, &instance->pdev->dev, "SGE count [%d] > max limit [%d]\n", c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8253 ioc->sge_count, MAX_IOCTL_SGE); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8254 return -EINVAL; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8255 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8256 f870bcbe9a9912 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2018-01-05 8257 if ((ioc->frame.hdr.cmd >= MFI_CMD_OP_COUNT) || f870bcbe9a9912 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2018-01-05 8258 ((ioc->frame.hdr.cmd == MFI_CMD_NVME) && 58136856167d10 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil 2019-06-25 8259 !instance->support_nvme_passthru) || 58136856167d10 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil 2019-06-25 8260 ((ioc->frame.hdr.cmd == MFI_CMD_TOOLBOX) && 58136856167d10 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil 2019-06-25 8261 !instance->support_pci_lane_margining)) { 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8262 dev_err(&instance->pdev->dev, 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8263 "Received invalid ioctl command 0x%x\n", 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8264 ioc->frame.hdr.cmd); 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8265 return -ENOTSUPP; 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8266 } 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8267 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8268 cmd = megasas_get_cmd(instance); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8269 if (!cmd) { 1be1825453f6d7 drivers/scsi/megaraid/megaraid_sas_base.c Bjorn Helgaas 2015-07-07 8270 dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to get a cmd packet\n"); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8271 return -ENOMEM; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8272 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8273 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8274 /* c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8275 * User's IOCTL packet has 2 frames (maximum). Copy those two c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8276 * frames into our cmd's frames. cmd->frame's context will get c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8277 * overwritten when we copy from user's frames. So set that value c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8278 * alone separately c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8279 */ c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8280 memcpy(cmd->frame, ioc->frame.raw, 2 * MEGAMFI_FRAME_SIZE); 94cd65ddf4d70b drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@lsi.com 2013-09-06 8281 cmd->frame->hdr.context = cpu_to_le32(cmd->index); c35188377f12e5 drivers/scsi/megaraid/megaraid_sas.c Yang, Bo 2009-10-06 8282 cmd->frame->hdr.pad_0 = 0; 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8283 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8284 cmd->frame->hdr.flags &= (~MFI_FRAME_IEEE); 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8285 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8286 if (instance->consistent_mask_64bit) 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8287 cmd->frame->hdr.flags |= cpu_to_le16((MFI_FRAME_SGL64 | 94cd65ddf4d70b drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@lsi.com 2013-09-06 8288 MFI_FRAME_SENSE64)); 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8289 else 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8290 cmd->frame->hdr.flags &= cpu_to_le16(~(MFI_FRAME_SGL64 | 94cd65ddf4d70b drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@lsi.com 2013-09-06 8291 MFI_FRAME_SENSE64)); 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8292 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8293 if (cmd->frame->hdr.cmd == MFI_CMD_DCMD) 8823abeddbbcef drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-08-23 8294 opcode = le32_to_cpu(cmd->frame->dcmd.opcode); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8295 8823abeddbbcef drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-08-23 8296 if (opcode == MR_DCMD_CTRL_SHUTDOWN) { 7fa3174b3ef4e5 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil 2019-06-25 8297 mutex_lock(&instance->reset_mutex); 95c060869e6872 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-02-10 8298 if (megasas_get_ctrl_info(instance) != DCMD_SUCCESS) { 95c060869e6872 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-02-10 8299 megasas_return_cmd(instance, cmd); 7fa3174b3ef4e5 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil 2019-06-25 8300 mutex_unlock(&instance->reset_mutex); 95c060869e6872 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-02-10 8301 return -1; 95c060869e6872 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-02-10 8302 } 7fa3174b3ef4e5 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil 2019-06-25 8303 mutex_unlock(&instance->reset_mutex); 95c060869e6872 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-02-10 8304 } 95c060869e6872 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-02-10 8305 8823abeddbbcef drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-08-23 8306 if (opcode == MR_DRIVER_SET_APP_CRASHDUMP_MODE) { fc62b3fc902152 drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-09-12 8307 error = megasas_set_crash_dump_params_ioctl(cmd); fc62b3fc902152 drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-09-12 8308 megasas_return_cmd(instance, cmd); fc62b3fc902152 drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-09-12 8309 return error; fc62b3fc902152 drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-09-12 8310 } fc62b3fc902152 drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-09-12 8311 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8312 /* c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8313 * The management interface between applications and the fw uses c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8314 * MFI frames. E.g, RAID configuration changes, LD property changes c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8315 * etc are accomplishes through different kinds of MFI frames. The c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8316 * driver needs to care only about substituting user buffers with c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8317 * kernel buffers in SGLs. The location of SGL is embedded in the c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8318 * struct iocpacket itself. c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8319 */ 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8320 if (instance->consistent_mask_64bit) 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8321 kern_sge64 = (struct megasas_sge64 *) 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8322 ((unsigned long)cmd->frame + ioc->sgl_off); 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8323 else c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8324 kern_sge32 = (struct megasas_sge32 *) c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8325 ((unsigned long)cmd->frame + ioc->sgl_off); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8326 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8327 /* c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8328 * For each user buffer, create a mirror buffer and copy in c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8329 */ c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8330 for (i = 0; i < ioc->sge_count; i++) { 98cb7e4413d189 drivers/scsi/megaraid/megaraid_sas_base.c Bjørn Mork 2011-01-19 8331 if (!ioc->sgl[i].iov_len) 98cb7e4413d189 drivers/scsi/megaraid/megaraid_sas_base.c Bjørn Mork 2011-01-19 8332 continue; 98cb7e4413d189 drivers/scsi/megaraid/megaraid_sas_base.c Bjørn Mork 2011-01-19 8333 9f35fa8a14e621 drivers/scsi/megaraid/megaraid_sas.c Sumant Patro 2007-02-14 8334 kbuff_arr[i] = dma_alloc_coherent(&instance->pdev->dev, c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8335 ioc->sgl[i].iov_len, 9f35fa8a14e621 drivers/scsi/megaraid/megaraid_sas.c Sumant Patro 2007-02-14 8336 &buf_handle, GFP_KERNEL); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8337 if (!kbuff_arr[i]) { 1be1825453f6d7 drivers/scsi/megaraid/megaraid_sas_base.c Bjorn Helgaas 2015-07-07 8338 dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to alloc " c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8339 "kernel SGL buffer for IOCTL\n"); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8340 error = -ENOMEM; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8341 goto out; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8342 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8343 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8344 /* c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8345 * We don't change the dma_coherent_mask, so 60ee6529511601 drivers/scsi/megaraid/megaraid_sas_base.c Christoph Hellwig 2018-10-10 8346 * dma_alloc_coherent only returns 32bit addresses c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8347 */ 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8348 if (instance->consistent_mask_64bit) { 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8349 kern_sge64[i].phys_addr = cpu_to_le64(buf_handle); 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8350 kern_sge64[i].length = cpu_to_le32(ioc->sgl[i].iov_len); 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8351 } else { 94cd65ddf4d70b drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@lsi.com 2013-09-06 8352 kern_sge32[i].phys_addr = cpu_to_le32(buf_handle); 94cd65ddf4d70b drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@lsi.com 2013-09-06 8353 kern_sge32[i].length = cpu_to_le32(ioc->sgl[i].iov_len); 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8354 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8355 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8356 /* c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8357 * We created a kernel buffer corresponding to the c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8358 * user buffer. Now copy in from the user buffer c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8359 */ c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8360 if (copy_from_user(kbuff_arr[i], ioc->sgl[i].iov_base, c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8361 (u32) (ioc->sgl[i].iov_len))) { c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8362 error = -EFAULT; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8363 goto out; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8364 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8365 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8366 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8367 if (ioc->sense_len) { 381d34e376e3d9 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8368 /* make sure the pointer is part of the frame */ 381d34e376e3d9 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8369 if (ioc->sense_off > 381d34e376e3d9 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8370 (sizeof(union megasas_frame) - sizeof(__le64))) { 381d34e376e3d9 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8371 error = -EINVAL; 381d34e376e3d9 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8372 goto out; 381d34e376e3d9 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8373 } 381d34e376e3d9 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8374 9f35fa8a14e621 drivers/scsi/megaraid/megaraid_sas.c Sumant Patro 2007-02-14 8375 sense = dma_alloc_coherent(&instance->pdev->dev, ioc->sense_len, 9f35fa8a14e621 drivers/scsi/megaraid/megaraid_sas.c Sumant Patro 2007-02-14 8376 &sense_handle, GFP_KERNEL); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8377 if (!sense) { c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8378 error = -ENOMEM; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8379 goto out; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8380 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8381 b112036535eda3 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2021-01-05 8382 /* always store 64 bits regardless of addressing */ 381d34e376e3d9 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8383 sense_ptr = (void *)cmd->frame + ioc->sense_off; 381d34e376e3d9 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8384 put_unaligned_le64(sense_handle, sense_ptr); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8385 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8386 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8387 /* c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8388 * Set the sync_cmd flag so that the ISR knows not to complete this c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8389 * cmd to the SCSI mid-layer c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8390 */ c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8391 cmd->sync_cmd = 1; 201a810cc188af drivers/scsi/megaraid/megaraid_sas_base.c Anand Lodnoor 2020-01-14 8392 201a810cc188af drivers/scsi/megaraid/megaraid_sas_base.c Anand Lodnoor 2020-01-14 8393 ret = megasas_issue_blocked_cmd(instance, cmd, 0); 201a810cc188af drivers/scsi/megaraid/megaraid_sas_base.c Anand Lodnoor 2020-01-14 8394 switch (ret) { 201a810cc188af drivers/scsi/megaraid/megaraid_sas_base.c Anand Lodnoor 2020-01-14 8395 case DCMD_INIT: 201a810cc188af drivers/scsi/megaraid/megaraid_sas_base.c Anand Lodnoor 2020-01-14 8396 case DCMD_BUSY: 6d40afbc7d1335 drivers/scsi/megaraid/megaraid_sas_base.c Sumit Saxena 2016-01-28 8397 cmd->sync_cmd = 0; 6d40afbc7d1335 drivers/scsi/megaraid/megaraid_sas_base.c Sumit Saxena 2016-01-28 8398 dev_err(&instance->pdev->dev, 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8399 "return -EBUSY from %s %d cmd 0x%x opcode 0x%x cmd->cmd_status_drv 0x%x\n", 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8400 __func__, __LINE__, cmd->frame->hdr.cmd, opcode, 82add4e1b354f9 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8401 cmd->cmd_status_drv); 201a810cc188af drivers/scsi/megaraid/megaraid_sas_base.c Anand Lodnoor 2020-01-14 8402 error = -EBUSY; 201a810cc188af drivers/scsi/megaraid/megaraid_sas_base.c Anand Lodnoor 2020-01-14 8403 goto out; 6d40afbc7d1335 drivers/scsi/megaraid/megaraid_sas_base.c Sumit Saxena 2016-01-28 8404 } 6d40afbc7d1335 drivers/scsi/megaraid/megaraid_sas_base.c Sumit Saxena 2016-01-28 8405 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8406 cmd->sync_cmd = 0; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8407 aa00832b4ca649 drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-11-17 8408 if (instance->unload == 1) { aa00832b4ca649 drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-11-17 8409 dev_info(&instance->pdev->dev, "Driver unload is in progress " aa00832b4ca649 drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-11-17 8410 "don't submit data to application\n"); aa00832b4ca649 drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-11-17 8411 goto out; aa00832b4ca649 drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-11-17 8412 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8413 /* c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8414 * copy out the kernel buffers to user buffers c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8415 */ c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8416 for (i = 0; i < ioc->sge_count; i++) { c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8417 if (copy_to_user(ioc->sgl[i].iov_base, kbuff_arr[i], c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8418 ioc->sgl[i].iov_len)) { c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8419 error = -EFAULT; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8420 goto out; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8421 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8422 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8423 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8424 /* c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8425 * copy out the sense c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8426 */ c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8427 if (ioc->sense_len) { bba84aeccafb57 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8428 void __user *uptr; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8429 /* b70a41e077b340 drivers/scsi/megaraid/megaraid_sas.c bo yang 2008-03-18 8430 * sense_ptr points to the location that has the user c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8431 * sense buffer address c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8432 */ bba84aeccafb57 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8433 sense_ptr = (void *)ioc->frame.raw + ioc->sense_off; bba84aeccafb57 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8434 if (in_compat_syscall()) bba84aeccafb57 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8435 uptr = compat_ptr(get_unaligned((compat_uptr_t *) bba84aeccafb57 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8436 sense_ptr)); bba84aeccafb57 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8437 else bba84aeccafb57 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 @8438 uptr = get_unaligned((void __user **)sense_ptr); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8439 bba84aeccafb57 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2020-10-30 8440 if (copy_to_user(uptr, sense, ioc->sense_len)) { 1be1825453f6d7 drivers/scsi/megaraid/megaraid_sas_base.c Bjorn Helgaas 2015-07-07 8441 dev_err(&instance->pdev->dev, "Failed to copy out to user " b10c36a57552f0 drivers/scsi/megaraid/megaraid_sas.c bo yang 2007-11-09 8442 "sense data\n"); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8443 error = -EFAULT; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8444 goto out; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8445 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8446 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8447 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8448 /* c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8449 * copy the status codes returned by the fw c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8450 */ c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8451 if (copy_to_user(&user_ioc->frame.hdr.cmd_status, c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8452 &cmd->frame->hdr.cmd_status, sizeof(u8))) { 1be1825453f6d7 drivers/scsi/megaraid/megaraid_sas_base.c Bjorn Helgaas 2015-07-07 8453 dev_printk(KERN_DEBUG, &instance->pdev->dev, "Error copying out cmd_status\n"); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8454 error = -EFAULT; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8455 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8456 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8457 out: c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8458 if (sense) { 9f35fa8a14e621 drivers/scsi/megaraid/megaraid_sas.c Sumant Patro 2007-02-14 8459 dma_free_coherent(&instance->pdev->dev, ioc->sense_len, c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8460 sense, sense_handle); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8461 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8462 7a6a731bd00ca9 drivers/scsi/megaraid/megaraid_sas_base.c Bjørn Mork 2012-11-21 8463 for (i = 0; i < ioc->sge_count; i++) { 3deb9438d34a09 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2016-03-14 8464 if (kbuff_arr[i]) { 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8465 if (instance->consistent_mask_64bit) 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8466 dma_free_coherent(&instance->pdev->dev, 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8467 le32_to_cpu(kern_sge64[i].length), 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8468 kbuff_arr[i], 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8469 le64_to_cpu(kern_sge64[i].phys_addr)); 107a60dd71b5f5 drivers/scsi/megaraid/megaraid_sas_base.c Shivasharan S 2017-10-19 8470 else 9f35fa8a14e621 drivers/scsi/megaraid/megaraid_sas.c Sumant Patro 2007-02-14 8471 dma_free_coherent(&instance->pdev->dev, 94cd65ddf4d70b drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@lsi.com 2013-09-06 8472 le32_to_cpu(kern_sge32[i].length), 7a6a731bd00ca9 drivers/scsi/megaraid/megaraid_sas_base.c Bjørn Mork 2012-11-21 8473 kbuff_arr[i], 94cd65ddf4d70b drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@lsi.com 2013-09-06 8474 le32_to_cpu(kern_sge32[i].phys_addr)); 90dc9d98f01bdf drivers/scsi/megaraid/megaraid_sas_base.c Sumit.Saxena@avagotech.com 2014-09-12 8475 kbuff_arr[i] = NULL; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8476 } 3deb9438d34a09 drivers/scsi/megaraid/megaraid_sas_base.c Arnd Bergmann 2016-03-14 8477 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8478 c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8479 megasas_return_cmd(instance, cmd); c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8480 return error; c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8481 } c4a3e0a529ab3e drivers/scsi/megaraid/megaraid_sas.c Bagalkote, Sreenivas 2005-09-20 8482 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Hi Ian, kernel test robot noticed the following build warnings: [auto build test WARNING on linus/master] [also build test WARNING on v6.16-rc2 next-20250617] [cannot apply to tip/timers/vdso acme/perf/core] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Ian-Rogers/vdso-Switch-get-put-unaligned-from-packed-struct-to-memcpy/20250617-085916 base: linus/master patch link: https://lore.kernel.org/r/20250617005800.1410112-2-irogers%40google.com patch subject: [PATCH v1 1/3] vdso: Switch get/put unaligned from packed struct to memcpy config: arm64-randconfig-r133-20250617 (https://download.01.org/0day-ci/archive/20250618/202506180158.O3zMMHjh-lkp@intel.com/config) compiler: clang version 21.0.0git (https://github.com/llvm/llvm-project f819f46284f2a79790038e1f6649172789734ae8) reproduce: (https://download.01.org/0day-ci/archive/20250618/202506180158.O3zMMHjh-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202506180158.O3zMMHjh-lkp@intel.com/ All warnings (new ones prefixed by >>): >> llvm-readelf: warning: 'arch/arm64/kernel/vdso/vdso.so.dbg': invalid PT_DYNAMIC size (0x118) >> llvm-readelf: warning: 'arch/arm64/kernel/vdso/vdso.so.dbg': PT_DYNAMIC dynamic table is invalid: SHT_DYNAMIC will be used arch/arm64/kernel/vdso/vdso.so.dbg: dynamic relocations are not supported make[3]: *** [arch/arm64/kernel/vdso/Makefile:64: arch/arm64/kernel/vdso/vdso.so.dbg] Error 1 make[3]: Target 'include/generated/vdso-offsets.h' not remade because of errors. make[3]: Target 'arch/arm64/kernel/vdso/vdso.so' not remade because of errors. make[2]: *** [arch/arm64/Makefile:207: vdso_prepare] Error 2 make[2]: Target 'prepare' not remade because of errors. make[1]: *** [Makefile:248: __sub-make] Error 2 make[1]: Target 'prepare' not remade because of errors. make: *** [Makefile:248: __sub-make] Error 2 make: Target 'prepare' not remade because of errors. -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Le 17/06/2025 à 02:57, Ian Rogers a écrit : > Type punning is necessary for get/put unaligned but the use of a > packed struct violates strict aliasing rules, requiring > -fno-strict-aliasing to be passed to the C compiler. Switch to using > memcpy so that -fno-strict-aliasing isn't necessary. VDSO build fails with this patch: VDSO32L arch/powerpc/kernel/vdso/vdso32.so.dbg arch/powerpc/kernel/vdso/vdso32.so.dbg: dynamic relocations are not supported make[2]: *** [arch/powerpc/kernel/vdso/Makefile:79: arch/powerpc/kernel/vdso/vdso32.so.dbg] Error 1 Behind the relocation issue, calling memcpy() for a single 4-bytes word kills performance. 170: 7f e4 fb 78 mr r4,r31 174: 38 a0 00 04 li r5,4 178: 38 61 00 10 addi r3,r1,16 17c: 93 81 00 10 stw r28,16(r1) 180: 48 00 00 01 bl 180 <__c_kernel_getrandom+0x180> 180: R_PPC_REL24 memcpy 184: 38 81 00 10 addi r4,r1,16 188: 7f a3 eb 78 mr r3,r29 18c: 38 a0 00 04 li r5,4 190: 48 00 00 01 bl 190 <__c_kernel_getrandom+0x190> 190: R_PPC_REL24 memcpy 194: 38 81 00 10 addi r4,r1,16 198: 7f e3 fb 78 mr r3,r31 19c: 38 a0 00 04 li r5,4 1a0: 93 81 00 10 stw r28,16(r1) 1a4: 48 00 00 01 bl 1a4 <__c_kernel_getrandom+0x1a4> 1a4: R_PPC_REL24 memcpy 1a8: 37 de ff ff addic. r30,r30,-1 1ac: 3b bd 00 04 addi r29,r29,4 1b0: 3b ff 00 04 addi r31,r31,4 1b4: 40 82 ff bc bne 170 <__c_kernel_getrandom+0x170> 1b8: 73 09 00 02 andi. r9,r24,2 1bc: 56 b5 00 3a clrrwi r21,r21,2 1c0: 3b 7b 00 04 addi r27,r27,4 1c4: 3b f7 00 04 addi r31,r23,4 1c8: 7f 7b aa 14 add r27,r27,r21 1cc: 7f ff aa 14 add r31,r31,r21 1d0: 57 1e 07 be clrlwi r30,r24,30 1d4: 41 82 00 48 beq 21c <__c_kernel_getrandom+0x21c> 1d8: 7f 64 db 78 mr r4,r27 1dc: 38 a0 00 02 li r5,2 1e0: 7e c3 b3 78 mr r3,r22 1e4: b1 c1 00 10 sth r14,16(r1) 1e8: 48 00 00 01 bl 1e8 <__c_kernel_getrandom+0x1e8> 1e8: R_PPC_REL24 memcpy 1ec: 7e c4 b3 78 mr r4,r22 1f0: 7f e3 fb 78 mr r3,r31 1f4: 38 a0 00 02 li r5,2 1f8: 48 00 00 01 bl 1f8 <__c_kernel_getrandom+0x1f8> 1f8: R_PPC_REL24 memcpy 1fc: 7f 63 db 78 mr r3,r27 200: 7e c4 b3 78 mr r4,r22 204: 38 a0 00 02 li r5,2 208: b1 c1 00 10 sth r14,16(r1) 20c: 57 de 07 fe clrlwi r30,r30,31 210: 48 00 00 01 bl 210 <__c_kernel_getrandom+0x210> 210: R_PPC_REL24 memcpy 214: 3b 7b 00 02 addi r27,r27,2 218: 3b ff 00 02 addi r31,r31,2 21c: 2c 1e 00 00 cmpwi r30,0 220: 41 82 00 3c beq 25c <__c_kernel_getrandom+0x25c> Christophe > > Signed-off-by: Ian Rogers <irogers@google.com> > --- > include/vdso/unaligned.h | 48 +++++++++++++++++++++++++++++++++++----- > 1 file changed, 42 insertions(+), 6 deletions(-) > > diff --git a/include/vdso/unaligned.h b/include/vdso/unaligned.h > index ff0c06b6513e..81f632e3c5eb 100644 > --- a/include/vdso/unaligned.h > +++ b/include/vdso/unaligned.h > @@ -2,14 +2,50 @@ > #ifndef __VDSO_UNALIGNED_H > #define __VDSO_UNALIGNED_H > > -#define __get_unaligned_t(type, ptr) ({ \ > - const struct { type x; } __packed * __get_pptr = (typeof(__get_pptr))(ptr); \ > - __get_pptr->x; \ > +#include <linux/string.h> // For memcpy. > + > +#define ____get_unaligned_type(type) type: (type)0 > +/** > + * __get_unaligned_t - read an unaligned value from memory. > + * @ptr: the pointer to load from. > + * @type: the type to load from the pointer. > + * > + * Use memcpy to affect an unaligned type sized load avoiding undefined behavior > + * from approaches like type punning that require -fno-strict-aliasing in order > + * to be correct. As type may be const, use _Generic to map to a non-const type > + * - you can't memcpy into a const type. The void* cast silences ubsan warnings. > + */ > +#define __get_unaligned_t(type, ptr) ({ \ > + type __get_unaligned_map_ctrl = 0; \ > + typeof(_Generic(__get_unaligned_map_ctrl, \ > + ____get_unaligned_type(short int), \ > + ____get_unaligned_type(unsigned short int), \ > + ____get_unaligned_type(int), \ > + ____get_unaligned_type(unsigned int), \ > + ____get_unaligned_type(long), \ > + ____get_unaligned_type(unsigned long), \ > + ____get_unaligned_type(long long), \ > + ____get_unaligned_type(unsigned long long), \ > + default: (type)0 \ > + )) __get_unaligned_val; \ > + (void)__get_unaligned_map_ctrl; \ > + memcpy(&__get_unaligned_val, (void *)(ptr), sizeof(__get_unaligned_val)); \ > + __get_unaligned_val; \ > }) > > -#define __put_unaligned_t(type, val, ptr) do { \ > - struct { type x; } __packed * __put_pptr = (typeof(__put_pptr))(ptr); \ > - __put_pptr->x = (val); \ > +/** > + * __put_unaligned_t - write an unaligned value to memory. > + * @type: the type of the value to store. > + * @val: the value to store. > + * @ptr: the pointer to store to. > + * > + * Use memcpy to affect an unaligned type sized store avoiding undefined > + * behavior from approaches like type punning that require -fno-strict-aliasing > + * in order to be correct. The void* cast silences ubsan warnings. > + */ > +#define __put_unaligned_t(type, val, ptr) do { \ > + type __put_unaligned_val = (val); \ > + memcpy((void *)(ptr), &__put_unaligned_val, sizeof(__put_unaligned_val)); \ > } while (0) > > #endif /* __VDSO_UNALIGNED_H */
On Tue, Jun 17, 2025 at 07:22:57AM +0200, Christophe Leroy wrote: > > > Le 17/06/2025 à 02:57, Ian Rogers a écrit : > > Type punning is necessary for get/put unaligned but the use of a > > packed struct violates strict aliasing rules, requiring > > -fno-strict-aliasing to be passed to the C compiler. Switch to using > > memcpy so that -fno-strict-aliasing isn't necessary. > > VDSO build fails with this patch: > > VDSO32L arch/powerpc/kernel/vdso/vdso32.so.dbg > arch/powerpc/kernel/vdso/vdso32.so.dbg: dynamic relocations are not > supported > make[2]: *** [arch/powerpc/kernel/vdso/Makefile:79: > arch/powerpc/kernel/vdso/vdso32.so.dbg] Error 1 > > Behind the relocation issue, calling memcpy() for a single 4-bytes word > kills performance. memcpy() does normally do the right thing for unaligned accesses of 1, 2, 4, or 8-byte values. The snag here seems to be that the VDSO is built with -fno-builtin (and -ffreestanding which implies -fno-builtin). That causes the compiler to no longer optimize out the calls to memcpy(). If __builtin_memcpy() is used instead of memcpy(), it does work and generates the same code as before. - Eric
+linuxppc list Le 17/06/2025 à 08:32, Eric Biggers a écrit : > On Tue, Jun 17, 2025 at 07:22:57AM +0200, Christophe Leroy wrote: >> >> >> Le 17/06/2025 à 02:57, Ian Rogers a écrit : >>> Type punning is necessary for get/put unaligned but the use of a >>> packed struct violates strict aliasing rules, requiring >>> -fno-strict-aliasing to be passed to the C compiler. Switch to using >>> memcpy so that -fno-strict-aliasing isn't necessary. >> >> VDSO build fails with this patch: >> >> VDSO32L arch/powerpc/kernel/vdso/vdso32.so.dbg >> arch/powerpc/kernel/vdso/vdso32.so.dbg: dynamic relocations are not >> supported >> make[2]: *** [arch/powerpc/kernel/vdso/Makefile:79: >> arch/powerpc/kernel/vdso/vdso32.so.dbg] Error 1 >> >> Behind the relocation issue, calling memcpy() for a single 4-bytes word >> kills performance. > > memcpy() does normally do the right thing for unaligned accesses of 1, 2, 4, or > 8-byte values. The snag here seems to be that the VDSO is built with > -fno-builtin (and -ffreestanding which implies -fno-builtin). That causes the > compiler to no longer optimize out the calls to memcpy(). If __builtin_memcpy() > is used instead of memcpy(), it does work and generates the same code as before. Yes right, changing memcpy() to __builtin_memcpy() seems to work, the exact same code is generated. Christophe
© 2016 - 2025 Red Hat, Inc.