IB/ehca: Fix driver on relocatable kernel
the eHCA driver registers a MR for all of kernel memory, but makes the assumption that valid memory exists at KERNELBASE. This assumption may not be true in the case of a relocatable kernel, so use KERNELBASE + PHYSICAL_START to get the true beginning of usable kernel memory. cc: Joachim Fenkes <fenkes@de.ibm.com> cc: Christoph Raisch <raisch@de.ibm.com> cc: Hoan-Ham Hguyen <hnguyen@de.ibm.com> Signed-off-by: Sonny Rao <sonnyrao@us.ibm.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
252a52aa4f
commit
625fbd3a36
|
@ -171,7 +171,7 @@ struct ib_mr *ehca_get_dma_mr(struct ib_pd *pd, int mr_access_flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ehca_reg_maxmr(shca, e_maxmr,
|
ret = ehca_reg_maxmr(shca, e_maxmr,
|
||||||
(void *)ehca_map_vaddr((void *)KERNELBASE),
|
(void *)ehca_map_vaddr((void *)(KERNELBASE + PHYSICAL_START)),
|
||||||
mr_access_flags, e_pd,
|
mr_access_flags, e_pd,
|
||||||
&e_maxmr->ib.ib_mr.lkey,
|
&e_maxmr->ib.ib_mr.lkey,
|
||||||
&e_maxmr->ib.ib_mr.rkey);
|
&e_maxmr->ib.ib_mr.rkey);
|
||||||
|
@ -1636,7 +1636,7 @@ int ehca_reg_internal_maxmr(
|
||||||
|
|
||||||
/* register internal max-MR on HCA */
|
/* register internal max-MR on HCA */
|
||||||
size_maxmr = ehca_mr_len;
|
size_maxmr = ehca_mr_len;
|
||||||
iova_start = (u64 *)ehca_map_vaddr((void *)KERNELBASE);
|
iova_start = (u64 *)ehca_map_vaddr((void *)(KERNELBASE + PHYSICAL_START));
|
||||||
ib_pbuf.addr = 0;
|
ib_pbuf.addr = 0;
|
||||||
ib_pbuf.size = size_maxmr;
|
ib_pbuf.size = size_maxmr;
|
||||||
num_kpages = NUM_CHUNKS(((u64)iova_start % PAGE_SIZE) + size_maxmr,
|
num_kpages = NUM_CHUNKS(((u64)iova_start % PAGE_SIZE) + size_maxmr,
|
||||||
|
@ -2209,7 +2209,7 @@ int ehca_mr_is_maxmr(u64 size,
|
||||||
{
|
{
|
||||||
/* a MR is treated as max-MR only if it fits following: */
|
/* a MR is treated as max-MR only if it fits following: */
|
||||||
if ((size == ehca_mr_len) &&
|
if ((size == ehca_mr_len) &&
|
||||||
(iova_start == (void *)ehca_map_vaddr((void *)KERNELBASE))) {
|
(iova_start == (void *)ehca_map_vaddr((void *)(KERNELBASE + PHYSICAL_START)))) {
|
||||||
ehca_gen_dbg("this is a max-MR");
|
ehca_gen_dbg("this is a max-MR");
|
||||||
return 1;
|
return 1;
|
||||||
} else
|
} else
|
||||||
|
|
Loading…
Reference in New Issue