diff options
author | Robert Walsh <robert.walsh@qlogic.com> | 2007-03-15 17:45:14 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2007-04-18 23:21:00 -0400 |
commit | 253fb3902008353831525ab711909abdd5ee191f (patch) | |
tree | b34e5201de20cb4b7fa9db350f587ecac15c9033 /drivers | |
parent | f0810daf74c564a3615eba5002cc11c21a0949ba (diff) |
IB/ipath: Check reserved memory keys
Don't let userspace use the direct-physical-map L_key or R_key.
Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_keys.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_keys.c b/drivers/infiniband/hw/ipath/ipath_keys.c index c93fa2f7719c..dd487c100f5b 100644 --- a/drivers/infiniband/hw/ipath/ipath_keys.c +++ b/drivers/infiniband/hw/ipath/ipath_keys.c | |||
@@ -133,6 +133,12 @@ int ipath_lkey_ok(struct ipath_qp *qp, struct ipath_sge *isge, | |||
133 | * being reversible by calling bus_to_virt(). | 133 | * being reversible by calling bus_to_virt(). |
134 | */ | 134 | */ |
135 | if (sge->lkey == 0) { | 135 | if (sge->lkey == 0) { |
136 | struct ipath_pd *pd = to_ipd(qp->ibqp.pd); | ||
137 | |||
138 | if (pd->user) { | ||
139 | ret = 0; | ||
140 | goto bail; | ||
141 | } | ||
136 | isge->mr = NULL; | 142 | isge->mr = NULL; |
137 | isge->vaddr = (void *) sge->addr; | 143 | isge->vaddr = (void *) sge->addr; |
138 | isge->length = sge->length; | 144 | isge->length = sge->length; |
@@ -206,6 +212,12 @@ int ipath_rkey_ok(struct ipath_qp *qp, struct ipath_sge_state *ss, | |||
206 | * (see ipath_get_dma_mr and ipath_dma.c). | 212 | * (see ipath_get_dma_mr and ipath_dma.c). |
207 | */ | 213 | */ |
208 | if (rkey == 0) { | 214 | if (rkey == 0) { |
215 | struct ipath_pd *pd = to_ipd(qp->ibqp.pd); | ||
216 | |||
217 | if (pd->user) { | ||
218 | ret = 0; | ||
219 | goto bail; | ||
220 | } | ||
209 | sge->mr = NULL; | 221 | sge->mr = NULL; |
210 | sge->vaddr = (void *) vaddr; | 222 | sge->vaddr = (void *) vaddr; |
211 | sge->length = len; | 223 | sge->length = len; |