mr.c 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814
  1. /*
  2. * Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved.
  3. *
  4. * This software is available to you under a choice of one of two
  5. * licenses. You may choose to be licensed under the terms of the GNU
  6. * General Public License (GPL) Version 2, available from the file
  7. * COPYING in the main directory of this source tree, or the
  8. * OpenIB.org BSD license below:
  9. *
  10. * Redistribution and use in source and binary forms, with or
  11. * without modification, are permitted provided that the following
  12. * conditions are met:
  13. *
  14. * - Redistributions of source code must retain the above
  15. * copyright notice, this list of conditions and the following
  16. * disclaimer.
  17. *
  18. * - Redistributions in binary form must reproduce the above
  19. * copyright notice, this list of conditions and the following
  20. * disclaimer in the documentation and/or other materials
  21. * provided with the distribution.
  22. *
  23. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30. * SOFTWARE.
  31. */
  32. #include <linux/kref.h>
  33. #include <linux/random.h>
  34. #include <linux/debugfs.h>
  35. #include <linux/export.h>
  36. #include <linux/delay.h>
  37. #include <rdma/ib_umem.h>
  38. #include <rdma/ib_umem_odp.h>
  39. #include <rdma/ib_verbs.h>
  40. #include "mlx5_ib.h"
  41. #include "user.h"
  42. enum {
  43. MAX_PENDING_REG_MR = 8,
  44. };
  45. #define MLX5_UMR_ALIGN 2048
  46. #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
  47. static __be64 mlx5_ib_update_mtt_emergency_buffer[
  48. MLX5_UMR_MTT_MIN_CHUNK_SIZE/sizeof(__be64)]
  49. __aligned(MLX5_UMR_ALIGN);
  50. static DEFINE_MUTEX(mlx5_ib_update_mtt_emergency_buffer_mutex);
  51. #endif
  52. static int clean_mr(struct mlx5_ib_mr *mr);
  53. static int destroy_mkey(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
  54. {
  55. int err = mlx5_core_destroy_mkey(dev->mdev, &mr->mmkey);
  56. #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
  57. /* Wait until all page fault handlers using the mr complete. */
  58. synchronize_srcu(&dev->mr_srcu);
  59. #endif
  60. return err;
  61. }
  62. static int order2idx(struct mlx5_ib_dev *dev, int order)
  63. {
  64. struct mlx5_mr_cache *cache = &dev->cache;
  65. if (order < cache->ent[0].order)
  66. return 0;
  67. else
  68. return order - cache->ent[0].order;
  69. }
  70. static bool use_umr_mtt_update(struct mlx5_ib_mr *mr, u64 start, u64 length)
  71. {
  72. return ((u64)1 << mr->order) * MLX5_ADAPTER_PAGE_SIZE >=
  73. length + (start & (MLX5_ADAPTER_PAGE_SIZE - 1));
  74. }
  75. #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
  76. static void update_odp_mr(struct mlx5_ib_mr *mr)
  77. {
  78. if (mr->umem->odp_data) {
  79. /*
  80. * This barrier prevents the compiler from moving the
  81. * setting of umem->odp_data->private to point to our
  82. * MR, before reg_umr finished, to ensure that the MR
  83. * initialization have finished before starting to
  84. * handle invalidations.
  85. */
  86. smp_wmb();
  87. mr->umem->odp_data->private = mr;
  88. /*
  89. * Make sure we will see the new
  90. * umem->odp_data->private value in the invalidation
  91. * routines, before we can get page faults on the
  92. * MR. Page faults can happen once we put the MR in
  93. * the tree, below this line. Without the barrier,
  94. * there can be a fault handling and an invalidation
  95. * before umem->odp_data->private == mr is visible to
  96. * the invalidation handler.
  97. */
  98. smp_wmb();
  99. }
  100. }
  101. #endif
  102. static void reg_mr_callback(int status, void *context)
  103. {
  104. struct mlx5_ib_mr *mr = context;
  105. struct mlx5_ib_dev *dev = mr->dev;
  106. struct mlx5_mr_cache *cache = &dev->cache;
  107. int c = order2idx(dev, mr->order);
  108. struct mlx5_cache_ent *ent = &cache->ent[c];
  109. u8 key;
  110. unsigned long flags;
  111. struct mlx5_mkey_table *table = &dev->mdev->priv.mkey_table;
  112. int err;
  113. spin_lock_irqsave(&ent->lock, flags);
  114. ent->pending--;
  115. spin_unlock_irqrestore(&ent->lock, flags);
  116. if (status) {
  117. mlx5_ib_warn(dev, "async reg mr failed. status %d\n", status);
  118. kfree(mr);
  119. dev->fill_delay = 1;
  120. mod_timer(&dev->delay_timer, jiffies + HZ);
  121. return;
  122. }
  123. if (mr->out.hdr.status) {
  124. mlx5_ib_warn(dev, "failed - status %d, syndorme 0x%x\n",
  125. mr->out.hdr.status,
  126. be32_to_cpu(mr->out.hdr.syndrome));
  127. kfree(mr);
  128. dev->fill_delay = 1;
  129. mod_timer(&dev->delay_timer, jiffies + HZ);
  130. return;
  131. }
  132. spin_lock_irqsave(&dev->mdev->priv.mkey_lock, flags);
  133. key = dev->mdev->priv.mkey_key++;
  134. spin_unlock_irqrestore(&dev->mdev->priv.mkey_lock, flags);
  135. mr->mmkey.key = mlx5_idx_to_mkey(be32_to_cpu(mr->out.mkey) & 0xffffff) | key;
  136. cache->last_add = jiffies;
  137. spin_lock_irqsave(&ent->lock, flags);
  138. list_add_tail(&mr->list, &ent->head);
  139. ent->cur++;
  140. ent->size++;
  141. spin_unlock_irqrestore(&ent->lock, flags);
  142. write_lock_irqsave(&table->lock, flags);
  143. err = radix_tree_insert(&table->tree, mlx5_base_mkey(mr->mmkey.key),
  144. &mr->mmkey);
  145. if (err)
  146. pr_err("Error inserting to mkey tree. 0x%x\n", -err);
  147. write_unlock_irqrestore(&table->lock, flags);
  148. }
  149. static int add_keys(struct mlx5_ib_dev *dev, int c, int num)
  150. {
  151. struct mlx5_mr_cache *cache = &dev->cache;
  152. struct mlx5_cache_ent *ent = &cache->ent[c];
  153. struct mlx5_create_mkey_mbox_in *in;
  154. struct mlx5_ib_mr *mr;
  155. int npages = 1 << ent->order;
  156. int err = 0;
  157. int i;
  158. in = kzalloc(sizeof(*in), GFP_KERNEL);
  159. if (!in)
  160. return -ENOMEM;
  161. for (i = 0; i < num; i++) {
  162. if (ent->pending >= MAX_PENDING_REG_MR) {
  163. err = -EAGAIN;
  164. break;
  165. }
  166. mr = kzalloc(sizeof(*mr), GFP_KERNEL);
  167. if (!mr) {
  168. err = -ENOMEM;
  169. break;
  170. }
  171. mr->order = ent->order;
  172. mr->umred = 1;
  173. mr->dev = dev;
  174. in->seg.status = MLX5_MKEY_STATUS_FREE;
  175. in->seg.xlt_oct_size = cpu_to_be32((npages + 1) / 2);
  176. in->seg.qpn_mkey7_0 = cpu_to_be32(0xffffff << 8);
  177. in->seg.flags = MLX5_ACCESS_MODE_MTT | MLX5_PERM_UMR_EN;
  178. in->seg.log2_page_size = 12;
  179. spin_lock_irq(&ent->lock);
  180. ent->pending++;
  181. spin_unlock_irq(&ent->lock);
  182. err = mlx5_core_create_mkey(dev->mdev, &mr->mmkey, in,
  183. sizeof(*in), reg_mr_callback,
  184. mr, &mr->out);
  185. if (err) {
  186. spin_lock_irq(&ent->lock);
  187. ent->pending--;
  188. spin_unlock_irq(&ent->lock);
  189. mlx5_ib_warn(dev, "create mkey failed %d\n", err);
  190. kfree(mr);
  191. break;
  192. }
  193. }
  194. kfree(in);
  195. return err;
  196. }
  197. static void remove_keys(struct mlx5_ib_dev *dev, int c, int num)
  198. {
  199. struct mlx5_mr_cache *cache = &dev->cache;
  200. struct mlx5_cache_ent *ent = &cache->ent[c];
  201. struct mlx5_ib_mr *mr;
  202. int err;
  203. int i;
  204. for (i = 0; i < num; i++) {
  205. spin_lock_irq(&ent->lock);
  206. if (list_empty(&ent->head)) {
  207. spin_unlock_irq(&ent->lock);
  208. return;
  209. }
  210. mr = list_first_entry(&ent->head, struct mlx5_ib_mr, list);
  211. list_del(&mr->list);
  212. ent->cur--;
  213. ent->size--;
  214. spin_unlock_irq(&ent->lock);
  215. err = destroy_mkey(dev, mr);
  216. if (err)
  217. mlx5_ib_warn(dev, "failed destroy mkey\n");
  218. else
  219. kfree(mr);
  220. }
  221. }
  222. static ssize_t size_write(struct file *filp, const char __user *buf,
  223. size_t count, loff_t *pos)
  224. {
  225. struct mlx5_cache_ent *ent = filp->private_data;
  226. struct mlx5_ib_dev *dev = ent->dev;
  227. char lbuf[20];
  228. u32 var;
  229. int err;
  230. int c;
  231. if (copy_from_user(lbuf, buf, sizeof(lbuf)))
  232. return -EFAULT;
  233. c = order2idx(dev, ent->order);
  234. lbuf[sizeof(lbuf) - 1] = 0;
  235. if (sscanf(lbuf, "%u", &var) != 1)
  236. return -EINVAL;
  237. if (var < ent->limit)
  238. return -EINVAL;
  239. if (var > ent->size) {
  240. do {
  241. err = add_keys(dev, c, var - ent->size);
  242. if (err && err != -EAGAIN)
  243. return err;
  244. usleep_range(3000, 5000);
  245. } while (err);
  246. } else if (var < ent->size) {
  247. remove_keys(dev, c, ent->size - var);
  248. }
  249. return count;
  250. }
  251. static ssize_t size_read(struct file *filp, char __user *buf, size_t count,
  252. loff_t *pos)
  253. {
  254. struct mlx5_cache_ent *ent = filp->private_data;
  255. char lbuf[20];
  256. int err;
  257. if (*pos)
  258. return 0;
  259. err = snprintf(lbuf, sizeof(lbuf), "%d\n", ent->size);
  260. if (err < 0)
  261. return err;
  262. if (copy_to_user(buf, lbuf, err))
  263. return -EFAULT;
  264. *pos += err;
  265. return err;
  266. }
  267. static const struct file_operations size_fops = {
  268. .owner = THIS_MODULE,
  269. .open = simple_open,
  270. .write = size_write,
  271. .read = size_read,
  272. };
  273. static ssize_t limit_write(struct file *filp, const char __user *buf,
  274. size_t count, loff_t *pos)
  275. {
  276. struct mlx5_cache_ent *ent = filp->private_data;
  277. struct mlx5_ib_dev *dev = ent->dev;
  278. char lbuf[20];
  279. u32 var;
  280. int err;
  281. int c;
  282. if (copy_from_user(lbuf, buf, sizeof(lbuf)))
  283. return -EFAULT;
  284. c = order2idx(dev, ent->order);
  285. lbuf[sizeof(lbuf) - 1] = 0;
  286. if (sscanf(lbuf, "%u", &var) != 1)
  287. return -EINVAL;
  288. if (var > ent->size)
  289. return -EINVAL;
  290. ent->limit = var;
  291. if (ent->cur < ent->limit) {
  292. err = add_keys(dev, c, 2 * ent->limit - ent->cur);
  293. if (err)
  294. return err;
  295. }
  296. return count;
  297. }
  298. static ssize_t limit_read(struct file *filp, char __user *buf, size_t count,
  299. loff_t *pos)
  300. {
  301. struct mlx5_cache_ent *ent = filp->private_data;
  302. char lbuf[20];
  303. int err;
  304. if (*pos)
  305. return 0;
  306. err = snprintf(lbuf, sizeof(lbuf), "%d\n", ent->limit);
  307. if (err < 0)
  308. return err;
  309. if (copy_to_user(buf, lbuf, err))
  310. return -EFAULT;
  311. *pos += err;
  312. return err;
  313. }
  314. static const struct file_operations limit_fops = {
  315. .owner = THIS_MODULE,
  316. .open = simple_open,
  317. .write = limit_write,
  318. .read = limit_read,
  319. };
  320. static int someone_adding(struct mlx5_mr_cache *cache)
  321. {
  322. int i;
  323. for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) {
  324. if (cache->ent[i].cur < cache->ent[i].limit)
  325. return 1;
  326. }
  327. return 0;
  328. }
  329. static void __cache_work_func(struct mlx5_cache_ent *ent)
  330. {
  331. struct mlx5_ib_dev *dev = ent->dev;
  332. struct mlx5_mr_cache *cache = &dev->cache;
  333. int i = order2idx(dev, ent->order);
  334. int err;
  335. if (cache->stopped)
  336. return;
  337. ent = &dev->cache.ent[i];
  338. if (ent->cur < 2 * ent->limit && !dev->fill_delay) {
  339. err = add_keys(dev, i, 1);
  340. if (ent->cur < 2 * ent->limit) {
  341. if (err == -EAGAIN) {
  342. mlx5_ib_dbg(dev, "returned eagain, order %d\n",
  343. i + 2);
  344. queue_delayed_work(cache->wq, &ent->dwork,
  345. msecs_to_jiffies(3));
  346. } else if (err) {
  347. mlx5_ib_warn(dev, "command failed order %d, err %d\n",
  348. i + 2, err);
  349. queue_delayed_work(cache->wq, &ent->dwork,
  350. msecs_to_jiffies(1000));
  351. } else {
  352. queue_work(cache->wq, &ent->work);
  353. }
  354. }
  355. } else if (ent->cur > 2 * ent->limit) {
  356. /*
  357. * The remove_keys() logic is performed as garbage collection
  358. * task. Such task is intended to be run when no other active
  359. * processes are running.
  360. *
  361. * The need_resched() will return TRUE if there are user tasks
  362. * to be activated in near future.
  363. *
  364. * In such case, we don't execute remove_keys() and postpone
  365. * the garbage collection work to try to run in next cycle,
  366. * in order to free CPU resources to other tasks.
  367. */
  368. if (!need_resched() && !someone_adding(cache) &&
  369. time_after(jiffies, cache->last_add + 300 * HZ)) {
  370. remove_keys(dev, i, 1);
  371. if (ent->cur > ent->limit)
  372. queue_work(cache->wq, &ent->work);
  373. } else {
  374. queue_delayed_work(cache->wq, &ent->dwork, 300 * HZ);
  375. }
  376. }
  377. }
  378. static void delayed_cache_work_func(struct work_struct *work)
  379. {
  380. struct mlx5_cache_ent *ent;
  381. ent = container_of(work, struct mlx5_cache_ent, dwork.work);
  382. __cache_work_func(ent);
  383. }
  384. static void cache_work_func(struct work_struct *work)
  385. {
  386. struct mlx5_cache_ent *ent;
  387. ent = container_of(work, struct mlx5_cache_ent, work);
  388. __cache_work_func(ent);
  389. }
  390. static struct mlx5_ib_mr *alloc_cached_mr(struct mlx5_ib_dev *dev, int order)
  391. {
  392. struct mlx5_mr_cache *cache = &dev->cache;
  393. struct mlx5_ib_mr *mr = NULL;
  394. struct mlx5_cache_ent *ent;
  395. int c;
  396. int i;
  397. c = order2idx(dev, order);
  398. if (c < 0 || c >= MAX_MR_CACHE_ENTRIES) {
  399. mlx5_ib_warn(dev, "order %d, cache index %d\n", order, c);
  400. return NULL;
  401. }
  402. for (i = c; i < MAX_MR_CACHE_ENTRIES; i++) {
  403. ent = &cache->ent[i];
  404. mlx5_ib_dbg(dev, "order %d, cache index %d\n", ent->order, i);
  405. spin_lock_irq(&ent->lock);
  406. if (!list_empty(&ent->head)) {
  407. mr = list_first_entry(&ent->head, struct mlx5_ib_mr,
  408. list);
  409. list_del(&mr->list);
  410. ent->cur--;
  411. spin_unlock_irq(&ent->lock);
  412. if (ent->cur < ent->limit)
  413. queue_work(cache->wq, &ent->work);
  414. break;
  415. }
  416. spin_unlock_irq(&ent->lock);
  417. queue_work(cache->wq, &ent->work);
  418. }
  419. if (!mr)
  420. cache->ent[c].miss++;
  421. return mr;
  422. }
  423. static void free_cached_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
  424. {
  425. struct mlx5_mr_cache *cache = &dev->cache;
  426. struct mlx5_cache_ent *ent;
  427. int shrink = 0;
  428. int c;
  429. c = order2idx(dev, mr->order);
  430. if (c < 0 || c >= MAX_MR_CACHE_ENTRIES) {
  431. mlx5_ib_warn(dev, "order %d, cache index %d\n", mr->order, c);
  432. return;
  433. }
  434. ent = &cache->ent[c];
  435. spin_lock_irq(&ent->lock);
  436. list_add_tail(&mr->list, &ent->head);
  437. ent->cur++;
  438. if (ent->cur > 2 * ent->limit)
  439. shrink = 1;
  440. spin_unlock_irq(&ent->lock);
  441. if (shrink)
  442. queue_work(cache->wq, &ent->work);
  443. }
  444. static void clean_keys(struct mlx5_ib_dev *dev, int c)
  445. {
  446. struct mlx5_mr_cache *cache = &dev->cache;
  447. struct mlx5_cache_ent *ent = &cache->ent[c];
  448. struct mlx5_ib_mr *mr;
  449. int err;
  450. cancel_delayed_work(&ent->dwork);
  451. while (1) {
  452. spin_lock_irq(&ent->lock);
  453. if (list_empty(&ent->head)) {
  454. spin_unlock_irq(&ent->lock);
  455. return;
  456. }
  457. mr = list_first_entry(&ent->head, struct mlx5_ib_mr, list);
  458. list_del(&mr->list);
  459. ent->cur--;
  460. ent->size--;
  461. spin_unlock_irq(&ent->lock);
  462. err = destroy_mkey(dev, mr);
  463. if (err)
  464. mlx5_ib_warn(dev, "failed destroy mkey\n");
  465. else
  466. kfree(mr);
  467. }
  468. }
  469. static int mlx5_mr_cache_debugfs_init(struct mlx5_ib_dev *dev)
  470. {
  471. struct mlx5_mr_cache *cache = &dev->cache;
  472. struct mlx5_cache_ent *ent;
  473. int i;
  474. if (!mlx5_debugfs_root)
  475. return 0;
  476. cache->root = debugfs_create_dir("mr_cache", dev->mdev->priv.dbg_root);
  477. if (!cache->root)
  478. return -ENOMEM;
  479. for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) {
  480. ent = &cache->ent[i];
  481. sprintf(ent->name, "%d", ent->order);
  482. ent->dir = debugfs_create_dir(ent->name, cache->root);
  483. if (!ent->dir)
  484. return -ENOMEM;
  485. ent->fsize = debugfs_create_file("size", 0600, ent->dir, ent,
  486. &size_fops);
  487. if (!ent->fsize)
  488. return -ENOMEM;
  489. ent->flimit = debugfs_create_file("limit", 0600, ent->dir, ent,
  490. &limit_fops);
  491. if (!ent->flimit)
  492. return -ENOMEM;
  493. ent->fcur = debugfs_create_u32("cur", 0400, ent->dir,
  494. &ent->cur);
  495. if (!ent->fcur)
  496. return -ENOMEM;
  497. ent->fmiss = debugfs_create_u32("miss", 0600, ent->dir,
  498. &ent->miss);
  499. if (!ent->fmiss)
  500. return -ENOMEM;
  501. }
  502. return 0;
  503. }
  504. static void mlx5_mr_cache_debugfs_cleanup(struct mlx5_ib_dev *dev)
  505. {
  506. if (!mlx5_debugfs_root)
  507. return;
  508. debugfs_remove_recursive(dev->cache.root);
  509. }
  510. static void delay_time_func(unsigned long ctx)
  511. {
  512. struct mlx5_ib_dev *dev = (struct mlx5_ib_dev *)ctx;
  513. dev->fill_delay = 0;
  514. }
  515. int mlx5_mr_cache_init(struct mlx5_ib_dev *dev)
  516. {
  517. struct mlx5_mr_cache *cache = &dev->cache;
  518. struct mlx5_cache_ent *ent;
  519. int limit;
  520. int err;
  521. int i;
  522. cache->wq = create_singlethread_workqueue("mkey_cache");
  523. if (!cache->wq) {
  524. mlx5_ib_warn(dev, "failed to create work queue\n");
  525. return -ENOMEM;
  526. }
  527. setup_timer(&dev->delay_timer, delay_time_func, (unsigned long)dev);
  528. for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) {
  529. INIT_LIST_HEAD(&cache->ent[i].head);
  530. spin_lock_init(&cache->ent[i].lock);
  531. ent = &cache->ent[i];
  532. INIT_LIST_HEAD(&ent->head);
  533. spin_lock_init(&ent->lock);
  534. ent->order = i + 2;
  535. ent->dev = dev;
  536. if (dev->mdev->profile->mask & MLX5_PROF_MASK_MR_CACHE)
  537. limit = dev->mdev->profile->mr_cache[i].limit;
  538. else
  539. limit = 0;
  540. INIT_WORK(&ent->work, cache_work_func);
  541. INIT_DELAYED_WORK(&ent->dwork, delayed_cache_work_func);
  542. ent->limit = limit;
  543. queue_work(cache->wq, &ent->work);
  544. }
  545. err = mlx5_mr_cache_debugfs_init(dev);
  546. if (err)
  547. mlx5_ib_warn(dev, "cache debugfs failure\n");
  548. return 0;
  549. }
  550. int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev)
  551. {
  552. int i;
  553. dev->cache.stopped = 1;
  554. flush_workqueue(dev->cache.wq);
  555. mlx5_mr_cache_debugfs_cleanup(dev);
  556. for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++)
  557. clean_keys(dev, i);
  558. destroy_workqueue(dev->cache.wq);
  559. del_timer_sync(&dev->delay_timer);
  560. return 0;
  561. }
  562. struct ib_mr *mlx5_ib_get_dma_mr(struct ib_pd *pd, int acc)
  563. {
  564. struct mlx5_ib_dev *dev = to_mdev(pd->device);
  565. struct mlx5_core_dev *mdev = dev->mdev;
  566. struct mlx5_create_mkey_mbox_in *in;
  567. struct mlx5_mkey_seg *seg;
  568. struct mlx5_ib_mr *mr;
  569. int err;
  570. mr = kzalloc(sizeof(*mr), GFP_KERNEL);
  571. if (!mr)
  572. return ERR_PTR(-ENOMEM);
  573. in = kzalloc(sizeof(*in), GFP_KERNEL);
  574. if (!in) {
  575. err = -ENOMEM;
  576. goto err_free;
  577. }
  578. seg = &in->seg;
  579. seg->flags = convert_access(acc) | MLX5_ACCESS_MODE_PA;
  580. seg->flags_pd = cpu_to_be32(to_mpd(pd)->pdn | MLX5_MKEY_LEN64);
  581. seg->qpn_mkey7_0 = cpu_to_be32(0xffffff << 8);
  582. seg->start_addr = 0;
  583. err = mlx5_core_create_mkey(mdev, &mr->mmkey, in, sizeof(*in), NULL, NULL,
  584. NULL);
  585. if (err)
  586. goto err_in;
  587. kfree(in);
  588. mr->ibmr.lkey = mr->mmkey.key;
  589. mr->ibmr.rkey = mr->mmkey.key;
  590. mr->umem = NULL;
  591. return &mr->ibmr;
  592. err_in:
  593. kfree(in);
  594. err_free:
  595. kfree(mr);
  596. return ERR_PTR(err);
  597. }
  598. static int get_octo_len(u64 addr, u64 len, int page_size)
  599. {
  600. u64 offset;
  601. int npages;
  602. offset = addr & (page_size - 1);
  603. npages = ALIGN(len + offset, page_size) >> ilog2(page_size);
  604. return (npages + 1) / 2;
  605. }
  606. static int use_umr(int order)
  607. {
  608. return order <= MLX5_MAX_UMR_SHIFT;
  609. }
  610. static int dma_map_mr_pas(struct mlx5_ib_dev *dev, struct ib_umem *umem,
  611. int npages, int page_shift, int *size,
  612. __be64 **mr_pas, dma_addr_t *dma)
  613. {
  614. __be64 *pas;
  615. struct device *ddev = dev->ib_dev.dma_device;
  616. /*
  617. * UMR copies MTTs in units of MLX5_UMR_MTT_ALIGNMENT bytes.
  618. * To avoid copying garbage after the pas array, we allocate
  619. * a little more.
  620. */
  621. *size = ALIGN(sizeof(u64) * npages, MLX5_UMR_MTT_ALIGNMENT);
  622. *mr_pas = kmalloc(*size + MLX5_UMR_ALIGN - 1, GFP_KERNEL);
  623. if (!(*mr_pas))
  624. return -ENOMEM;
  625. pas = PTR_ALIGN(*mr_pas, MLX5_UMR_ALIGN);
  626. mlx5_ib_populate_pas(dev, umem, page_shift, pas, MLX5_IB_MTT_PRESENT);
  627. /* Clear padding after the actual pages. */
  628. memset(pas + npages, 0, *size - npages * sizeof(u64));
  629. *dma = dma_map_single(ddev, pas, *size, DMA_TO_DEVICE);
  630. if (dma_mapping_error(ddev, *dma)) {
  631. kfree(*mr_pas);
  632. return -ENOMEM;
  633. }
  634. return 0;
  635. }
  636. static void prep_umr_wqe_common(struct ib_pd *pd, struct ib_send_wr *wr,
  637. struct ib_sge *sg, u64 dma, int n, u32 key,
  638. int page_shift)
  639. {
  640. struct mlx5_ib_dev *dev = to_mdev(pd->device);
  641. struct mlx5_umr_wr *umrwr = umr_wr(wr);
  642. sg->addr = dma;
  643. sg->length = ALIGN(sizeof(u64) * n, 64);
  644. sg->lkey = dev->umrc.pd->local_dma_lkey;
  645. wr->next = NULL;
  646. wr->sg_list = sg;
  647. if (n)
  648. wr->num_sge = 1;
  649. else
  650. wr->num_sge = 0;
  651. wr->opcode = MLX5_IB_WR_UMR;
  652. umrwr->npages = n;
  653. umrwr->page_shift = page_shift;
  654. umrwr->mkey = key;
  655. }
  656. static void prep_umr_reg_wqe(struct ib_pd *pd, struct ib_send_wr *wr,
  657. struct ib_sge *sg, u64 dma, int n, u32 key,
  658. int page_shift, u64 virt_addr, u64 len,
  659. int access_flags)
  660. {
  661. struct mlx5_umr_wr *umrwr = umr_wr(wr);
  662. prep_umr_wqe_common(pd, wr, sg, dma, n, key, page_shift);
  663. wr->send_flags = 0;
  664. umrwr->target.virt_addr = virt_addr;
  665. umrwr->length = len;
  666. umrwr->access_flags = access_flags;
  667. umrwr->pd = pd;
  668. }
  669. static void prep_umr_unreg_wqe(struct mlx5_ib_dev *dev,
  670. struct ib_send_wr *wr, u32 key)
  671. {
  672. struct mlx5_umr_wr *umrwr = umr_wr(wr);
  673. wr->send_flags = MLX5_IB_SEND_UMR_UNREG | MLX5_IB_SEND_UMR_FAIL_IF_FREE;
  674. wr->opcode = MLX5_IB_WR_UMR;
  675. umrwr->mkey = key;
  676. }
  677. static struct ib_umem *mr_umem_get(struct ib_pd *pd, u64 start, u64 length,
  678. int access_flags, int *npages,
  679. int *page_shift, int *ncont, int *order)
  680. {
  681. struct mlx5_ib_dev *dev = to_mdev(pd->device);
  682. struct ib_umem *umem = ib_umem_get(pd->uobject->context, start, length,
  683. access_flags, 0);
  684. if (IS_ERR(umem)) {
  685. mlx5_ib_err(dev, "umem get failed (%ld)\n", PTR_ERR(umem));
  686. return (void *)umem;
  687. }
  688. mlx5_ib_cont_pages(umem, start, npages, page_shift, ncont, order);
  689. if (!*npages) {
  690. mlx5_ib_warn(dev, "avoid zero region\n");
  691. ib_umem_release(umem);
  692. return ERR_PTR(-EINVAL);
  693. }
  694. mlx5_ib_dbg(dev, "npages %d, ncont %d, order %d, page_shift %d\n",
  695. *npages, *ncont, *order, *page_shift);
  696. return umem;
  697. }
  698. static void mlx5_ib_umr_done(struct ib_cq *cq, struct ib_wc *wc)
  699. {
  700. struct mlx5_ib_umr_context *context =
  701. container_of(wc->wr_cqe, struct mlx5_ib_umr_context, cqe);
  702. context->status = wc->status;
  703. complete(&context->done);
  704. }
  705. static inline void mlx5_ib_init_umr_context(struct mlx5_ib_umr_context *context)
  706. {
  707. context->cqe.done = mlx5_ib_umr_done;
  708. context->status = -1;
  709. init_completion(&context->done);
  710. }
  711. static struct mlx5_ib_mr *reg_umr(struct ib_pd *pd, struct ib_umem *umem,
  712. u64 virt_addr, u64 len, int npages,
  713. int page_shift, int order, int access_flags)
  714. {
  715. struct mlx5_ib_dev *dev = to_mdev(pd->device);
  716. struct device *ddev = dev->ib_dev.dma_device;
  717. struct umr_common *umrc = &dev->umrc;
  718. struct mlx5_ib_umr_context umr_context;
  719. struct mlx5_umr_wr umrwr = {};
  720. struct ib_send_wr *bad;
  721. struct mlx5_ib_mr *mr;
  722. struct ib_sge sg;
  723. int size;
  724. __be64 *mr_pas;
  725. dma_addr_t dma;
  726. int err = 0;
  727. int i;
  728. for (i = 0; i < 1; i++) {
  729. mr = alloc_cached_mr(dev, order);
  730. if (mr)
  731. break;
  732. err = add_keys(dev, order2idx(dev, order), 1);
  733. if (err && err != -EAGAIN) {
  734. mlx5_ib_warn(dev, "add_keys failed, err %d\n", err);
  735. break;
  736. }
  737. }
  738. if (!mr)
  739. return ERR_PTR(-EAGAIN);
  740. err = dma_map_mr_pas(dev, umem, npages, page_shift, &size, &mr_pas,
  741. &dma);
  742. if (err)
  743. goto free_mr;
  744. mlx5_ib_init_umr_context(&umr_context);
  745. umrwr.wr.wr_cqe = &umr_context.cqe;
  746. prep_umr_reg_wqe(pd, &umrwr.wr, &sg, dma, npages, mr->mmkey.key,
  747. page_shift, virt_addr, len, access_flags);
  748. down(&umrc->sem);
  749. err = ib_post_send(umrc->qp, &umrwr.wr, &bad);
  750. if (err) {
  751. mlx5_ib_warn(dev, "post send failed, err %d\n", err);
  752. goto unmap_dma;
  753. } else {
  754. wait_for_completion(&umr_context.done);
  755. if (umr_context.status != IB_WC_SUCCESS) {
  756. mlx5_ib_warn(dev, "reg umr failed\n");
  757. err = -EFAULT;
  758. }
  759. }
  760. mr->mmkey.iova = virt_addr;
  761. mr->mmkey.size = len;
  762. mr->mmkey.pd = to_mpd(pd)->pdn;
  763. mr->live = 1;
  764. unmap_dma:
  765. up(&umrc->sem);
  766. dma_unmap_single(ddev, dma, size, DMA_TO_DEVICE);
  767. kfree(mr_pas);
  768. free_mr:
  769. if (err) {
  770. free_cached_mr(dev, mr);
  771. return ERR_PTR(err);
  772. }
  773. return mr;
  774. }
  775. #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
  776. int mlx5_ib_update_mtt(struct mlx5_ib_mr *mr, u64 start_page_index, int npages,
  777. int zap)
  778. {
  779. struct mlx5_ib_dev *dev = mr->dev;
  780. struct device *ddev = dev->ib_dev.dma_device;
  781. struct umr_common *umrc = &dev->umrc;
  782. struct mlx5_ib_umr_context umr_context;
  783. struct ib_umem *umem = mr->umem;
  784. int size;
  785. __be64 *pas;
  786. dma_addr_t dma;
  787. struct ib_send_wr *bad;
  788. struct mlx5_umr_wr wr;
  789. struct ib_sge sg;
  790. int err = 0;
  791. const int page_index_alignment = MLX5_UMR_MTT_ALIGNMENT / sizeof(u64);
  792. const int page_index_mask = page_index_alignment - 1;
  793. size_t pages_mapped = 0;
  794. size_t pages_to_map = 0;
  795. size_t pages_iter = 0;
  796. int use_emergency_buf = 0;
  797. /* UMR copies MTTs in units of MLX5_UMR_MTT_ALIGNMENT bytes,
  798. * so we need to align the offset and length accordingly */
  799. if (start_page_index & page_index_mask) {
  800. npages += start_page_index & page_index_mask;
  801. start_page_index &= ~page_index_mask;
  802. }
  803. pages_to_map = ALIGN(npages, page_index_alignment);
  804. if (start_page_index + pages_to_map > MLX5_MAX_UMR_PAGES)
  805. return -EINVAL;
  806. size = sizeof(u64) * pages_to_map;
  807. size = min_t(int, PAGE_SIZE, size);
  808. /* We allocate with GFP_ATOMIC to avoid recursion into page-reclaim
  809. * code, when we are called from an invalidation. The pas buffer must
  810. * be 2k-aligned for Connect-IB. */
  811. pas = (__be64 *)get_zeroed_page(GFP_ATOMIC);
  812. if (!pas) {
  813. mlx5_ib_warn(dev, "unable to allocate memory during MTT update, falling back to slower chunked mechanism.\n");
  814. pas = mlx5_ib_update_mtt_emergency_buffer;
  815. size = MLX5_UMR_MTT_MIN_CHUNK_SIZE;
  816. use_emergency_buf = 1;
  817. mutex_lock(&mlx5_ib_update_mtt_emergency_buffer_mutex);
  818. memset(pas, 0, size);
  819. }
  820. pages_iter = size / sizeof(u64);
  821. dma = dma_map_single(ddev, pas, size, DMA_TO_DEVICE);
  822. if (dma_mapping_error(ddev, dma)) {
  823. mlx5_ib_err(dev, "unable to map DMA during MTT update.\n");
  824. err = -ENOMEM;
  825. goto free_pas;
  826. }
  827. for (pages_mapped = 0;
  828. pages_mapped < pages_to_map && !err;
  829. pages_mapped += pages_iter, start_page_index += pages_iter) {
  830. dma_sync_single_for_cpu(ddev, dma, size, DMA_TO_DEVICE);
  831. npages = min_t(size_t,
  832. pages_iter,
  833. ib_umem_num_pages(umem) - start_page_index);
  834. if (!zap) {
  835. __mlx5_ib_populate_pas(dev, umem, PAGE_SHIFT,
  836. start_page_index, npages, pas,
  837. MLX5_IB_MTT_PRESENT);
  838. /* Clear padding after the pages brought from the
  839. * umem. */
  840. memset(pas + npages, 0, size - npages * sizeof(u64));
  841. }
  842. dma_sync_single_for_device(ddev, dma, size, DMA_TO_DEVICE);
  843. mlx5_ib_init_umr_context(&umr_context);
  844. memset(&wr, 0, sizeof(wr));
  845. wr.wr.wr_cqe = &umr_context.cqe;
  846. sg.addr = dma;
  847. sg.length = ALIGN(npages * sizeof(u64),
  848. MLX5_UMR_MTT_ALIGNMENT);
  849. sg.lkey = dev->umrc.pd->local_dma_lkey;
  850. wr.wr.send_flags = MLX5_IB_SEND_UMR_FAIL_IF_FREE |
  851. MLX5_IB_SEND_UMR_UPDATE_MTT;
  852. wr.wr.sg_list = &sg;
  853. wr.wr.num_sge = 1;
  854. wr.wr.opcode = MLX5_IB_WR_UMR;
  855. wr.npages = sg.length / sizeof(u64);
  856. wr.page_shift = PAGE_SHIFT;
  857. wr.mkey = mr->mmkey.key;
  858. wr.target.offset = start_page_index;
  859. down(&umrc->sem);
  860. err = ib_post_send(umrc->qp, &wr.wr, &bad);
  861. if (err) {
  862. mlx5_ib_err(dev, "UMR post send failed, err %d\n", err);
  863. } else {
  864. wait_for_completion(&umr_context.done);
  865. if (umr_context.status != IB_WC_SUCCESS) {
  866. mlx5_ib_err(dev, "UMR completion failed, code %d\n",
  867. umr_context.status);
  868. err = -EFAULT;
  869. }
  870. }
  871. up(&umrc->sem);
  872. }
  873. dma_unmap_single(ddev, dma, size, DMA_TO_DEVICE);
  874. free_pas:
  875. if (!use_emergency_buf)
  876. free_page((unsigned long)pas);
  877. else
  878. mutex_unlock(&mlx5_ib_update_mtt_emergency_buffer_mutex);
  879. return err;
  880. }
  881. #endif
  882. /*
  883. * If ibmr is NULL it will be allocated by reg_create.
  884. * Else, the given ibmr will be used.
  885. */
  886. static struct mlx5_ib_mr *reg_create(struct ib_mr *ibmr, struct ib_pd *pd,
  887. u64 virt_addr, u64 length,
  888. struct ib_umem *umem, int npages,
  889. int page_shift, int access_flags)
  890. {
  891. struct mlx5_ib_dev *dev = to_mdev(pd->device);
  892. struct mlx5_create_mkey_mbox_in *in;
  893. struct mlx5_ib_mr *mr;
  894. int inlen;
  895. int err;
  896. bool pg_cap = !!(MLX5_CAP_GEN(dev->mdev, pg));
  897. mr = ibmr ? to_mmr(ibmr) : kzalloc(sizeof(*mr), GFP_KERNEL);
  898. if (!mr)
  899. return ERR_PTR(-ENOMEM);
  900. inlen = sizeof(*in) + sizeof(*in->pas) * ((npages + 1) / 2) * 2;
  901. in = mlx5_vzalloc(inlen);
  902. if (!in) {
  903. err = -ENOMEM;
  904. goto err_1;
  905. }
  906. mlx5_ib_populate_pas(dev, umem, page_shift, in->pas,
  907. pg_cap ? MLX5_IB_MTT_PRESENT : 0);
  908. /* The MLX5_MKEY_INBOX_PG_ACCESS bit allows setting the access flags
  909. * in the page list submitted with the command. */
  910. in->flags = pg_cap ? cpu_to_be32(MLX5_MKEY_INBOX_PG_ACCESS) : 0;
  911. in->seg.flags = convert_access(access_flags) |
  912. MLX5_ACCESS_MODE_MTT;
  913. in->seg.flags_pd = cpu_to_be32(to_mpd(pd)->pdn);
  914. in->seg.start_addr = cpu_to_be64(virt_addr);
  915. in->seg.len = cpu_to_be64(length);
  916. in->seg.bsfs_octo_size = 0;
  917. in->seg.xlt_oct_size = cpu_to_be32(get_octo_len(virt_addr, length, 1 << page_shift));
  918. in->seg.log2_page_size = page_shift;
  919. in->seg.qpn_mkey7_0 = cpu_to_be32(0xffffff << 8);
  920. in->xlat_oct_act_size = cpu_to_be32(get_octo_len(virt_addr, length,
  921. 1 << page_shift));
  922. err = mlx5_core_create_mkey(dev->mdev, &mr->mmkey, in, inlen, NULL,
  923. NULL, NULL);
  924. if (err) {
  925. mlx5_ib_warn(dev, "create mkey failed\n");
  926. goto err_2;
  927. }
  928. mr->umem = umem;
  929. mr->dev = dev;
  930. mr->live = 1;
  931. kvfree(in);
  932. mlx5_ib_dbg(dev, "mkey = 0x%x\n", mr->mmkey.key);
  933. return mr;
  934. err_2:
  935. kvfree(in);
  936. err_1:
  937. if (!ibmr)
  938. kfree(mr);
  939. return ERR_PTR(err);
  940. }
  941. static void set_mr_fileds(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr,
  942. int npages, u64 length, int access_flags)
  943. {
  944. mr->npages = npages;
  945. atomic_add(npages, &dev->mdev->priv.reg_pages);
  946. mr->ibmr.lkey = mr->mmkey.key;
  947. mr->ibmr.rkey = mr->mmkey.key;
  948. mr->ibmr.length = length;
  949. mr->access_flags = access_flags;
  950. }
  951. struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
  952. u64 virt_addr, int access_flags,
  953. struct ib_udata *udata)
  954. {
  955. struct mlx5_ib_dev *dev = to_mdev(pd->device);
  956. struct mlx5_ib_mr *mr = NULL;
  957. struct ib_umem *umem;
  958. int page_shift;
  959. int npages;
  960. int ncont;
  961. int order;
  962. int err;
  963. mlx5_ib_dbg(dev, "start 0x%llx, virt_addr 0x%llx, length 0x%llx, access_flags 0x%x\n",
  964. start, virt_addr, length, access_flags);
  965. umem = mr_umem_get(pd, start, length, access_flags, &npages,
  966. &page_shift, &ncont, &order);
  967. if (IS_ERR(umem))
  968. return (void *)umem;
  969. if (use_umr(order)) {
  970. mr = reg_umr(pd, umem, virt_addr, length, ncont, page_shift,
  971. order, access_flags);
  972. if (PTR_ERR(mr) == -EAGAIN) {
  973. mlx5_ib_dbg(dev, "cache empty for order %d", order);
  974. mr = NULL;
  975. }
  976. } else if (access_flags & IB_ACCESS_ON_DEMAND) {
  977. err = -EINVAL;
  978. pr_err("Got MR registration for ODP MR > 512MB, not supported for Connect-IB");
  979. goto error;
  980. }
  981. if (!mr)
  982. mr = reg_create(NULL, pd, virt_addr, length, umem, ncont,
  983. page_shift, access_flags);
  984. if (IS_ERR(mr)) {
  985. err = PTR_ERR(mr);
  986. goto error;
  987. }
  988. mlx5_ib_dbg(dev, "mkey 0x%x\n", mr->mmkey.key);
  989. mr->umem = umem;
  990. set_mr_fileds(dev, mr, npages, length, access_flags);
  991. #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
  992. update_odp_mr(mr);
  993. #endif
  994. return &mr->ibmr;
  995. error:
  996. ib_umem_release(umem);
  997. return ERR_PTR(err);
  998. }
  999. static int unreg_umr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
  1000. {
  1001. struct umr_common *umrc = &dev->umrc;
  1002. struct mlx5_ib_umr_context umr_context;
  1003. struct mlx5_umr_wr umrwr = {};
  1004. struct ib_send_wr *bad;
  1005. int err;
  1006. mlx5_ib_init_umr_context(&umr_context);
  1007. umrwr.wr.wr_cqe = &umr_context.cqe;
  1008. prep_umr_unreg_wqe(dev, &umrwr.wr, mr->mmkey.key);
  1009. down(&umrc->sem);
  1010. err = ib_post_send(umrc->qp, &umrwr.wr, &bad);
  1011. if (err) {
  1012. up(&umrc->sem);
  1013. mlx5_ib_dbg(dev, "err %d\n", err);
  1014. goto error;
  1015. } else {
  1016. wait_for_completion(&umr_context.done);
  1017. up(&umrc->sem);
  1018. }
  1019. if (umr_context.status != IB_WC_SUCCESS) {
  1020. mlx5_ib_warn(dev, "unreg umr failed\n");
  1021. err = -EFAULT;
  1022. goto error;
  1023. }
  1024. return 0;
  1025. error:
  1026. return err;
  1027. }
  1028. static int rereg_umr(struct ib_pd *pd, struct mlx5_ib_mr *mr, u64 virt_addr,
  1029. u64 length, int npages, int page_shift, int order,
  1030. int access_flags, int flags)
  1031. {
  1032. struct mlx5_ib_dev *dev = to_mdev(pd->device);
  1033. struct device *ddev = dev->ib_dev.dma_device;
  1034. struct mlx5_ib_umr_context umr_context;
  1035. struct ib_send_wr *bad;
  1036. struct mlx5_umr_wr umrwr = {};
  1037. struct ib_sge sg;
  1038. struct umr_common *umrc = &dev->umrc;
  1039. dma_addr_t dma = 0;
  1040. __be64 *mr_pas = NULL;
  1041. int size;
  1042. int err;
  1043. mlx5_ib_init_umr_context(&umr_context);
  1044. umrwr.wr.wr_cqe = &umr_context.cqe;
  1045. umrwr.wr.send_flags = MLX5_IB_SEND_UMR_FAIL_IF_FREE;
  1046. if (flags & IB_MR_REREG_TRANS) {
  1047. err = dma_map_mr_pas(dev, mr->umem, npages, page_shift, &size,
  1048. &mr_pas, &dma);
  1049. if (err)
  1050. return err;
  1051. umrwr.target.virt_addr = virt_addr;
  1052. umrwr.length = length;
  1053. umrwr.wr.send_flags |= MLX5_IB_SEND_UMR_UPDATE_TRANSLATION;
  1054. }
  1055. prep_umr_wqe_common(pd, &umrwr.wr, &sg, dma, npages, mr->mmkey.key,
  1056. page_shift);
  1057. if (flags & IB_MR_REREG_PD) {
  1058. umrwr.pd = pd;
  1059. umrwr.wr.send_flags |= MLX5_IB_SEND_UMR_UPDATE_PD;
  1060. }
  1061. if (flags & IB_MR_REREG_ACCESS) {
  1062. umrwr.access_flags = access_flags;
  1063. umrwr.wr.send_flags |= MLX5_IB_SEND_UMR_UPDATE_ACCESS;
  1064. }
  1065. /* post send request to UMR QP */
  1066. down(&umrc->sem);
  1067. err = ib_post_send(umrc->qp, &umrwr.wr, &bad);
  1068. if (err) {
  1069. mlx5_ib_warn(dev, "post send failed, err %d\n", err);
  1070. } else {
  1071. wait_for_completion(&umr_context.done);
  1072. if (umr_context.status != IB_WC_SUCCESS) {
  1073. mlx5_ib_warn(dev, "reg umr failed (%u)\n",
  1074. umr_context.status);
  1075. err = -EFAULT;
  1076. }
  1077. }
  1078. up(&umrc->sem);
  1079. if (flags & IB_MR_REREG_TRANS) {
  1080. dma_unmap_single(ddev, dma, size, DMA_TO_DEVICE);
  1081. kfree(mr_pas);
  1082. }
  1083. return err;
  1084. }
  1085. int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
  1086. u64 length, u64 virt_addr, int new_access_flags,
  1087. struct ib_pd *new_pd, struct ib_udata *udata)
  1088. {
  1089. struct mlx5_ib_dev *dev = to_mdev(ib_mr->device);
  1090. struct mlx5_ib_mr *mr = to_mmr(ib_mr);
  1091. struct ib_pd *pd = (flags & IB_MR_REREG_PD) ? new_pd : ib_mr->pd;
  1092. int access_flags = flags & IB_MR_REREG_ACCESS ?
  1093. new_access_flags :
  1094. mr->access_flags;
  1095. u64 addr = (flags & IB_MR_REREG_TRANS) ? virt_addr : mr->umem->address;
  1096. u64 len = (flags & IB_MR_REREG_TRANS) ? length : mr->umem->length;
  1097. int page_shift = 0;
  1098. int npages = 0;
  1099. int ncont = 0;
  1100. int order = 0;
  1101. int err;
  1102. mlx5_ib_dbg(dev, "start 0x%llx, virt_addr 0x%llx, length 0x%llx, access_flags 0x%x\n",
  1103. start, virt_addr, length, access_flags);
  1104. if (flags != IB_MR_REREG_PD) {
  1105. /*
  1106. * Replace umem. This needs to be done whether or not UMR is
  1107. * used.
  1108. */
  1109. flags |= IB_MR_REREG_TRANS;
  1110. ib_umem_release(mr->umem);
  1111. mr->umem = mr_umem_get(pd, addr, len, access_flags, &npages,
  1112. &page_shift, &ncont, &order);
  1113. if (IS_ERR(mr->umem)) {
  1114. err = PTR_ERR(mr->umem);
  1115. mr->umem = NULL;
  1116. return err;
  1117. }
  1118. }
  1119. if (flags & IB_MR_REREG_TRANS && !use_umr_mtt_update(mr, addr, len)) {
  1120. /*
  1121. * UMR can't be used - MKey needs to be replaced.
  1122. */
  1123. if (mr->umred) {
  1124. err = unreg_umr(dev, mr);
  1125. if (err)
  1126. mlx5_ib_warn(dev, "Failed to unregister MR\n");
  1127. } else {
  1128. err = destroy_mkey(dev, mr);
  1129. if (err)
  1130. mlx5_ib_warn(dev, "Failed to destroy MKey\n");
  1131. }
  1132. if (err)
  1133. return err;
  1134. mr = reg_create(ib_mr, pd, addr, len, mr->umem, ncont,
  1135. page_shift, access_flags);
  1136. if (IS_ERR(mr))
  1137. return PTR_ERR(mr);
  1138. mr->umred = 0;
  1139. } else {
  1140. /*
  1141. * Send a UMR WQE
  1142. */
  1143. err = rereg_umr(pd, mr, addr, len, npages, page_shift,
  1144. order, access_flags, flags);
  1145. if (err) {
  1146. mlx5_ib_warn(dev, "Failed to rereg UMR\n");
  1147. return err;
  1148. }
  1149. }
  1150. if (flags & IB_MR_REREG_PD) {
  1151. ib_mr->pd = pd;
  1152. mr->mmkey.pd = to_mpd(pd)->pdn;
  1153. }
  1154. if (flags & IB_MR_REREG_ACCESS)
  1155. mr->access_flags = access_flags;
  1156. if (flags & IB_MR_REREG_TRANS) {
  1157. atomic_sub(mr->npages, &dev->mdev->priv.reg_pages);
  1158. set_mr_fileds(dev, mr, npages, len, access_flags);
  1159. mr->mmkey.iova = addr;
  1160. mr->mmkey.size = len;
  1161. }
  1162. #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
  1163. update_odp_mr(mr);
  1164. #endif
  1165. return 0;
  1166. }
  1167. static int
  1168. mlx5_alloc_priv_descs(struct ib_device *device,
  1169. struct mlx5_ib_mr *mr,
  1170. int ndescs,
  1171. int desc_size)
  1172. {
  1173. int size = ndescs * desc_size;
  1174. int add_size;
  1175. int ret;
  1176. add_size = max_t(int, MLX5_UMR_ALIGN - ARCH_KMALLOC_MINALIGN, 0);
  1177. mr->descs_alloc = kzalloc(size + add_size, GFP_KERNEL);
  1178. if (!mr->descs_alloc)
  1179. return -ENOMEM;
  1180. mr->descs = PTR_ALIGN(mr->descs_alloc, MLX5_UMR_ALIGN);
  1181. mr->desc_map = dma_map_single(device->dma_device, mr->descs,
  1182. size, DMA_TO_DEVICE);
  1183. if (dma_mapping_error(device->dma_device, mr->desc_map)) {
  1184. ret = -ENOMEM;
  1185. goto err;
  1186. }
  1187. return 0;
  1188. err:
  1189. kfree(mr->descs_alloc);
  1190. return ret;
  1191. }
  1192. static void
  1193. mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
  1194. {
  1195. if (mr->descs) {
  1196. struct ib_device *device = mr->ibmr.device;
  1197. int size = mr->max_descs * mr->desc_size;
  1198. dma_unmap_single(device->dma_device, mr->desc_map,
  1199. size, DMA_TO_DEVICE);
  1200. kfree(mr->descs_alloc);
  1201. mr->descs = NULL;
  1202. }
  1203. }
  1204. static int clean_mr(struct mlx5_ib_mr *mr)
  1205. {
  1206. struct mlx5_ib_dev *dev = to_mdev(mr->ibmr.device);
  1207. int umred = mr->umred;
  1208. int err;
  1209. if (mr->sig) {
  1210. if (mlx5_core_destroy_psv(dev->mdev,
  1211. mr->sig->psv_memory.psv_idx))
  1212. mlx5_ib_warn(dev, "failed to destroy mem psv %d\n",
  1213. mr->sig->psv_memory.psv_idx);
  1214. if (mlx5_core_destroy_psv(dev->mdev,
  1215. mr->sig->psv_wire.psv_idx))
  1216. mlx5_ib_warn(dev, "failed to destroy wire psv %d\n",
  1217. mr->sig->psv_wire.psv_idx);
  1218. kfree(mr->sig);
  1219. mr->sig = NULL;
  1220. }
  1221. mlx5_free_priv_descs(mr);
  1222. if (!umred) {
  1223. err = destroy_mkey(dev, mr);
  1224. if (err) {
  1225. mlx5_ib_warn(dev, "failed to destroy mkey 0x%x (%d)\n",
  1226. mr->mmkey.key, err);
  1227. return err;
  1228. }
  1229. } else {
  1230. err = unreg_umr(dev, mr);
  1231. if (err) {
  1232. mlx5_ib_warn(dev, "failed unregister\n");
  1233. return err;
  1234. }
  1235. free_cached_mr(dev, mr);
  1236. }
  1237. if (!umred)
  1238. kfree(mr);
  1239. return 0;
  1240. }
  1241. int mlx5_ib_dereg_mr(struct ib_mr *ibmr)
  1242. {
  1243. struct mlx5_ib_dev *dev = to_mdev(ibmr->device);
  1244. struct mlx5_ib_mr *mr = to_mmr(ibmr);
  1245. int npages = mr->npages;
  1246. struct ib_umem *umem = mr->umem;
  1247. #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
  1248. if (umem && umem->odp_data) {
  1249. /* Prevent new page faults from succeeding */
  1250. mr->live = 0;
  1251. /* Wait for all running page-fault handlers to finish. */
  1252. synchronize_srcu(&dev->mr_srcu);
  1253. /* Destroy all page mappings */
  1254. mlx5_ib_invalidate_range(umem, ib_umem_start(umem),
  1255. ib_umem_end(umem));
  1256. /*
  1257. * We kill the umem before the MR for ODP,
  1258. * so that there will not be any invalidations in
  1259. * flight, looking at the *mr struct.
  1260. */
  1261. ib_umem_release(umem);
  1262. atomic_sub(npages, &dev->mdev->priv.reg_pages);
  1263. /* Avoid double-freeing the umem. */
  1264. umem = NULL;
  1265. }
  1266. #endif
  1267. clean_mr(mr);
  1268. if (umem) {
  1269. ib_umem_release(umem);
  1270. atomic_sub(npages, &dev->mdev->priv.reg_pages);
  1271. }
  1272. return 0;
  1273. }
  1274. struct ib_mr *mlx5_ib_alloc_mr(struct ib_pd *pd,
  1275. enum ib_mr_type mr_type,
  1276. u32 max_num_sg)
  1277. {
  1278. struct mlx5_ib_dev *dev = to_mdev(pd->device);
  1279. struct mlx5_create_mkey_mbox_in *in;
  1280. struct mlx5_ib_mr *mr;
  1281. int ndescs = ALIGN(max_num_sg, 4);
  1282. int err;
  1283. mr = kzalloc(sizeof(*mr), GFP_KERNEL);
  1284. if (!mr)
  1285. return ERR_PTR(-ENOMEM);
  1286. in = kzalloc(sizeof(*in), GFP_KERNEL);
  1287. if (!in) {
  1288. err = -ENOMEM;
  1289. goto err_free;
  1290. }
  1291. in->seg.status = MLX5_MKEY_STATUS_FREE;
  1292. in->seg.xlt_oct_size = cpu_to_be32(ndescs);
  1293. in->seg.qpn_mkey7_0 = cpu_to_be32(0xffffff << 8);
  1294. in->seg.flags_pd = cpu_to_be32(to_mpd(pd)->pdn);
  1295. if (mr_type == IB_MR_TYPE_MEM_REG) {
  1296. mr->access_mode = MLX5_ACCESS_MODE_MTT;
  1297. in->seg.log2_page_size = PAGE_SHIFT;
  1298. err = mlx5_alloc_priv_descs(pd->device, mr,
  1299. ndescs, sizeof(u64));
  1300. if (err)
  1301. goto err_free_in;
  1302. mr->desc_size = sizeof(u64);
  1303. mr->max_descs = ndescs;
  1304. } else if (mr_type == IB_MR_TYPE_SG_GAPS) {
  1305. mr->access_mode = MLX5_ACCESS_MODE_KLM;
  1306. err = mlx5_alloc_priv_descs(pd->device, mr,
  1307. ndescs, sizeof(struct mlx5_klm));
  1308. if (err)
  1309. goto err_free_in;
  1310. mr->desc_size = sizeof(struct mlx5_klm);
  1311. mr->max_descs = ndescs;
  1312. } else if (mr_type == IB_MR_TYPE_SIGNATURE) {
  1313. u32 psv_index[2];
  1314. in->seg.flags_pd = cpu_to_be32(be32_to_cpu(in->seg.flags_pd) |
  1315. MLX5_MKEY_BSF_EN);
  1316. in->seg.bsfs_octo_size = cpu_to_be32(MLX5_MKEY_BSF_OCTO_SIZE);
  1317. mr->sig = kzalloc(sizeof(*mr->sig), GFP_KERNEL);
  1318. if (!mr->sig) {
  1319. err = -ENOMEM;
  1320. goto err_free_in;
  1321. }
  1322. /* create mem & wire PSVs */
  1323. err = mlx5_core_create_psv(dev->mdev, to_mpd(pd)->pdn,
  1324. 2, psv_index);
  1325. if (err)
  1326. goto err_free_sig;
  1327. mr->access_mode = MLX5_ACCESS_MODE_KLM;
  1328. mr->sig->psv_memory.psv_idx = psv_index[0];
  1329. mr->sig->psv_wire.psv_idx = psv_index[1];
  1330. mr->sig->sig_status_checked = true;
  1331. mr->sig->sig_err_exists = false;
  1332. /* Next UMR, Arm SIGERR */
  1333. ++mr->sig->sigerr_count;
  1334. } else {
  1335. mlx5_ib_warn(dev, "Invalid mr type %d\n", mr_type);
  1336. err = -EINVAL;
  1337. goto err_free_in;
  1338. }
  1339. in->seg.flags = MLX5_PERM_UMR_EN | mr->access_mode;
  1340. err = mlx5_core_create_mkey(dev->mdev, &mr->mmkey, in, sizeof(*in),
  1341. NULL, NULL, NULL);
  1342. if (err)
  1343. goto err_destroy_psv;
  1344. mr->ibmr.lkey = mr->mmkey.key;
  1345. mr->ibmr.rkey = mr->mmkey.key;
  1346. mr->umem = NULL;
  1347. kfree(in);
  1348. return &mr->ibmr;
  1349. err_destroy_psv:
  1350. if (mr->sig) {
  1351. if (mlx5_core_destroy_psv(dev->mdev,
  1352. mr->sig->psv_memory.psv_idx))
  1353. mlx5_ib_warn(dev, "failed to destroy mem psv %d\n",
  1354. mr->sig->psv_memory.psv_idx);
  1355. if (mlx5_core_destroy_psv(dev->mdev,
  1356. mr->sig->psv_wire.psv_idx))
  1357. mlx5_ib_warn(dev, "failed to destroy wire psv %d\n",
  1358. mr->sig->psv_wire.psv_idx);
  1359. }
  1360. mlx5_free_priv_descs(mr);
  1361. err_free_sig:
  1362. kfree(mr->sig);
  1363. err_free_in:
  1364. kfree(in);
  1365. err_free:
  1366. kfree(mr);
  1367. return ERR_PTR(err);
  1368. }
  1369. struct ib_mw *mlx5_ib_alloc_mw(struct ib_pd *pd, enum ib_mw_type type,
  1370. struct ib_udata *udata)
  1371. {
  1372. struct mlx5_ib_dev *dev = to_mdev(pd->device);
  1373. struct mlx5_create_mkey_mbox_in *in = NULL;
  1374. struct mlx5_ib_mw *mw = NULL;
  1375. int ndescs;
  1376. int err;
  1377. struct mlx5_ib_alloc_mw req = {};
  1378. struct {
  1379. __u32 comp_mask;
  1380. __u32 response_length;
  1381. } resp = {};
  1382. err = ib_copy_from_udata(&req, udata, min(udata->inlen, sizeof(req)));
  1383. if (err)
  1384. return ERR_PTR(err);
  1385. if (req.comp_mask || req.reserved1 || req.reserved2)
  1386. return ERR_PTR(-EOPNOTSUPP);
  1387. if (udata->inlen > sizeof(req) &&
  1388. !ib_is_udata_cleared(udata, sizeof(req),
  1389. udata->inlen - sizeof(req)))
  1390. return ERR_PTR(-EOPNOTSUPP);
  1391. ndescs = req.num_klms ? roundup(req.num_klms, 4) : roundup(1, 4);
  1392. mw = kzalloc(sizeof(*mw), GFP_KERNEL);
  1393. in = kzalloc(sizeof(*in), GFP_KERNEL);
  1394. if (!mw || !in) {
  1395. err = -ENOMEM;
  1396. goto free;
  1397. }
  1398. in->seg.status = MLX5_MKEY_STATUS_FREE;
  1399. in->seg.xlt_oct_size = cpu_to_be32(ndescs);
  1400. in->seg.flags_pd = cpu_to_be32(to_mpd(pd)->pdn);
  1401. in->seg.flags = MLX5_PERM_UMR_EN | MLX5_ACCESS_MODE_KLM |
  1402. MLX5_PERM_LOCAL_READ;
  1403. if (type == IB_MW_TYPE_2)
  1404. in->seg.flags_pd |= cpu_to_be32(MLX5_MKEY_REMOTE_INVAL);
  1405. in->seg.qpn_mkey7_0 = cpu_to_be32(0xffffff << 8);
  1406. err = mlx5_core_create_mkey(dev->mdev, &mw->mmkey, in, sizeof(*in),
  1407. NULL, NULL, NULL);
  1408. if (err)
  1409. goto free;
  1410. mw->ibmw.rkey = mw->mmkey.key;
  1411. resp.response_length = min(offsetof(typeof(resp), response_length) +
  1412. sizeof(resp.response_length), udata->outlen);
  1413. if (resp.response_length) {
  1414. err = ib_copy_to_udata(udata, &resp, resp.response_length);
  1415. if (err) {
  1416. mlx5_core_destroy_mkey(dev->mdev, &mw->mmkey);
  1417. goto free;
  1418. }
  1419. }
  1420. kfree(in);
  1421. return &mw->ibmw;
  1422. free:
  1423. kfree(mw);
  1424. kfree(in);
  1425. return ERR_PTR(err);
  1426. }
  1427. int mlx5_ib_dealloc_mw(struct ib_mw *mw)
  1428. {
  1429. struct mlx5_ib_mw *mmw = to_mmw(mw);
  1430. int err;
  1431. err = mlx5_core_destroy_mkey((to_mdev(mw->device))->mdev,
  1432. &mmw->mmkey);
  1433. if (!err)
  1434. kfree(mmw);
  1435. return err;
  1436. }
  1437. int mlx5_ib_check_mr_status(struct ib_mr *ibmr, u32 check_mask,
  1438. struct ib_mr_status *mr_status)
  1439. {
  1440. struct mlx5_ib_mr *mmr = to_mmr(ibmr);
  1441. int ret = 0;
  1442. if (check_mask & ~IB_MR_CHECK_SIG_STATUS) {
  1443. pr_err("Invalid status check mask\n");
  1444. ret = -EINVAL;
  1445. goto done;
  1446. }
  1447. mr_status->fail_status = 0;
  1448. if (check_mask & IB_MR_CHECK_SIG_STATUS) {
  1449. if (!mmr->sig) {
  1450. ret = -EINVAL;
  1451. pr_err("signature status check requested on a non-signature enabled MR\n");
  1452. goto done;
  1453. }
  1454. mmr->sig->sig_status_checked = true;
  1455. if (!mmr->sig->sig_err_exists)
  1456. goto done;
  1457. if (ibmr->lkey == mmr->sig->err_item.key)
  1458. memcpy(&mr_status->sig_err, &mmr->sig->err_item,
  1459. sizeof(mr_status->sig_err));
  1460. else {
  1461. mr_status->sig_err.err_type = IB_SIG_BAD_GUARD;
  1462. mr_status->sig_err.sig_err_offset = 0;
  1463. mr_status->sig_err.key = mmr->sig->err_item.key;
  1464. }
  1465. mmr->sig->sig_err_exists = false;
  1466. mr_status->fail_status |= IB_MR_CHECK_SIG_STATUS;
  1467. }
  1468. done:
  1469. return ret;
  1470. }
  1471. static int
  1472. mlx5_ib_sg_to_klms(struct mlx5_ib_mr *mr,
  1473. struct scatterlist *sgl,
  1474. unsigned short sg_nents)
  1475. {
  1476. struct scatterlist *sg = sgl;
  1477. struct mlx5_klm *klms = mr->descs;
  1478. u32 lkey = mr->ibmr.pd->local_dma_lkey;
  1479. int i;
  1480. mr->ibmr.iova = sg_dma_address(sg);
  1481. mr->ibmr.length = 0;
  1482. mr->ndescs = sg_nents;
  1483. for_each_sg(sgl, sg, sg_nents, i) {
  1484. if (unlikely(i > mr->max_descs))
  1485. break;
  1486. klms[i].va = cpu_to_be64(sg_dma_address(sg));
  1487. klms[i].bcount = cpu_to_be32(sg_dma_len(sg));
  1488. klms[i].key = cpu_to_be32(lkey);
  1489. mr->ibmr.length += sg_dma_len(sg);
  1490. }
  1491. return i;
  1492. }
  1493. static int mlx5_set_page(struct ib_mr *ibmr, u64 addr)
  1494. {
  1495. struct mlx5_ib_mr *mr = to_mmr(ibmr);
  1496. __be64 *descs;
  1497. if (unlikely(mr->ndescs == mr->max_descs))
  1498. return -ENOMEM;
  1499. descs = mr->descs;
  1500. descs[mr->ndescs++] = cpu_to_be64(addr | MLX5_EN_RD | MLX5_EN_WR);
  1501. return 0;
  1502. }
  1503. int mlx5_ib_map_mr_sg(struct ib_mr *ibmr,
  1504. struct scatterlist *sg,
  1505. int sg_nents)
  1506. {
  1507. struct mlx5_ib_mr *mr = to_mmr(ibmr);
  1508. int n;
  1509. mr->ndescs = 0;
  1510. ib_dma_sync_single_for_cpu(ibmr->device, mr->desc_map,
  1511. mr->desc_size * mr->max_descs,
  1512. DMA_TO_DEVICE);
  1513. if (mr->access_mode == MLX5_ACCESS_MODE_KLM)
  1514. n = mlx5_ib_sg_to_klms(mr, sg, sg_nents);
  1515. else
  1516. n = ib_sg_to_pages(ibmr, sg, sg_nents, mlx5_set_page);
  1517. ib_dma_sync_single_for_device(ibmr->device, mr->desc_map,
  1518. mr->desc_size * mr->max_descs,
  1519. DMA_TO_DEVICE);
  1520. return n;
  1521. }