diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2016-09-01 12:33:46 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-09-01 12:33:46 -0400 |
commit | 0cb7bf61b1e9f05027de58c80f9b46a714d24e35 (patch) | |
tree | 41fb55cf62d07b425122f9a8b96412c0d8eb99c5 /drivers/infiniband/hw | |
parent | aa877175e7a9982233ed8f10cb4bfddd78d82741 (diff) | |
parent | 3eab887a55424fc2c27553b7bfe32330df83f7b8 (diff) |
Merge branch 'linus' into smp/hotplug
Apply upstream changes to avoid conflicts with pending patches.
Diffstat (limited to 'drivers/infiniband/hw')
27 files changed, 161 insertions, 124 deletions
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c index 3aca7f6171b4..b6a953aed7e8 100644 --- a/drivers/infiniband/hw/cxgb4/cm.c +++ b/drivers/infiniband/hw/cxgb4/cm.c | |||
@@ -1827,8 +1827,12 @@ static int process_mpa_request(struct c4iw_ep *ep, struct sk_buff *skb) | |||
1827 | (ep->mpa_pkt + sizeof(*mpa)); | 1827 | (ep->mpa_pkt + sizeof(*mpa)); |
1828 | ep->ird = ntohs(mpa_v2_params->ird) & | 1828 | ep->ird = ntohs(mpa_v2_params->ird) & |
1829 | MPA_V2_IRD_ORD_MASK; | 1829 | MPA_V2_IRD_ORD_MASK; |
1830 | ep->ird = min_t(u32, ep->ird, | ||
1831 | cur_max_read_depth(ep->com.dev)); | ||
1830 | ep->ord = ntohs(mpa_v2_params->ord) & | 1832 | ep->ord = ntohs(mpa_v2_params->ord) & |
1831 | MPA_V2_IRD_ORD_MASK; | 1833 | MPA_V2_IRD_ORD_MASK; |
1834 | ep->ord = min_t(u32, ep->ord, | ||
1835 | cur_max_read_depth(ep->com.dev)); | ||
1832 | PDBG("%s initiator ird %u ord %u\n", __func__, ep->ird, | 1836 | PDBG("%s initiator ird %u ord %u\n", __func__, ep->ird, |
1833 | ep->ord); | 1837 | ep->ord); |
1834 | if (ntohs(mpa_v2_params->ird) & MPA_V2_PEER2PEER_MODEL) | 1838 | if (ntohs(mpa_v2_params->ird) & MPA_V2_PEER2PEER_MODEL) |
@@ -3136,7 +3140,7 @@ int c4iw_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3136 | if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn) { | 3140 | if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn) { |
3137 | if (conn_param->ord > ep->ird) { | 3141 | if (conn_param->ord > ep->ird) { |
3138 | if (RELAXED_IRD_NEGOTIATION) { | 3142 | if (RELAXED_IRD_NEGOTIATION) { |
3139 | ep->ord = ep->ird; | 3143 | conn_param->ord = ep->ird; |
3140 | } else { | 3144 | } else { |
3141 | ep->ird = conn_param->ird; | 3145 | ep->ird = conn_param->ird; |
3142 | ep->ord = conn_param->ord; | 3146 | ep->ord = conn_param->ord; |
diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c index 812ab7278b8e..ac926c942fee 100644 --- a/drivers/infiniband/hw/cxgb4/cq.c +++ b/drivers/infiniband/hw/cxgb4/cq.c | |||
@@ -1016,15 +1016,15 @@ int c4iw_resize_cq(struct ib_cq *cq, int cqe, struct ib_udata *udata) | |||
1016 | int c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags) | 1016 | int c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags) |
1017 | { | 1017 | { |
1018 | struct c4iw_cq *chp; | 1018 | struct c4iw_cq *chp; |
1019 | int ret; | 1019 | int ret = 0; |
1020 | unsigned long flag; | 1020 | unsigned long flag; |
1021 | 1021 | ||
1022 | chp = to_c4iw_cq(ibcq); | 1022 | chp = to_c4iw_cq(ibcq); |
1023 | spin_lock_irqsave(&chp->lock, flag); | 1023 | spin_lock_irqsave(&chp->lock, flag); |
1024 | ret = t4_arm_cq(&chp->cq, | 1024 | t4_arm_cq(&chp->cq, |
1025 | (flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED); | 1025 | (flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED); |
1026 | if (flags & IB_CQ_REPORT_MISSED_EVENTS) | ||
1027 | ret = t4_cq_notempty(&chp->cq); | ||
1026 | spin_unlock_irqrestore(&chp->lock, flag); | 1028 | spin_unlock_irqrestore(&chp->lock, flag); |
1027 | if (ret && !(flags & IB_CQ_REPORT_MISSED_EVENTS)) | ||
1028 | ret = 0; | ||
1029 | return ret; | 1029 | return ret; |
1030 | } | 1030 | } |
diff --git a/drivers/infiniband/hw/cxgb4/t4.h b/drivers/infiniband/hw/cxgb4/t4.h index 6126bbe36095..02173f4315fa 100644 --- a/drivers/infiniband/hw/cxgb4/t4.h +++ b/drivers/infiniband/hw/cxgb4/t4.h | |||
@@ -634,6 +634,11 @@ static inline int t4_valid_cqe(struct t4_cq *cq, struct t4_cqe *cqe) | |||
634 | return (CQE_GENBIT(cqe) == cq->gen); | 634 | return (CQE_GENBIT(cqe) == cq->gen); |
635 | } | 635 | } |
636 | 636 | ||
637 | static inline int t4_cq_notempty(struct t4_cq *cq) | ||
638 | { | ||
639 | return cq->sw_in_use || t4_valid_cqe(cq, &cq->queue[cq->cidx]); | ||
640 | } | ||
641 | |||
637 | static inline int t4_next_hw_cqe(struct t4_cq *cq, struct t4_cqe **cqe) | 642 | static inline int t4_next_hw_cqe(struct t4_cq *cq, struct t4_cqe **cqe) |
638 | { | 643 | { |
639 | int ret; | 644 | int ret; |
diff --git a/drivers/infiniband/hw/hfi1/affinity.c b/drivers/infiniband/hw/hfi1/affinity.c index 79575ee873f2..0566393e5aba 100644 --- a/drivers/infiniband/hw/hfi1/affinity.c +++ b/drivers/infiniband/hw/hfi1/affinity.c | |||
@@ -47,7 +47,6 @@ | |||
47 | #include <linux/topology.h> | 47 | #include <linux/topology.h> |
48 | #include <linux/cpumask.h> | 48 | #include <linux/cpumask.h> |
49 | #include <linux/module.h> | 49 | #include <linux/module.h> |
50 | #include <linux/cpumask.h> | ||
51 | 50 | ||
52 | #include "hfi.h" | 51 | #include "hfi.h" |
53 | #include "affinity.h" | 52 | #include "affinity.h" |
@@ -682,7 +681,7 @@ int hfi1_set_sdma_affinity(struct hfi1_devdata *dd, const char *buf, | |||
682 | size_t count) | 681 | size_t count) |
683 | { | 682 | { |
684 | struct hfi1_affinity_node *entry; | 683 | struct hfi1_affinity_node *entry; |
685 | struct cpumask mask; | 684 | cpumask_var_t mask; |
686 | int ret, i; | 685 | int ret, i; |
687 | 686 | ||
688 | spin_lock(&node_affinity.lock); | 687 | spin_lock(&node_affinity.lock); |
@@ -692,19 +691,24 @@ int hfi1_set_sdma_affinity(struct hfi1_devdata *dd, const char *buf, | |||
692 | if (!entry) | 691 | if (!entry) |
693 | return -EINVAL; | 692 | return -EINVAL; |
694 | 693 | ||
695 | ret = cpulist_parse(buf, &mask); | 694 | ret = zalloc_cpumask_var(&mask, GFP_KERNEL); |
695 | if (!ret) | ||
696 | return -ENOMEM; | ||
697 | |||
698 | ret = cpulist_parse(buf, mask); | ||
696 | if (ret) | 699 | if (ret) |
697 | return ret; | 700 | goto out; |
698 | 701 | ||
699 | if (!cpumask_subset(&mask, cpu_online_mask) || cpumask_empty(&mask)) { | 702 | if (!cpumask_subset(mask, cpu_online_mask) || cpumask_empty(mask)) { |
700 | dd_dev_warn(dd, "Invalid CPU mask\n"); | 703 | dd_dev_warn(dd, "Invalid CPU mask\n"); |
701 | return -EINVAL; | 704 | ret = -EINVAL; |
705 | goto out; | ||
702 | } | 706 | } |
703 | 707 | ||
704 | mutex_lock(&sdma_affinity_mutex); | 708 | mutex_lock(&sdma_affinity_mutex); |
705 | /* reset the SDMA interrupt affinity details */ | 709 | /* reset the SDMA interrupt affinity details */ |
706 | init_cpu_mask_set(&entry->def_intr); | 710 | init_cpu_mask_set(&entry->def_intr); |
707 | cpumask_copy(&entry->def_intr.mask, &mask); | 711 | cpumask_copy(&entry->def_intr.mask, mask); |
708 | /* | 712 | /* |
709 | * Reassign the affinity for each SDMA interrupt. | 713 | * Reassign the affinity for each SDMA interrupt. |
710 | */ | 714 | */ |
@@ -720,8 +724,9 @@ int hfi1_set_sdma_affinity(struct hfi1_devdata *dd, const char *buf, | |||
720 | if (ret) | 724 | if (ret) |
721 | break; | 725 | break; |
722 | } | 726 | } |
723 | |||
724 | mutex_unlock(&sdma_affinity_mutex); | 727 | mutex_unlock(&sdma_affinity_mutex); |
728 | out: | ||
729 | free_cpumask_var(mask); | ||
725 | return ret ? ret : strnlen(buf, PAGE_SIZE); | 730 | return ret ? ret : strnlen(buf, PAGE_SIZE); |
726 | } | 731 | } |
727 | 732 | ||
diff --git a/drivers/infiniband/hw/hfi1/debugfs.c b/drivers/infiniband/hw/hfi1/debugfs.c index dbab9d9cc288..a49cc88f08a2 100644 --- a/drivers/infiniband/hw/hfi1/debugfs.c +++ b/drivers/infiniband/hw/hfi1/debugfs.c | |||
@@ -223,28 +223,32 @@ DEBUGFS_SEQ_FILE_OPEN(ctx_stats) | |||
223 | DEBUGFS_FILE_OPS(ctx_stats); | 223 | DEBUGFS_FILE_OPS(ctx_stats); |
224 | 224 | ||
225 | static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos) | 225 | static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos) |
226 | __acquires(RCU) | 226 | __acquires(RCU) |
227 | { | 227 | { |
228 | struct qp_iter *iter; | 228 | struct qp_iter *iter; |
229 | loff_t n = *pos; | 229 | loff_t n = *pos; |
230 | 230 | ||
231 | rcu_read_lock(); | ||
232 | iter = qp_iter_init(s->private); | 231 | iter = qp_iter_init(s->private); |
232 | |||
233 | /* stop calls rcu_read_unlock */ | ||
234 | rcu_read_lock(); | ||
235 | |||
233 | if (!iter) | 236 | if (!iter) |
234 | return NULL; | 237 | return NULL; |
235 | 238 | ||
236 | while (n--) { | 239 | do { |
237 | if (qp_iter_next(iter)) { | 240 | if (qp_iter_next(iter)) { |
238 | kfree(iter); | 241 | kfree(iter); |
239 | return NULL; | 242 | return NULL; |
240 | } | 243 | } |
241 | } | 244 | } while (n--); |
242 | 245 | ||
243 | return iter; | 246 | return iter; |
244 | } | 247 | } |
245 | 248 | ||
246 | static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, | 249 | static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, |
247 | loff_t *pos) | 250 | loff_t *pos) |
251 | __must_hold(RCU) | ||
248 | { | 252 | { |
249 | struct qp_iter *iter = iter_ptr; | 253 | struct qp_iter *iter = iter_ptr; |
250 | 254 | ||
@@ -259,7 +263,7 @@ static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, | |||
259 | } | 263 | } |
260 | 264 | ||
261 | static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) | 265 | static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) |
262 | __releases(RCU) | 266 | __releases(RCU) |
263 | { | 267 | { |
264 | rcu_read_unlock(); | 268 | rcu_read_unlock(); |
265 | } | 269 | } |
diff --git a/drivers/infiniband/hw/hfi1/driver.c b/drivers/infiniband/hw/hfi1/driver.c index 8246dc7d0573..303f10555729 100644 --- a/drivers/infiniband/hw/hfi1/driver.c +++ b/drivers/infiniband/hw/hfi1/driver.c | |||
@@ -888,14 +888,15 @@ void set_all_slowpath(struct hfi1_devdata *dd) | |||
888 | } | 888 | } |
889 | 889 | ||
890 | static inline int set_armed_to_active(struct hfi1_ctxtdata *rcd, | 890 | static inline int set_armed_to_active(struct hfi1_ctxtdata *rcd, |
891 | struct hfi1_packet packet, | 891 | struct hfi1_packet *packet, |
892 | struct hfi1_devdata *dd) | 892 | struct hfi1_devdata *dd) |
893 | { | 893 | { |
894 | struct work_struct *lsaw = &rcd->ppd->linkstate_active_work; | 894 | struct work_struct *lsaw = &rcd->ppd->linkstate_active_work; |
895 | struct hfi1_message_header *hdr = hfi1_get_msgheader(packet.rcd->dd, | 895 | struct hfi1_message_header *hdr = hfi1_get_msgheader(packet->rcd->dd, |
896 | packet.rhf_addr); | 896 | packet->rhf_addr); |
897 | u8 etype = rhf_rcv_type(packet->rhf); | ||
897 | 898 | ||
898 | if (hdr2sc(hdr, packet.rhf) != 0xf) { | 899 | if (etype == RHF_RCV_TYPE_IB && hdr2sc(hdr, packet->rhf) != 0xf) { |
899 | int hwstate = read_logical_state(dd); | 900 | int hwstate = read_logical_state(dd); |
900 | 901 | ||
901 | if (hwstate != LSTATE_ACTIVE) { | 902 | if (hwstate != LSTATE_ACTIVE) { |
@@ -979,7 +980,7 @@ int handle_receive_interrupt(struct hfi1_ctxtdata *rcd, int thread) | |||
979 | /* Auto activate link on non-SC15 packet receive */ | 980 | /* Auto activate link on non-SC15 packet receive */ |
980 | if (unlikely(rcd->ppd->host_link_state == | 981 | if (unlikely(rcd->ppd->host_link_state == |
981 | HLS_UP_ARMED) && | 982 | HLS_UP_ARMED) && |
982 | set_armed_to_active(rcd, packet, dd)) | 983 | set_armed_to_active(rcd, &packet, dd)) |
983 | goto bail; | 984 | goto bail; |
984 | last = process_rcv_packet(&packet, thread); | 985 | last = process_rcv_packet(&packet, thread); |
985 | } | 986 | } |
diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c index 1ecbec192358..7e03ccd2554d 100644 --- a/drivers/infiniband/hw/hfi1/file_ops.c +++ b/drivers/infiniband/hw/hfi1/file_ops.c | |||
@@ -183,6 +183,7 @@ static int hfi1_file_open(struct inode *inode, struct file *fp) | |||
183 | if (fd) { | 183 | if (fd) { |
184 | fd->rec_cpu_num = -1; /* no cpu affinity by default */ | 184 | fd->rec_cpu_num = -1; /* no cpu affinity by default */ |
185 | fd->mm = current->mm; | 185 | fd->mm = current->mm; |
186 | atomic_inc(&fd->mm->mm_count); | ||
186 | } | 187 | } |
187 | 188 | ||
188 | fp->private_data = fd; | 189 | fp->private_data = fd; |
@@ -222,7 +223,7 @@ static long hfi1_file_ioctl(struct file *fp, unsigned int cmd, | |||
222 | ret = assign_ctxt(fp, &uinfo); | 223 | ret = assign_ctxt(fp, &uinfo); |
223 | if (ret < 0) | 224 | if (ret < 0) |
224 | return ret; | 225 | return ret; |
225 | setup_ctxt(fp); | 226 | ret = setup_ctxt(fp); |
226 | if (ret) | 227 | if (ret) |
227 | return ret; | 228 | return ret; |
228 | ret = user_init(fp); | 229 | ret = user_init(fp); |
@@ -779,6 +780,7 @@ static int hfi1_file_close(struct inode *inode, struct file *fp) | |||
779 | mutex_unlock(&hfi1_mutex); | 780 | mutex_unlock(&hfi1_mutex); |
780 | hfi1_free_ctxtdata(dd, uctxt); | 781 | hfi1_free_ctxtdata(dd, uctxt); |
781 | done: | 782 | done: |
783 | mmdrop(fdata->mm); | ||
782 | kobject_put(&dd->kobj); | 784 | kobject_put(&dd->kobj); |
783 | kfree(fdata); | 785 | kfree(fdata); |
784 | return 0; | 786 | return 0; |
diff --git a/drivers/infiniband/hw/hfi1/hfi.h b/drivers/infiniband/hw/hfi1/hfi.h index 1000e0fd96d9..a021e660d482 100644 --- a/drivers/infiniband/hw/hfi1/hfi.h +++ b/drivers/infiniband/hw/hfi1/hfi.h | |||
@@ -1272,9 +1272,26 @@ static inline int hdr2sc(struct hfi1_message_header *hdr, u64 rhf) | |||
1272 | ((!!(rhf_dc_info(rhf))) << 4); | 1272 | ((!!(rhf_dc_info(rhf))) << 4); |
1273 | } | 1273 | } |
1274 | 1274 | ||
1275 | #define HFI1_JKEY_WIDTH 16 | ||
1276 | #define HFI1_JKEY_MASK (BIT(16) - 1) | ||
1277 | #define HFI1_ADMIN_JKEY_RANGE 32 | ||
1278 | |||
1279 | /* | ||
1280 | * J_KEYs are split and allocated in the following groups: | ||
1281 | * 0 - 31 - users with administrator privileges | ||
1282 | * 32 - 63 - kernel protocols using KDETH packets | ||
1283 | * 64 - 65535 - all other users using KDETH packets | ||
1284 | */ | ||
1275 | static inline u16 generate_jkey(kuid_t uid) | 1285 | static inline u16 generate_jkey(kuid_t uid) |
1276 | { | 1286 | { |
1277 | return from_kuid(current_user_ns(), uid) & 0xffff; | 1287 | u16 jkey = from_kuid(current_user_ns(), uid) & HFI1_JKEY_MASK; |
1288 | |||
1289 | if (capable(CAP_SYS_ADMIN)) | ||
1290 | jkey &= HFI1_ADMIN_JKEY_RANGE - 1; | ||
1291 | else if (jkey < 64) | ||
1292 | jkey |= BIT(HFI1_JKEY_WIDTH - 1); | ||
1293 | |||
1294 | return jkey; | ||
1278 | } | 1295 | } |
1279 | 1296 | ||
1280 | /* | 1297 | /* |
@@ -1656,7 +1673,6 @@ struct cc_state *get_cc_state_protected(struct hfi1_pportdata *ppd) | |||
1656 | struct hfi1_devdata *hfi1_init_dd(struct pci_dev *, | 1673 | struct hfi1_devdata *hfi1_init_dd(struct pci_dev *, |
1657 | const struct pci_device_id *); | 1674 | const struct pci_device_id *); |
1658 | void hfi1_free_devdata(struct hfi1_devdata *); | 1675 | void hfi1_free_devdata(struct hfi1_devdata *); |
1659 | void cc_state_reclaim(struct rcu_head *rcu); | ||
1660 | struct hfi1_devdata *hfi1_alloc_devdata(struct pci_dev *pdev, size_t extra); | 1676 | struct hfi1_devdata *hfi1_alloc_devdata(struct pci_dev *pdev, size_t extra); |
1661 | 1677 | ||
1662 | /* LED beaconing functions */ | 1678 | /* LED beaconing functions */ |
diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c index a358d23ecd54..b7935451093c 100644 --- a/drivers/infiniband/hw/hfi1/init.c +++ b/drivers/infiniband/hw/hfi1/init.c | |||
@@ -1333,7 +1333,7 @@ static void cleanup_device_data(struct hfi1_devdata *dd) | |||
1333 | spin_unlock(&ppd->cc_state_lock); | 1333 | spin_unlock(&ppd->cc_state_lock); |
1334 | 1334 | ||
1335 | if (cc_state) | 1335 | if (cc_state) |
1336 | call_rcu(&cc_state->rcu, cc_state_reclaim); | 1336 | kfree_rcu(cc_state, rcu); |
1337 | } | 1337 | } |
1338 | 1338 | ||
1339 | free_credit_return(dd); | 1339 | free_credit_return(dd); |
diff --git a/drivers/infiniband/hw/hfi1/mad.c b/drivers/infiniband/hw/hfi1/mad.c index 1263abe01999..39e42c373a01 100644 --- a/drivers/infiniband/hw/hfi1/mad.c +++ b/drivers/infiniband/hw/hfi1/mad.c | |||
@@ -1819,6 +1819,11 @@ static int __subn_get_opa_cable_info(struct opa_smp *smp, u32 am, u8 *data, | |||
1819 | u32 len = OPA_AM_CI_LEN(am) + 1; | 1819 | u32 len = OPA_AM_CI_LEN(am) + 1; |
1820 | int ret; | 1820 | int ret; |
1821 | 1821 | ||
1822 | if (dd->pport->port_type != PORT_TYPE_QSFP) { | ||
1823 | smp->status |= IB_SMP_INVALID_FIELD; | ||
1824 | return reply((struct ib_mad_hdr *)smp); | ||
1825 | } | ||
1826 | |||
1822 | #define __CI_PAGE_SIZE BIT(7) /* 128 bytes */ | 1827 | #define __CI_PAGE_SIZE BIT(7) /* 128 bytes */ |
1823 | #define __CI_PAGE_MASK ~(__CI_PAGE_SIZE - 1) | 1828 | #define __CI_PAGE_MASK ~(__CI_PAGE_SIZE - 1) |
1824 | #define __CI_PAGE_NUM(a) ((a) & __CI_PAGE_MASK) | 1829 | #define __CI_PAGE_NUM(a) ((a) & __CI_PAGE_MASK) |
@@ -3398,7 +3403,7 @@ static void apply_cc_state(struct hfi1_pportdata *ppd) | |||
3398 | 3403 | ||
3399 | spin_unlock(&ppd->cc_state_lock); | 3404 | spin_unlock(&ppd->cc_state_lock); |
3400 | 3405 | ||
3401 | call_rcu(&old_cc_state->rcu, cc_state_reclaim); | 3406 | kfree_rcu(old_cc_state, rcu); |
3402 | } | 3407 | } |
3403 | 3408 | ||
3404 | static int __subn_set_opa_cong_setting(struct opa_smp *smp, u32 am, u8 *data, | 3409 | static int __subn_set_opa_cong_setting(struct opa_smp *smp, u32 am, u8 *data, |
@@ -3553,13 +3558,6 @@ static int __subn_get_opa_cc_table(struct opa_smp *smp, u32 am, u8 *data, | |||
3553 | return reply((struct ib_mad_hdr *)smp); | 3558 | return reply((struct ib_mad_hdr *)smp); |
3554 | } | 3559 | } |
3555 | 3560 | ||
3556 | void cc_state_reclaim(struct rcu_head *rcu) | ||
3557 | { | ||
3558 | struct cc_state *cc_state = container_of(rcu, struct cc_state, rcu); | ||
3559 | |||
3560 | kfree(cc_state); | ||
3561 | } | ||
3562 | |||
3563 | static int __subn_set_opa_cc_table(struct opa_smp *smp, u32 am, u8 *data, | 3561 | static int __subn_set_opa_cc_table(struct opa_smp *smp, u32 am, u8 *data, |
3564 | struct ib_device *ibdev, u8 port, | 3562 | struct ib_device *ibdev, u8 port, |
3565 | u32 *resp_len) | 3563 | u32 *resp_len) |
diff --git a/drivers/infiniband/hw/hfi1/qp.c b/drivers/infiniband/hw/hfi1/qp.c index a5aa3517e7d5..4e4d8317c281 100644 --- a/drivers/infiniband/hw/hfi1/qp.c +++ b/drivers/infiniband/hw/hfi1/qp.c | |||
@@ -656,10 +656,6 @@ struct qp_iter *qp_iter_init(struct hfi1_ibdev *dev) | |||
656 | 656 | ||
657 | iter->dev = dev; | 657 | iter->dev = dev; |
658 | iter->specials = dev->rdi.ibdev.phys_port_cnt * 2; | 658 | iter->specials = dev->rdi.ibdev.phys_port_cnt * 2; |
659 | if (qp_iter_next(iter)) { | ||
660 | kfree(iter); | ||
661 | return NULL; | ||
662 | } | ||
663 | 659 | ||
664 | return iter; | 660 | return iter; |
665 | } | 661 | } |
diff --git a/drivers/infiniband/hw/hfi1/qsfp.c b/drivers/infiniband/hw/hfi1/qsfp.c index a207717ade2a..4e95ad810847 100644 --- a/drivers/infiniband/hw/hfi1/qsfp.c +++ b/drivers/infiniband/hw/hfi1/qsfp.c | |||
@@ -706,8 +706,8 @@ int get_cable_info(struct hfi1_devdata *dd, u32 port_num, u32 addr, u32 len, | |||
706 | u8 *data) | 706 | u8 *data) |
707 | { | 707 | { |
708 | struct hfi1_pportdata *ppd; | 708 | struct hfi1_pportdata *ppd; |
709 | u32 excess_len = 0; | 709 | u32 excess_len = len; |
710 | int ret = 0; | 710 | int ret = 0, offset = 0; |
711 | 711 | ||
712 | if (port_num > dd->num_pports || port_num < 1) { | 712 | if (port_num > dd->num_pports || port_num < 1) { |
713 | dd_dev_info(dd, "%s: Invalid port number %d\n", | 713 | dd_dev_info(dd, "%s: Invalid port number %d\n", |
@@ -740,6 +740,34 @@ int get_cable_info(struct hfi1_devdata *dd, u32 port_num, u32 addr, u32 len, | |||
740 | } | 740 | } |
741 | 741 | ||
742 | memcpy(data, &ppd->qsfp_info.cache[addr], len); | 742 | memcpy(data, &ppd->qsfp_info.cache[addr], len); |
743 | |||
744 | if (addr <= QSFP_MONITOR_VAL_END && | ||
745 | (addr + len) >= QSFP_MONITOR_VAL_START) { | ||
746 | /* Overlap with the dynamic channel monitor range */ | ||
747 | if (addr < QSFP_MONITOR_VAL_START) { | ||
748 | if (addr + len <= QSFP_MONITOR_VAL_END) | ||
749 | len = addr + len - QSFP_MONITOR_VAL_START; | ||
750 | else | ||
751 | len = QSFP_MONITOR_RANGE; | ||
752 | offset = QSFP_MONITOR_VAL_START - addr; | ||
753 | addr = QSFP_MONITOR_VAL_START; | ||
754 | } else if (addr == QSFP_MONITOR_VAL_START) { | ||
755 | offset = 0; | ||
756 | if (addr + len > QSFP_MONITOR_VAL_END) | ||
757 | len = QSFP_MONITOR_RANGE; | ||
758 | } else { | ||
759 | offset = 0; | ||
760 | if (addr + len > QSFP_MONITOR_VAL_END) | ||
761 | len = QSFP_MONITOR_VAL_END - addr + 1; | ||
762 | } | ||
763 | /* Refresh the values of the dynamic monitors from the cable */ | ||
764 | ret = one_qsfp_read(ppd, dd->hfi1_id, addr, data + offset, len); | ||
765 | if (ret != len) { | ||
766 | ret = -EAGAIN; | ||
767 | goto set_zeroes; | ||
768 | } | ||
769 | } | ||
770 | |||
743 | return 0; | 771 | return 0; |
744 | 772 | ||
745 | set_zeroes: | 773 | set_zeroes: |
diff --git a/drivers/infiniband/hw/hfi1/qsfp.h b/drivers/infiniband/hw/hfi1/qsfp.h index 69275ebd9597..36cf52359848 100644 --- a/drivers/infiniband/hw/hfi1/qsfp.h +++ b/drivers/infiniband/hw/hfi1/qsfp.h | |||
@@ -74,6 +74,9 @@ | |||
74 | /* Defined fields that Intel requires of qualified cables */ | 74 | /* Defined fields that Intel requires of qualified cables */ |
75 | /* Byte 0 is Identifier, not checked */ | 75 | /* Byte 0 is Identifier, not checked */ |
76 | /* Byte 1 is reserved "status MSB" */ | 76 | /* Byte 1 is reserved "status MSB" */ |
77 | #define QSFP_MONITOR_VAL_START 22 | ||
78 | #define QSFP_MONITOR_VAL_END 81 | ||
79 | #define QSFP_MONITOR_RANGE (QSFP_MONITOR_VAL_END - QSFP_MONITOR_VAL_START + 1) | ||
77 | #define QSFP_TX_CTRL_BYTE_OFFS 86 | 80 | #define QSFP_TX_CTRL_BYTE_OFFS 86 |
78 | #define QSFP_PWR_CTRL_BYTE_OFFS 93 | 81 | #define QSFP_PWR_CTRL_BYTE_OFFS 93 |
79 | #define QSFP_CDR_CTRL_BYTE_OFFS 98 | 82 | #define QSFP_CDR_CTRL_BYTE_OFFS 98 |
diff --git a/drivers/infiniband/hw/i40iw/i40iw.h b/drivers/infiniband/hw/i40iw/i40iw.h index b738acdb9b02..8ec09e470f84 100644 --- a/drivers/infiniband/hw/i40iw/i40iw.h +++ b/drivers/infiniband/hw/i40iw/i40iw.h | |||
@@ -232,7 +232,7 @@ struct i40iw_device { | |||
232 | struct i40e_client *client; | 232 | struct i40e_client *client; |
233 | struct i40iw_hw hw; | 233 | struct i40iw_hw hw; |
234 | struct i40iw_cm_core cm_core; | 234 | struct i40iw_cm_core cm_core; |
235 | unsigned long *mem_resources; | 235 | u8 *mem_resources; |
236 | unsigned long *allocated_qps; | 236 | unsigned long *allocated_qps; |
237 | unsigned long *allocated_cqs; | 237 | unsigned long *allocated_cqs; |
238 | unsigned long *allocated_mrs; | 238 | unsigned long *allocated_mrs; |
@@ -435,8 +435,8 @@ static inline int i40iw_alloc_resource(struct i40iw_device *iwdev, | |||
435 | *next = resource_num + 1; | 435 | *next = resource_num + 1; |
436 | if (*next == max_resources) | 436 | if (*next == max_resources) |
437 | *next = 0; | 437 | *next = 0; |
438 | spin_unlock_irqrestore(&iwdev->resource_lock, flags); | ||
439 | *req_resource_num = resource_num; | 438 | *req_resource_num = resource_num; |
439 | spin_unlock_irqrestore(&iwdev->resource_lock, flags); | ||
440 | 440 | ||
441 | return 0; | 441 | return 0; |
442 | } | 442 | } |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.c b/drivers/infiniband/hw/i40iw/i40iw_cm.c index 5026dc79978a..7ca0638579c0 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_cm.c +++ b/drivers/infiniband/hw/i40iw/i40iw_cm.c | |||
@@ -535,8 +535,8 @@ static struct i40iw_puda_buf *i40iw_form_cm_frame(struct i40iw_cm_node *cm_node, | |||
535 | buf += hdr_len; | 535 | buf += hdr_len; |
536 | } | 536 | } |
537 | 537 | ||
538 | if (pd_len) | 538 | if (pdata && pdata->addr) |
539 | memcpy(buf, pdata->addr, pd_len); | 539 | memcpy(buf, pdata->addr, pdata->size); |
540 | 540 | ||
541 | atomic_set(&sqbuf->refcount, 1); | 541 | atomic_set(&sqbuf->refcount, 1); |
542 | 542 | ||
@@ -3347,26 +3347,6 @@ int i40iw_cm_disconn(struct i40iw_qp *iwqp) | |||
3347 | } | 3347 | } |
3348 | 3348 | ||
3349 | /** | 3349 | /** |
3350 | * i40iw_loopback_nop - Send a nop | ||
3351 | * @qp: associated hw qp | ||
3352 | */ | ||
3353 | static void i40iw_loopback_nop(struct i40iw_sc_qp *qp) | ||
3354 | { | ||
3355 | u64 *wqe; | ||
3356 | u64 header; | ||
3357 | |||
3358 | wqe = qp->qp_uk.sq_base->elem; | ||
3359 | set_64bit_val(wqe, 0, 0); | ||
3360 | set_64bit_val(wqe, 8, 0); | ||
3361 | set_64bit_val(wqe, 16, 0); | ||
3362 | |||
3363 | header = LS_64(I40IWQP_OP_NOP, I40IWQPSQ_OPCODE) | | ||
3364 | LS_64(0, I40IWQPSQ_SIGCOMPL) | | ||
3365 | LS_64(qp->qp_uk.swqe_polarity, I40IWQPSQ_VALID); | ||
3366 | set_64bit_val(wqe, 24, header); | ||
3367 | } | ||
3368 | |||
3369 | /** | ||
3370 | * i40iw_qp_disconnect - free qp and close cm | 3350 | * i40iw_qp_disconnect - free qp and close cm |
3371 | * @iwqp: associate qp for the connection | 3351 | * @iwqp: associate qp for the connection |
3372 | */ | 3352 | */ |
@@ -3638,7 +3618,7 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
3638 | } else { | 3618 | } else { |
3639 | if (iwqp->page) | 3619 | if (iwqp->page) |
3640 | iwqp->sc_qp.qp_uk.sq_base = kmap(iwqp->page); | 3620 | iwqp->sc_qp.qp_uk.sq_base = kmap(iwqp->page); |
3641 | i40iw_loopback_nop(&iwqp->sc_qp); | 3621 | dev->iw_priv_qp_ops->qp_send_lsmm(&iwqp->sc_qp, NULL, 0, 0); |
3642 | } | 3622 | } |
3643 | 3623 | ||
3644 | if (iwqp->page) | 3624 | if (iwqp->page) |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c index 6e9081380a27..0cbbe4038298 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_main.c +++ b/drivers/infiniband/hw/i40iw/i40iw_main.c | |||
@@ -1558,6 +1558,10 @@ static int i40iw_open(struct i40e_info *ldev, struct i40e_client *client) | |||
1558 | enum i40iw_status_code status; | 1558 | enum i40iw_status_code status; |
1559 | struct i40iw_handler *hdl; | 1559 | struct i40iw_handler *hdl; |
1560 | 1560 | ||
1561 | hdl = i40iw_find_netdev(ldev->netdev); | ||
1562 | if (hdl) | ||
1563 | return 0; | ||
1564 | |||
1561 | hdl = kzalloc(sizeof(*hdl), GFP_KERNEL); | 1565 | hdl = kzalloc(sizeof(*hdl), GFP_KERNEL); |
1562 | if (!hdl) | 1566 | if (!hdl) |
1563 | return -ENOMEM; | 1567 | return -ENOMEM; |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_utils.c b/drivers/infiniband/hw/i40iw/i40iw_utils.c index 0e8db0a35141..6fd043b1d714 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_utils.c +++ b/drivers/infiniband/hw/i40iw/i40iw_utils.c | |||
@@ -673,8 +673,11 @@ enum i40iw_status_code i40iw_free_virt_mem(struct i40iw_hw *hw, | |||
673 | { | 673 | { |
674 | if (!mem) | 674 | if (!mem) |
675 | return I40IW_ERR_PARAM; | 675 | return I40IW_ERR_PARAM; |
676 | /* | ||
677 | * mem->va points to the parent of mem, so both mem and mem->va | ||
678 | * can not be touched once mem->va is freed | ||
679 | */ | ||
676 | kfree(mem->va); | 680 | kfree(mem->va); |
677 | mem->va = NULL; | ||
678 | return 0; | 681 | return 0; |
679 | } | 682 | } |
680 | 683 | ||
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c index 2360338877bf..6329c971c22f 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c +++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c | |||
@@ -794,7 +794,6 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd, | |||
794 | return &iwqp->ibqp; | 794 | return &iwqp->ibqp; |
795 | error: | 795 | error: |
796 | i40iw_free_qp_resources(iwdev, iwqp, qp_num); | 796 | i40iw_free_qp_resources(iwdev, iwqp, qp_num); |
797 | kfree(mem); | ||
798 | return ERR_PTR(err_code); | 797 | return ERR_PTR(err_code); |
799 | } | 798 | } |
800 | 799 | ||
@@ -1926,8 +1925,7 @@ static int i40iw_dereg_mr(struct ib_mr *ib_mr) | |||
1926 | } | 1925 | } |
1927 | if (iwpbl->pbl_allocated) | 1926 | if (iwpbl->pbl_allocated) |
1928 | i40iw_free_pble(iwdev->pble_rsrc, palloc); | 1927 | i40iw_free_pble(iwdev->pble_rsrc, palloc); |
1929 | kfree(iwpbl->iwmr); | 1928 | kfree(iwmr); |
1930 | iwpbl->iwmr = NULL; | ||
1931 | return 0; | 1929 | return 0; |
1932 | } | 1930 | } |
1933 | 1931 | ||
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index d6fc8a6e8c33..006db6436e3b 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c | |||
@@ -576,8 +576,8 @@ static int mlx4_ib_ipoib_csum_ok(__be16 status, __be16 checksum) | |||
576 | checksum == cpu_to_be16(0xffff); | 576 | checksum == cpu_to_be16(0xffff); |
577 | } | 577 | } |
578 | 578 | ||
579 | static int use_tunnel_data(struct mlx4_ib_qp *qp, struct mlx4_ib_cq *cq, struct ib_wc *wc, | 579 | static void use_tunnel_data(struct mlx4_ib_qp *qp, struct mlx4_ib_cq *cq, struct ib_wc *wc, |
580 | unsigned tail, struct mlx4_cqe *cqe, int is_eth) | 580 | unsigned tail, struct mlx4_cqe *cqe, int is_eth) |
581 | { | 581 | { |
582 | struct mlx4_ib_proxy_sqp_hdr *hdr; | 582 | struct mlx4_ib_proxy_sqp_hdr *hdr; |
583 | 583 | ||
@@ -600,8 +600,6 @@ static int use_tunnel_data(struct mlx4_ib_qp *qp, struct mlx4_ib_cq *cq, struct | |||
600 | wc->slid = be16_to_cpu(hdr->tun.slid_mac_47_32); | 600 | wc->slid = be16_to_cpu(hdr->tun.slid_mac_47_32); |
601 | wc->sl = (u8) (be16_to_cpu(hdr->tun.sl_vid) >> 12); | 601 | wc->sl = (u8) (be16_to_cpu(hdr->tun.sl_vid) >> 12); |
602 | } | 602 | } |
603 | |||
604 | return 0; | ||
605 | } | 603 | } |
606 | 604 | ||
607 | static void mlx4_ib_qp_sw_comp(struct mlx4_ib_qp *qp, int num_entries, | 605 | static void mlx4_ib_qp_sw_comp(struct mlx4_ib_qp *qp, int num_entries, |
@@ -692,7 +690,7 @@ repoll: | |||
692 | if (unlikely((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) == MLX4_OPCODE_NOP && | 690 | if (unlikely((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) == MLX4_OPCODE_NOP && |
693 | is_send)) { | 691 | is_send)) { |
694 | pr_warn("Completion for NOP opcode detected!\n"); | 692 | pr_warn("Completion for NOP opcode detected!\n"); |
695 | return -EINVAL; | 693 | return -EAGAIN; |
696 | } | 694 | } |
697 | 695 | ||
698 | /* Resize CQ in progress */ | 696 | /* Resize CQ in progress */ |
@@ -723,7 +721,7 @@ repoll: | |||
723 | if (unlikely(!mqp)) { | 721 | if (unlikely(!mqp)) { |
724 | pr_warn("CQ %06x with entry for unknown QPN %06x\n", | 722 | pr_warn("CQ %06x with entry for unknown QPN %06x\n", |
725 | cq->mcq.cqn, be32_to_cpu(cqe->vlan_my_qpn) & MLX4_CQE_QPN_MASK); | 723 | cq->mcq.cqn, be32_to_cpu(cqe->vlan_my_qpn) & MLX4_CQE_QPN_MASK); |
726 | return -EINVAL; | 724 | return -EAGAIN; |
727 | } | 725 | } |
728 | 726 | ||
729 | *cur_qp = to_mibqp(mqp); | 727 | *cur_qp = to_mibqp(mqp); |
@@ -741,7 +739,7 @@ repoll: | |||
741 | if (unlikely(!msrq)) { | 739 | if (unlikely(!msrq)) { |
742 | pr_warn("CQ %06x with entry for unknown SRQN %06x\n", | 740 | pr_warn("CQ %06x with entry for unknown SRQN %06x\n", |
743 | cq->mcq.cqn, srq_num); | 741 | cq->mcq.cqn, srq_num); |
744 | return -EINVAL; | 742 | return -EAGAIN; |
745 | } | 743 | } |
746 | } | 744 | } |
747 | 745 | ||
@@ -852,9 +850,11 @@ repoll: | |||
852 | if (mlx4_is_mfunc(to_mdev(cq->ibcq.device)->dev)) { | 850 | if (mlx4_is_mfunc(to_mdev(cq->ibcq.device)->dev)) { |
853 | if ((*cur_qp)->mlx4_ib_qp_type & | 851 | if ((*cur_qp)->mlx4_ib_qp_type & |
854 | (MLX4_IB_QPT_PROXY_SMI_OWNER | | 852 | (MLX4_IB_QPT_PROXY_SMI_OWNER | |
855 | MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_GSI)) | 853 | MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_GSI)) { |
856 | return use_tunnel_data(*cur_qp, cq, wc, tail, | 854 | use_tunnel_data(*cur_qp, cq, wc, tail, cqe, |
857 | cqe, is_eth); | 855 | is_eth); |
856 | return 0; | ||
857 | } | ||
858 | } | 858 | } |
859 | 859 | ||
860 | wc->slid = be16_to_cpu(cqe->rlid); | 860 | wc->slid = be16_to_cpu(cqe->rlid); |
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index a84bb766fc62..1b4094baa2de 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #include <linux/pci.h> | 37 | #include <linux/pci.h> |
38 | #include <linux/dma-mapping.h> | 38 | #include <linux/dma-mapping.h> |
39 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
40 | #include <linux/io-mapping.h> | ||
41 | #if defined(CONFIG_X86) | 40 | #if defined(CONFIG_X86) |
42 | #include <asm/pat.h> | 41 | #include <asm/pat.h> |
43 | #endif | 42 | #endif |
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c index 16740dcb876b..67fc0b6857e1 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c | |||
@@ -1156,18 +1156,18 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev, | |||
1156 | attr->max_srq = | 1156 | attr->max_srq = |
1157 | (rsp->max_srq_rpir_qps & OCRDMA_MBX_QUERY_CFG_MAX_SRQ_MASK) >> | 1157 | (rsp->max_srq_rpir_qps & OCRDMA_MBX_QUERY_CFG_MAX_SRQ_MASK) >> |
1158 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_OFFSET; | 1158 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_OFFSET; |
1159 | attr->max_send_sge = ((rsp->max_write_send_sge & | 1159 | attr->max_send_sge = ((rsp->max_recv_send_sge & |
1160 | OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >> | 1160 | OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >> |
1161 | OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT); | 1161 | OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT); |
1162 | attr->max_recv_sge = (rsp->max_write_send_sge & | 1162 | attr->max_recv_sge = (rsp->max_recv_send_sge & |
1163 | OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >> | 1163 | OCRDMA_MBX_QUERY_CFG_MAX_RECV_SGE_MASK) >> |
1164 | OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT; | 1164 | OCRDMA_MBX_QUERY_CFG_MAX_RECV_SGE_SHIFT; |
1165 | attr->max_srq_sge = (rsp->max_srq_rqe_sge & | 1165 | attr->max_srq_sge = (rsp->max_srq_rqe_sge & |
1166 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >> | 1166 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >> |
1167 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET; | 1167 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET; |
1168 | attr->max_rdma_sge = (rsp->max_write_send_sge & | 1168 | attr->max_rdma_sge = (rsp->max_wr_rd_sge & |
1169 | OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_MASK) >> | 1169 | OCRDMA_MBX_QUERY_CFG_MAX_RD_SGE_MASK) >> |
1170 | OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT; | 1170 | OCRDMA_MBX_QUERY_CFG_MAX_RD_SGE_SHIFT; |
1171 | attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp & | 1171 | attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp & |
1172 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >> | 1172 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >> |
1173 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; | 1173 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; |
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h index 0efc9662c6d8..37df4481bb8f 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h +++ b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h | |||
@@ -554,9 +554,9 @@ enum { | |||
554 | OCRDMA_MBX_QUERY_CFG_L3_TYPE_MASK = 0x18, | 554 | OCRDMA_MBX_QUERY_CFG_L3_TYPE_MASK = 0x18, |
555 | OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT = 0, | 555 | OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT = 0, |
556 | OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK = 0xFFFF, | 556 | OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK = 0xFFFF, |
557 | OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT = 16, | 557 | OCRDMA_MBX_QUERY_CFG_MAX_RECV_SGE_SHIFT = 16, |
558 | OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_MASK = 0xFFFF << | 558 | OCRDMA_MBX_QUERY_CFG_MAX_RECV_SGE_MASK = 0xFFFF << |
559 | OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT, | 559 | OCRDMA_MBX_QUERY_CFG_MAX_RECV_SGE_SHIFT, |
560 | 560 | ||
561 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT = 0, | 561 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT = 0, |
562 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK = 0xFFFF, | 562 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK = 0xFFFF, |
@@ -612,6 +612,8 @@ enum { | |||
612 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET = 0, | 612 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET = 0, |
613 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK = 0xFFFF << | 613 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK = 0xFFFF << |
614 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET, | 614 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET, |
615 | OCRDMA_MBX_QUERY_CFG_MAX_RD_SGE_SHIFT = 0, | ||
616 | OCRDMA_MBX_QUERY_CFG_MAX_RD_SGE_MASK = 0xFFFF, | ||
615 | }; | 617 | }; |
616 | 618 | ||
617 | struct ocrdma_mbx_query_config { | 619 | struct ocrdma_mbx_query_config { |
@@ -619,7 +621,7 @@ struct ocrdma_mbx_query_config { | |||
619 | struct ocrdma_mbx_rsp rsp; | 621 | struct ocrdma_mbx_rsp rsp; |
620 | u32 qp_srq_cq_ird_ord; | 622 | u32 qp_srq_cq_ird_ord; |
621 | u32 max_pd_ca_ack_delay; | 623 | u32 max_pd_ca_ack_delay; |
622 | u32 max_write_send_sge; | 624 | u32 max_recv_send_sge; |
623 | u32 max_ird_ord_per_qp; | 625 | u32 max_ird_ord_per_qp; |
624 | u32 max_shared_ird_ord; | 626 | u32 max_shared_ird_ord; |
625 | u32 max_mr; | 627 | u32 max_mr; |
@@ -639,6 +641,8 @@ struct ocrdma_mbx_query_config { | |||
639 | u32 max_wqes_rqes_per_q; | 641 | u32 max_wqes_rqes_per_q; |
640 | u32 max_cq_cqes_per_cq; | 642 | u32 max_cq_cqes_per_cq; |
641 | u32 max_srq_rqe_sge; | 643 | u32 max_srq_rqe_sge; |
644 | u32 max_wr_rd_sge; | ||
645 | u32 ird_pgsz_num_pages; | ||
642 | }; | 646 | }; |
643 | 647 | ||
644 | struct ocrdma_fw_ver_rsp { | 648 | struct ocrdma_fw_ver_rsp { |
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c index b1a3d91fe8b9..0aa854737e74 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | |||
@@ -125,8 +125,8 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr, | |||
125 | IB_DEVICE_SYS_IMAGE_GUID | | 125 | IB_DEVICE_SYS_IMAGE_GUID | |
126 | IB_DEVICE_LOCAL_DMA_LKEY | | 126 | IB_DEVICE_LOCAL_DMA_LKEY | |
127 | IB_DEVICE_MEM_MGT_EXTENSIONS; | 127 | IB_DEVICE_MEM_MGT_EXTENSIONS; |
128 | attr->max_sge = dev->attr.max_send_sge; | 128 | attr->max_sge = min(dev->attr.max_send_sge, dev->attr.max_recv_sge); |
129 | attr->max_sge_rd = attr->max_sge; | 129 | attr->max_sge_rd = dev->attr.max_rdma_sge; |
130 | attr->max_cq = dev->attr.max_cq; | 130 | attr->max_cq = dev->attr.max_cq; |
131 | attr->max_cqe = dev->attr.max_cqe; | 131 | attr->max_cqe = dev->attr.max_cqe; |
132 | attr->max_mr = dev->attr.max_mr; | 132 | attr->max_mr = dev->attr.max_mr; |
diff --git a/drivers/infiniband/hw/qib/qib_debugfs.c b/drivers/infiniband/hw/qib/qib_debugfs.c index 5e75b43c596b..5bad8e3b40bb 100644 --- a/drivers/infiniband/hw/qib/qib_debugfs.c +++ b/drivers/infiniband/hw/qib/qib_debugfs.c | |||
@@ -189,27 +189,32 @@ static int _ctx_stats_seq_show(struct seq_file *s, void *v) | |||
189 | DEBUGFS_FILE(ctx_stats) | 189 | DEBUGFS_FILE(ctx_stats) |
190 | 190 | ||
191 | static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos) | 191 | static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos) |
192 | __acquires(RCU) | ||
192 | { | 193 | { |
193 | struct qib_qp_iter *iter; | 194 | struct qib_qp_iter *iter; |
194 | loff_t n = *pos; | 195 | loff_t n = *pos; |
195 | 196 | ||
196 | rcu_read_lock(); | ||
197 | iter = qib_qp_iter_init(s->private); | 197 | iter = qib_qp_iter_init(s->private); |
198 | |||
199 | /* stop calls rcu_read_unlock */ | ||
200 | rcu_read_lock(); | ||
201 | |||
198 | if (!iter) | 202 | if (!iter) |
199 | return NULL; | 203 | return NULL; |
200 | 204 | ||
201 | while (n--) { | 205 | do { |
202 | if (qib_qp_iter_next(iter)) { | 206 | if (qib_qp_iter_next(iter)) { |
203 | kfree(iter); | 207 | kfree(iter); |
204 | return NULL; | 208 | return NULL; |
205 | } | 209 | } |
206 | } | 210 | } while (n--); |
207 | 211 | ||
208 | return iter; | 212 | return iter; |
209 | } | 213 | } |
210 | 214 | ||
211 | static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, | 215 | static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, |
212 | loff_t *pos) | 216 | loff_t *pos) |
217 | __must_hold(RCU) | ||
213 | { | 218 | { |
214 | struct qib_qp_iter *iter = iter_ptr; | 219 | struct qib_qp_iter *iter = iter_ptr; |
215 | 220 | ||
@@ -224,6 +229,7 @@ static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, | |||
224 | } | 229 | } |
225 | 230 | ||
226 | static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) | 231 | static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) |
232 | __releases(RCU) | ||
227 | { | 233 | { |
228 | rcu_read_unlock(); | 234 | rcu_read_unlock(); |
229 | } | 235 | } |
diff --git a/drivers/infiniband/hw/qib/qib_fs.c b/drivers/infiniband/hw/qib/qib_fs.c index fcdf37913a26..c3edc033f7c4 100644 --- a/drivers/infiniband/hw/qib/qib_fs.c +++ b/drivers/infiniband/hw/qib/qib_fs.c | |||
@@ -328,26 +328,12 @@ static ssize_t flash_write(struct file *file, const char __user *buf, | |||
328 | 328 | ||
329 | pos = *ppos; | 329 | pos = *ppos; |
330 | 330 | ||
331 | if (pos != 0) { | 331 | if (pos != 0 || count != sizeof(struct qib_flash)) |
332 | ret = -EINVAL; | 332 | return -EINVAL; |
333 | goto bail; | ||
334 | } | ||
335 | |||
336 | if (count != sizeof(struct qib_flash)) { | ||
337 | ret = -EINVAL; | ||
338 | goto bail; | ||
339 | } | ||
340 | |||
341 | tmp = kmalloc(count, GFP_KERNEL); | ||
342 | if (!tmp) { | ||
343 | ret = -ENOMEM; | ||
344 | goto bail; | ||
345 | } | ||
346 | 333 | ||
347 | if (copy_from_user(tmp, buf, count)) { | 334 | tmp = memdup_user(buf, count); |
348 | ret = -EFAULT; | 335 | if (IS_ERR(tmp)) |
349 | goto bail_tmp; | 336 | return PTR_ERR(tmp); |
350 | } | ||
351 | 337 | ||
352 | dd = private2dd(file); | 338 | dd = private2dd(file); |
353 | if (qib_eeprom_write(dd, pos, tmp, count)) { | 339 | if (qib_eeprom_write(dd, pos, tmp, count)) { |
@@ -361,8 +347,6 @@ static ssize_t flash_write(struct file *file, const char __user *buf, | |||
361 | 347 | ||
362 | bail_tmp: | 348 | bail_tmp: |
363 | kfree(tmp); | 349 | kfree(tmp); |
364 | |||
365 | bail: | ||
366 | return ret; | 350 | return ret; |
367 | } | 351 | } |
368 | 352 | ||
diff --git a/drivers/infiniband/hw/qib/qib_qp.c b/drivers/infiniband/hw/qib/qib_qp.c index 9cc0aae1d781..f9b8cd2354d1 100644 --- a/drivers/infiniband/hw/qib/qib_qp.c +++ b/drivers/infiniband/hw/qib/qib_qp.c | |||
@@ -573,10 +573,6 @@ struct qib_qp_iter *qib_qp_iter_init(struct qib_ibdev *dev) | |||
573 | return NULL; | 573 | return NULL; |
574 | 574 | ||
575 | iter->dev = dev; | 575 | iter->dev = dev; |
576 | if (qib_qp_iter_next(iter)) { | ||
577 | kfree(iter); | ||
578 | return NULL; | ||
579 | } | ||
580 | 576 | ||
581 | return iter; | 577 | return iter; |
582 | } | 578 | } |
diff --git a/drivers/infiniband/hw/usnic/usnic_ib_main.c b/drivers/infiniband/hw/usnic/usnic_ib_main.c index c229b9f4a52d..0a89a955550b 100644 --- a/drivers/infiniband/hw/usnic/usnic_ib_main.c +++ b/drivers/infiniband/hw/usnic/usnic_ib_main.c | |||
@@ -664,7 +664,8 @@ static int __init usnic_ib_init(void) | |||
664 | return err; | 664 | return err; |
665 | } | 665 | } |
666 | 666 | ||
667 | if (pci_register_driver(&usnic_ib_pci_driver)) { | 667 | err = pci_register_driver(&usnic_ib_pci_driver); |
668 | if (err) { | ||
668 | usnic_err("Unable to register with PCI\n"); | 669 | usnic_err("Unable to register with PCI\n"); |
669 | goto out_umem_fini; | 670 | goto out_umem_fini; |
670 | } | 671 | } |