CINXE.COM

LKML: Roland Dreier: [PATCH][1/27] IB/mthca: map MPT/MTT context in mem-free mode

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>LKML: Roland Dreier: [PATCH][1/27] IB/mthca: map MPT/MTT context in mem-free mode</title><link href="/css/message.css" rel="stylesheet" type="text/css" /><link href="/css/wrap.css" rel="alternate stylesheet" type="text/css" title="wrap" /><link href="/css/nowrap.css" rel="stylesheet" type="text/css" title="nowrap" /><link href="/favicon.ico" rel="shortcut icon" /><script src="/js/simple-calendar.js" type="text/javascript"></script><script src="/js/styleswitcher.js" type="text/javascript"></script><link rel="alternate" type="application/rss+xml" title="lkml.org : last 100 messages" href="/rss.php" /><link rel="alternate" type="application/rss+xml" title="lkml.org : last messages by Roland Dreier" href="/groupie.php?aid=3215" /><!--Matomo--><script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(["setDoNotTrack", true]); _paq.push(["disableCookies"]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//m.lkml.org/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script><!--End Matomo Code--></head><body onload="es.jasper.simpleCalendar.init();" itemscope="itemscope" itemtype="http://schema.org/BlogPosting"><table border="0" cellpadding="0" cellspacing="0"><tr><td width="180" align="center"><a href="/"><img style="border:0;width:135px;height:32px" src="/images/toprowlk.gif" alt="lkml.org" /></a></td><td width="32">聽</td><td class="nb"><div><a class="nb" href="/lkml"> [lkml]</a> 聽 <a class="nb" href="/lkml/2005"> [2005]</a> 聽 <a class="nb" href="/lkml/2005/4"> [Apr]</a> 聽 <a class="nb" href="/lkml/2005/4/1"> [1]</a> 聽 <a class="nb" href="/lkml/last100"> [last100]</a> 聽 <a href="/rss.php"><img src="/images/rss-or.gif" border="0" alt="RSS Feed" /></a></div><div>Views: <a href="#" class="nowrap" onclick="setActiveStyleSheet('wrap');return false;">[wrap]</a><a href="#" class="wrap" onclick="setActiveStyleSheet('nowrap');return false;">[no wrap]</a> 聽 <a class="nb" href="/lkml/mheaders/2005/4/1/224" onclick="this.href='/lkml/headers'+'/2005/4/1/224';">[headers]</a>聽 <a href="/lkml/bounce/2005/4/1/224">[forward]</a>聽 </div></td><td width="32">聽</td></tr><tr><td valign="top"><div class="es-jasper-simpleCalendar" baseurl="/lkml/"></div><div class="threadlist">Messages in this thread</div><ul class="threadlist"><li class="root"><a href="/lkml/2005/4/1/224">First message in thread</a></li><li class="origin"><a href="/lkml/2005/4/1/223">Roland Dreier</a><ul><li><a href="/lkml/2005/4/1/223">Roland Dreier</a><ul><li><a href="/lkml/2005/4/1/257">Roland Dreier</a><ul><li><a href="/lkml/2005/4/1/256">Roland Dreier</a><ul><li><a href="/lkml/2005/4/1/258">Roland Dreier</a></li></ul></li></ul></li></ul></li></ul></li></ul><div class="threadlist">Patch in this message</div><ul class="threadlist"><li><a href="/lkml/diff/2005/4/1/224/1">Get diff 1</a></li></ul></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerl.gif" width="32" height="32" alt="/" /></td><td class="c" rowspan="2" valign="top" style="padding-top: 1em"><table><tr><td><table><tr><td class="lp">Subject</td><td class="rp" itemprop="name">[PATCH][1/27] IB/mthca: map MPT/MTT context in mem-free mode</td></tr><tr><td class="lp">Date</td><td class="rp" itemprop="datePublished">Fri, 1 Apr 2005 12:49:52 -0800</td></tr><tr><td class="lp">From</td><td class="rp" itemprop="author">Roland Dreier &lt;&gt;</td></tr></table></td><td></td></tr></table><pre itemprop="articleBody">In mem-free mode, when allocating memory regions, make sure that the<br />HCA has context memory mapped to cover the virtual space used for the<br />MPT and MTTs being used.<br /><br />Signed-off-by: Roland Dreier &lt;roland&#64;topspin.com&gt;<br /><br /><br />--- linux-export.orig/drivers/infiniband/hw/mthca/mthca_main.c 2005-03-31 19:06:51.000000000 -0800<br />+++ linux-export/drivers/infiniband/hw/mthca/mthca_main.c 2005-04-01 12:38:19.884644268 -0800<br />&#64;&#64; -390,7 +390,7 &#64;&#64;<br /> }<br /> <br /> mdev-&gt;mr_table.mtt_table = mthca_alloc_icm_table(mdev, init_hca-&gt;mtt_base,<br />- init_hca-&gt;mtt_seg_sz,<br />+ dev_lim-&gt;mtt_seg_sz,<br /> mdev-&gt;limits.num_mtt_segs,<br /> mdev-&gt;limits.reserved_mtts, 1);<br /> if (!mdev-&gt;mr_table.mtt_table) {<br />--- linux-export.orig/drivers/infiniband/hw/mthca/mthca_memfree.c 2005-03-31 19:06:42.000000000 -0800<br />+++ linux-export/drivers/infiniband/hw/mthca/mthca_memfree.c 2005-04-01 12:38:19.911638409 -0800<br />&#64;&#64; -192,6 +192,38 &#64;&#64;<br /> up(&amp;table-&gt;mutex);<br /> }<br /> <br />+int mthca_table_get_range(struct mthca_dev *dev, struct mthca_icm_table *table,<br />+ int start, int end)<br />+{<br />+ int inc = MTHCA_TABLE_CHUNK_SIZE / table-&gt;obj_size;<br />+ int i, err;<br />+<br />+ for (i = start; i &lt;= end; i += inc) {<br />+ err = mthca_table_get(dev, table, i);<br />+ if (err)<br />+ goto fail;<br />+ }<br />+<br />+ return 0;<br />+<br />+fail:<br />+ while (i &gt; start) {<br />+ i -= inc;<br />+ mthca_table_put(dev, table, i);<br />+ }<br />+<br />+ return err;<br />+}<br />+<br />+void mthca_table_put_range(struct mthca_dev *dev, struct mthca_icm_table *table,<br />+ int start, int end)<br />+{<br />+ int i;<br />+<br />+ for (i = start; i &lt;= end; i += MTHCA_TABLE_CHUNK_SIZE / table-&gt;obj_size)<br />+ mthca_table_put(dev, table, i);<br />+}<br />+<br /> struct mthca_icm_table *mthca_alloc_icm_table(struct mthca_dev *dev,<br /> u64 virt, int obj_size,<br /> int nobj, int reserved,<br />--- linux-export.orig/drivers/infiniband/hw/mthca/mthca_memfree.h 2005-03-31 19:06:56.000000000 -0800<br />+++ linux-export/drivers/infiniband/hw/mthca/mthca_memfree.h 2005-04-01 12:38:19.895641881 -0800<br />&#64;&#64; -85,6 +85,10 &#64;&#64;<br /> void mthca_free_icm_table(struct mthca_dev *dev, struct mthca_icm_table *table);<br /> int mthca_table_get(struct mthca_dev *dev, struct mthca_icm_table *table, int obj);<br /> void mthca_table_put(struct mthca_dev *dev, struct mthca_icm_table *table, int obj);<br />+int mthca_table_get_range(struct mthca_dev *dev, struct mthca_icm_table *table,<br />+ int start, int end);<br />+void mthca_table_put_range(struct mthca_dev *dev, struct mthca_icm_table *table,<br />+ int start, int end);<br /> <br /> static inline void mthca_icm_first(struct mthca_icm *icm,<br /> struct mthca_icm_iter *iter)<br />--- linux-export.orig/drivers/infiniband/hw/mthca/mthca_mr.c 2005-03-31 19:07:06.000000000 -0800<br />+++ linux-export/drivers/infiniband/hw/mthca/mthca_mr.c 2005-04-01 12:38:19.903640145 -0800<br />&#64;&#64; -38,6 +38,7 &#64;&#64;<br /> <br /> #include "mthca_dev.h"<br /> #include "mthca_cmd.h"<br />+#include "mthca_memfree.h"<br /> <br /> /*<br /> * Must be packed because mtt_seg is 64 bits but only aligned to 32 bits.<br />&#64;&#64; -71,7 +72,7 &#64;&#64;<br /> * through the bitmaps)<br /> */<br /> <br />-static u32 mthca_alloc_mtt(struct mthca_dev *dev, int order)<br />+static u32 __mthca_alloc_mtt(struct mthca_dev *dev, int order)<br /> {<br /> int o;<br /> int m;<br />&#64;&#64; -105,7 +106,7 &#64;&#64;<br /> return seg;<br /> }<br /> <br />-static void mthca_free_mtt(struct mthca_dev *dev, u32 seg, int order)<br />+static void __mthca_free_mtt(struct mthca_dev *dev, u32 seg, int order)<br /> {<br /> seg &gt;&gt;= order;<br /> <br />&#64;&#64; -122,6 +123,32 &#64;&#64;<br /> spin_unlock(&amp;dev-&gt;mr_table.mpt_alloc.lock);<br /> }<br /> <br />+static u32 mthca_alloc_mtt(struct mthca_dev *dev, int order)<br />+{<br />+ u32 seg = __mthca_alloc_mtt(dev, order);<br />+<br />+ if (seg == -1)<br />+ return -1;<br />+<br />+ if (dev-&gt;hca_type == ARBEL_NATIVE)<br />+ if (mthca_table_get_range(dev, dev-&gt;mr_table.mtt_table, seg,<br />+ seg + (1 &lt;&lt; order) - 1)) {<br />+ __mthca_free_mtt(dev, seg, order);<br />+ seg = -1;<br />+ }<br />+<br />+ return seg;<br />+}<br />+<br />+static void mthca_free_mtt(struct mthca_dev *dev, u32 seg, int order)<br />+{<br />+ __mthca_free_mtt(dev, seg, order);<br />+<br />+ if (dev-&gt;hca_type == ARBEL_NATIVE)<br />+ mthca_table_put_range(dev, dev-&gt;mr_table.mtt_table, seg,<br />+ seg + (1 &lt;&lt; order) - 1);<br />+}<br />+<br /> static inline u32 hw_index_to_key(struct mthca_dev *dev, u32 ind)<br /> {<br /> if (dev-&gt;hca_type == ARBEL_NATIVE)<br />&#64;&#64; -141,7 +168,7 &#64;&#64;<br /> int mthca_mr_alloc_notrans(struct mthca_dev *dev, u32 pd,<br /> u32 access, struct mthca_mr *mr)<br /> {<br />- void *mailbox;<br />+ void *mailbox = NULL;<br /> struct mthca_mpt_entry *mpt_entry;<br /> u32 key;<br /> int err;<br />&#64;&#64; -155,11 +182,17 &#64;&#64;<br /> return -ENOMEM;<br /> mr-&gt;ibmr.rkey = mr-&gt;ibmr.lkey = hw_index_to_key(dev, key);<br /> <br />+ if (dev-&gt;hca_type == ARBEL_NATIVE) {<br />+ err = mthca_table_get(dev, dev-&gt;mr_table.mpt_table, key);<br />+ if (err)<br />+ goto err_out_mpt_free;<br />+ }<br />+<br /> mailbox = kmalloc(sizeof *mpt_entry + MTHCA_CMD_MAILBOX_EXTRA,<br /> GFP_KERNEL);<br /> if (!mailbox) {<br />- mthca_free(&amp;dev-&gt;mr_table.mpt_alloc, mr-&gt;ibmr.lkey);<br />- return -ENOMEM;<br />+ err = -ENOMEM;<br />+ goto err_out_table;<br /> }<br /> mpt_entry = MAILBOX_ALIGN(mailbox);<br /> <br />&#64;&#64; -180,16 +213,27 &#64;&#64;<br /> err = mthca_SW2HW_MPT(dev, mpt_entry,<br /> key &amp; (dev-&gt;limits.num_mpts - 1),<br /> &amp;status);<br />- if (err)<br />+ if (err) {<br /> mthca_warn(dev, "SW2HW_MPT failed (%d)\n", err);<br />- else if (status) {<br />+ goto err_out_table;<br />+ } else if (status) {<br /> mthca_warn(dev, "SW2HW_MPT returned status 0x%02x\n",<br /> status);<br /> err = -EINVAL;<br />+ goto err_out_table;<br /> }<br /> <br /> kfree(mailbox);<br /> return err;<br />+<br />+err_out_table:<br />+ if (dev-&gt;hca_type == ARBEL_NATIVE)<br />+ mthca_table_put(dev, dev-&gt;mr_table.mpt_table, key);<br />+<br />+err_out_mpt_free:<br />+ mthca_free(&amp;dev-&gt;mr_table.mpt_alloc, mr-&gt;ibmr.lkey);<br />+ kfree(mailbox);<br />+ return err;<br /> }<br /> <br /> int mthca_mr_alloc_phys(struct mthca_dev *dev, u32 pd,<br />&#64;&#64; -213,6 +257,12 &#64;&#64;<br /> return -ENOMEM;<br /> mr-&gt;ibmr.rkey = mr-&gt;ibmr.lkey = hw_index_to_key(dev, key);<br /> <br />+ if (dev-&gt;hca_type == ARBEL_NATIVE) {<br />+ err = mthca_table_get(dev, dev-&gt;mr_table.mpt_table, key);<br />+ if (err)<br />+ goto err_out_mpt_free;<br />+ }<br />+<br /> for (i = dev-&gt;limits.mtt_seg_size / 8, mr-&gt;order = 0;<br /> i &lt; list_len;<br /> i &lt;&lt;= 1, ++mr-&gt;order)<br />&#64;&#64; -220,7 +270,7 &#64;&#64;<br /> <br /> mr-&gt;first_seg = mthca_alloc_mtt(dev, mr-&gt;order);<br /> if (mr-&gt;first_seg == -1)<br />- goto err_out_mpt_free;<br />+ goto err_out_table;<br /> <br /> /*<br /> * If list_len is odd, we add one more dummy entry for<br />&#64;&#64; -307,13 +357,17 &#64;&#64;<br /> kfree(mailbox);<br /> return err;<br /> <br />- err_out_mailbox_free:<br />+err_out_mailbox_free:<br /> kfree(mailbox);<br /> <br />- err_out_free_mtt:<br />+err_out_free_mtt:<br /> mthca_free_mtt(dev, mr-&gt;first_seg, mr-&gt;order);<br /> <br />- err_out_mpt_free:<br />+err_out_table:<br />+ if (dev-&gt;hca_type == ARBEL_NATIVE)<br />+ mthca_table_put(dev, dev-&gt;mr_table.mpt_table, key);<br />+<br />+err_out_mpt_free:<br /> mthca_free(&amp;dev-&gt;mr_table.mpt_alloc, mr-&gt;ibmr.lkey);<br /> return err;<br /> }<br />&#64;&#64; -338,6 +392,9 &#64;&#64;<br /> if (mr-&gt;order &gt;= 0)<br /> mthca_free_mtt(dev, mr-&gt;first_seg, mr-&gt;order);<br /> <br />+ if (dev-&gt;hca_type == ARBEL_NATIVE)<br />+ mthca_table_put(dev, dev-&gt;mr_table.mpt_table,<br />+ key_to_hw_index(dev, mr-&gt;ibmr.lkey));<br /> mthca_free(&amp;dev-&gt;mr_table.mpt_alloc, key_to_hw_index(dev, mr-&gt;ibmr.lkey));<br /> }<br /> <br />-<br />To unsubscribe from this list: send the line "unsubscribe linux-kernel" in<br />the body of a message to majordomo&#64;vger.kernel.org<br />More majordomo info at <a href="http://vger.kernel.org/majordomo-info.html">http://vger.kernel.org/majordomo-info.html</a><br />Please read the FAQ at <a href="http://www.tux.org/lkml/">http://www.tux.org/lkml/</a><br /><br /></pre></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerr.gif" width="32" height="32" alt="\" /></td></tr><tr><td align="right" valign="bottom"> 聽 </td></tr><tr><td align="right" valign="bottom">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerl.gif" width="32" height="32" alt="\" /></td><td class="c">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerr.gif" width="32" height="32" alt="/" /></td></tr><tr><td align="right" valign="top" colspan="2"> 聽 </td><td class="lm">Last update: 2005-04-06 13:31 聽聽 [from the cache]<br />漏2003-2020 <a href="http://blog.jasper.es/"><span itemprop="editor">Jasper Spaans</span></a>|hosted at <a href="https://www.digitalocean.com/?refcode=9a8e99d24cf9">Digital Ocean</a> and my Meterkast|<a href="http://blog.jasper.es/categories.html#lkml-ref">Read the blog</a></td><td>聽</td></tr></table><script language="javascript" src="/js/styleswitcher.js" type="text/javascript"></script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10