diff options
author | Robert Walsh <rjwalsh@pathscale.com> | 2007-04-28 00:07:23 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2007-04-30 20:30:28 -0400 |
commit | 6b66b2da1e821181a001c00b04a807724ad803cd (patch) | |
tree | 8ddbae34ef4ad3e9242f91b6d7df4abbd9f3a161 /drivers/infiniband/hw/ipath/ipath_verbs.h | |
parent | 9ba6d5529dd919b442eedf5bef1dd28aca2ee9fe (diff) |
IB/ipath: Don't corrupt pending mmap list when unmapped objects are freed
Fix the pending mmap code so it doesn't corrupt the list of pending
mmaps and crash the machine when pending mmaps are destroyed without
first being mapped. Also, remove an unused variable, and use standard
kernel lists instead of our own homebrewed linked list implementation
to keep the pending mmap list.
Signed-off-by: Robert Walsh <robert.walsh@qlogic.com>
Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/hw/ipath/ipath_verbs.h')
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_verbs.h | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.h b/drivers/infiniband/hw/ipath/ipath_verbs.h index c62f9c5854f6..ac66c00a2976 100644 --- a/drivers/infiniband/hw/ipath/ipath_verbs.h +++ b/drivers/infiniband/hw/ipath/ipath_verbs.h | |||
@@ -173,12 +173,12 @@ struct ipath_ah { | |||
173 | * this as its vm_private_data. | 173 | * this as its vm_private_data. |
174 | */ | 174 | */ |
175 | struct ipath_mmap_info { | 175 | struct ipath_mmap_info { |
176 | struct ipath_mmap_info *next; | 176 | struct list_head pending_mmaps; |
177 | struct ib_ucontext *context; | 177 | struct ib_ucontext *context; |
178 | void *obj; | 178 | void *obj; |
179 | __u64 offset; | ||
179 | struct kref ref; | 180 | struct kref ref; |
180 | unsigned size; | 181 | unsigned size; |
181 | unsigned mmap_cnt; | ||
182 | }; | 182 | }; |
183 | 183 | ||
184 | /* | 184 | /* |
@@ -485,9 +485,10 @@ struct ipath_opcode_stats { | |||
485 | 485 | ||
486 | struct ipath_ibdev { | 486 | struct ipath_ibdev { |
487 | struct ib_device ibdev; | 487 | struct ib_device ibdev; |
488 | struct list_head dev_list; | ||
489 | struct ipath_devdata *dd; | 488 | struct ipath_devdata *dd; |
490 | struct ipath_mmap_info *pending_mmaps; | 489 | struct list_head pending_mmaps; |
490 | spinlock_t mmap_offset_lock; | ||
491 | u32 mmap_offset; | ||
491 | int ib_unit; /* This is the device number */ | 492 | int ib_unit; /* This is the device number */ |
492 | u16 sm_lid; /* in host order */ | 493 | u16 sm_lid; /* in host order */ |
493 | u8 sm_sl; | 494 | u8 sm_sl; |
@@ -768,6 +769,15 @@ int ipath_dealloc_fmr(struct ib_fmr *ibfmr); | |||
768 | 769 | ||
769 | void ipath_release_mmap_info(struct kref *ref); | 770 | void ipath_release_mmap_info(struct kref *ref); |
770 | 771 | ||
772 | struct ipath_mmap_info *ipath_create_mmap_info(struct ipath_ibdev *dev, | ||
773 | u32 size, | ||
774 | struct ib_ucontext *context, | ||
775 | void *obj); | ||
776 | |||
777 | void ipath_update_mmap_info(struct ipath_ibdev *dev, | ||
778 | struct ipath_mmap_info *ip, | ||
779 | u32 size, void *obj); | ||
780 | |||
771 | int ipath_mmap(struct ib_ucontext *context, struct vm_area_struct *vma); | 781 | int ipath_mmap(struct ib_ucontext *context, struct vm_area_struct *vma); |
772 | 782 | ||
773 | void ipath_no_bufs_available(struct ipath_qp *qp, struct ipath_ibdev *dev); | 783 | void ipath_no_bufs_available(struct ipath_qp *qp, struct ipath_ibdev *dev); |