diff --git a/kernel/sdma.c b/kernel/sdma.c index e66dcc46..d59a5a48 100644 --- a/kernel/sdma.c +++ b/kernel/sdma.c @@ -798,20 +798,28 @@ struct sdma_engine *sdma_select_engine_vl( if (vl >= num_vls) { #else if (vl >= HFI1_MAX_VLS_SUPPORTED) { -#endif /* __HFI1_ORIG__ */ +#endif /* __HFI1_ORIG__ */ rval = NULL; goto done; } +#ifdef __HFI1_ORIG__ rcu_read_lock(); m = rcu_dereference(dd->sdma_map); +#else + m = (volatile struct sdma_vl_map *)dd->sdma_map; +#endif if (unlikely(!m)) { +#ifdef __HFI1_ORIG__ rcu_read_unlock(); +#endif return &dd->per_sdma[0]; } e = m->map[vl & m->mask]; rval = e->sde[selector & e->mask]; +#ifdef __HFI1_ORIG__ rcu_read_unlock(); +#endif done: rval = !rval ? &dd->per_sdma[0] : rval; @@ -881,6 +889,7 @@ static struct rhashtable_params sdma_rht_params = { struct sdma_engine *sdma_select_user_engine(struct hfi1_devdata *dd, u32 selector, u8 vl) { +#ifdef __HFI1_ORIG__ struct sdma_rht_node *rht_node; struct sdma_engine *sde = NULL; const struct cpumask *current_mask = tsk_cpus_allowed(current); @@ -909,6 +918,7 @@ struct sdma_engine *sdma_select_user_engine(struct hfi1_devdata *dd, return sde; out: +#endif return sdma_select_engine_vl(dd, selector, vl); } @@ -3463,4 +3473,4 @@ void _sdma_engine_progress_schedule( sde->progress_mask); } -#endif /* __HFI1_ORIG__ */ \ No newline at end of file +#endif /* __HFI1_ORIG__ */ diff --git a/kernel/user_sdma.c b/kernel/user_sdma.c index 470e8118..2e333a83 100644 --- a/kernel/user_sdma.c +++ b/kernel/user_sdma.c @@ -758,8 +758,13 @@ int hfi1_user_sdma_process_request(void *private_data, struct iovec *iovec, dlid = be16_to_cpu(req->hdr.lrh[1]); selector = dlid_to_selector(dlid); selector += uctxt->ctxt + fd->subctxt; - /* TODO: sdma_select_user_engine check the rcu stuff */ - //req->sde = sdma_select_user_engine(dd, selector, vl); + /* TODO: check the rcu stuff */ + /* + * XXX: didn't we conclude that we don't need to worry about RCU here? + * the mapping is created at driver initialization, the rest of the + * accesses are read-only + */ + req->sde = sdma_select_user_engine(dd, selector, vl); if (!req->sde || !sdma_running(req->sde)) { ret = -ECOMM; @@ -1722,4 +1727,4 @@ static int sdma_rb_invalidate(void *arg, struct mmu_rb_node *mnode) return 0; } -#endif /* __HFI1_ORIG__ */ \ No newline at end of file +#endif /* __HFI1_ORIG__ */