<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle19
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='color:#1F497D'>It was fixed starting Windows 7/Server 2008 R2.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>It may make sense to trap the target OS version in the build and conditionally build the cache?  I would think the simpler we can make the code, the better.  Then we can mark the older OS code with descriptive checks to allow deleting it as we drop support for older operating systems.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>-Fab<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><div style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Leonid Keller [mailto:leonid@mellanox.co.il] <br><b>Sent:</b> Monday, December 13, 2010 2:12 AM<br><b>To:</b> Fab Tillier; 'ofw@lists.openfabrics.org'<br><b>Subject:</b> RE: [ofw] [patch][mlx4] enlarge the bus driver internal limitation on the system memory size from 256 GB to 8 TB<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='color:#1F497D'>Good news, I didn’t know.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Do you know in what version was it fixed ?<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>We still support win2k3 and winxp …<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><div style='border:none;border-right:solid blue 1.5pt;padding:0in 0in 0in 0in'><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Fab Tillier [mailto:ftillier@microsoft.com] <br><b>Sent:</b> Monday, December 13, 2010 7:14 AM<br><b>To:</b> Leonid Keller; 'ofw@lists.openfabrics.org'<br><b>Subject:</b> RE: [ofw] [patch][mlx4] enlarge the bus driver internal limitation on the system memory size from 256 GB to 8 TB<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='color:#1F497D'>Note that the whole cache can go away – the memory corruption when probing pages for write access has been fixed, and you can just call MmProbeAndLockPages.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>-Fab<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b>From:</b> ofw-bounces@lists.openfabrics.org [mailto:ofw-bounces@lists.openfabrics.org] <b>On Behalf Of </b>Leonid Keller<br><b>Sent:</b> Sunday, December 12, 2010 6:02 AM<br><b>To:</b> 'ofw@lists.openfabrics.org'<br><b>Subject:</b> [ofw] [patch][mlx4] enlarge the bus driver internal limitation on the system memory size from 256 GB to 8 TB<o:p></o:p></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The bus driver memory registration mechanism is using internal cash that sets some limitation on the system memory size.<o:p></o:p></p><p class=MsoNormal>Till now it was 256 GB, but a customer of us has machines with up to 1 TB system memory…<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Index: hw/mlx4/kernel/bus/core/pa_cash.c<o:p></o:p></p><p class=MsoNormal>===================================================================<o:p></o:p></p><p class=MsoNormal>--- hw/mlx4/kernel/bus/core/pa_cash.c               (revision 3023)<o:p></o:p></p><p class=MsoNormal>+++ hw/mlx4/kernel/bus/core/pa_cash.c            (working copy)<o:p></o:p></p><p class=MsoNormal>@@ -50,9 +50,10 @@<o:p></o:p></p><p class=MsoNormal> ///////////////////////////////////////////////////////////////////////////<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> #ifdef _WIN64<o:p></o:p></p><p class=MsoNormal>-#define MAX_PAGES_SUPPORTED        (64 * 1024 * 1024)                            // 256 GB<o:p></o:p></p><p class=MsoNormal>+// be careful with setting it >= 4G. Compiler puts it into an integer, so 4*1024*1024*1024 = 0 !!!<o:p></o:p></p><p class=MsoNormal>+#define MAX_PAGES_SUPPORTED       ((u32)2 * 1024 * 1024 * 1024)                                                                      // 8 TB<o:p></o:p></p><p class=MsoNormal> #else<o:p></o:p></p><p class=MsoNormal>-#define MAX_PAGES_SUPPORTED        (16 * 1024 * 1024)                            // 64 GB<o:p></o:p></p><p class=MsoNormal>+#define MAX_PAGES_SUPPORTED       ((u32)16 * 1024 * 1024)                                                                                                                 // 64 GB<o:p></o:p></p><p class=MsoNormal> #endif<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> #define FREE_LIST_TRESHOLD                  256                         // max number of pages in free list<o:p></o:p></p><p class=MsoNormal>@@ -63,13 +64,9 @@<o:p></o:p></p><p class=MsoNormal> //<o:p></o:p></p><p class=MsoNormal> ///////////////////////////////////////////////////////////////////////////<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>-#define PA_TABLE_ENTRY_SIZE              sizeof(pa_table_entry_t)<o:p></o:p></p><p class=MsoNormal>-#define PA_TABLE_ENTRY_NUM           (PAGE_SIZE / PA_TABLE_ENTRY_SIZE)<o:p></o:p></p><p class=MsoNormal>-#define PA_TABLE_SIZE                                              (PA_TABLE_ENTRY_SIZE * PA_TABLE_ENTRY_NUM)<o:p></o:p></p><p class=MsoNormal>+#define PA_TABLE_ENTRY_SIZE                             sizeof(pa_table_entry_t)                                                                             // 4<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>-#define PA_DIR_ENTRY_SIZE                   sizeof(pa_dir_entry_t)<o:p></o:p></p><p class=MsoNormal>-#define PA_DIR_ENTRY_NUM                 (MAX_PAGES_SUPPORTED /PA_TABLE_ENTRY_NUM)<o:p></o:p></p><p class=MsoNormal>-#define PA_DIR_SIZE                                                   (PA_DIR_ENTRY_SIZE * PA_DIR_ENTRY_NUM)<o:p></o:p></p><p class=MsoNormal>+#define PA_DIR_ENTRY_SIZE                  sizeof(pa_dir_entry_t)                                                                                  // 16 for x64<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> ///////////////////////////////////////////////////////////////////////////<o:p></o:p></p><p class=MsoNormal>@@ -107,6 +104,11 @@<o:p></o:p></p><p class=MsoNormal> DEFINE_MUTEX(g_pa_mutex);<o:p></o:p></p><p class=MsoNormal> u64 g_pa[1024];<o:p></o:p></p><p class=MsoNormal> pa_cash_t g_cash;<o:p></o:p></p><p class=MsoNormal>+u32 g_max_pages_supported = 0;<o:p></o:p></p><p class=MsoNormal>+u32 g_pa_table_entry_num = 0;<o:p></o:p></p><p class=MsoNormal>+u32 g_pa_table_size = 0;<o:p></o:p></p><p class=MsoNormal>+u32 g_pa_dir_entry_num = 0;<o:p></o:p></p><p class=MsoNormal>+u32 g_pa_dir_size = 0;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> ///////////////////////////////////////////////////////////////////////////<o:p></o:p></p><p class=MsoNormal>@@ -133,7 +135,7 @@<o:p></o:p></p><p class=MsoNormal>                                g_cash.free_nr_pages--;<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>                else  /* allocate new page */<o:p></o:p></p><p class=MsoNormal>-                              pa_te = (pa_table_entry_t *)kzalloc( PA_TABLE_SIZE, GFP_KERNEL );<o:p></o:p></p><p class=MsoNormal>+                             pa_te = (pa_table_entry_t *)kzalloc( g_pa_table_size, GFP_KERNEL );<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                return pa_te;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal>@@ -150,15 +152,15 @@<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> static pa_table_entry_t * pa_get_page(uint32_t ix)<o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal>-              pa_table_entry_t *pa_te =  g_cash.pa_dir[ix / PA_TABLE_ENTRY_NUM].pa_te;<o:p></o:p></p><p class=MsoNormal>+             pa_table_entry_t *pa_te =  g_cash.pa_dir[ix / g_pa_table_entry_num].pa_te;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                /* no this page_table - add a new one */<o:p></o:p></p><p class=MsoNormal>                if (!pa_te) {<o:p></o:p></p><p class=MsoNormal>                                pa_te = pa_alloc_page();<o:p></o:p></p><p class=MsoNormal>                                if (!pa_te) <o:p></o:p></p><p class=MsoNormal>                                                return NULL;<o:p></o:p></p><p class=MsoNormal>-                              g_cash.pa_dir[ix / PA_TABLE_ENTRY_NUM].pa_te = pa_te;<o:p></o:p></p><p class=MsoNormal>-                              g_cash.pa_dir[ix / PA_TABLE_ENTRY_NUM].used = 0;<o:p></o:p></p><p class=MsoNormal>+                             g_cash.pa_dir[ix / g_pa_table_entry_num].pa_te = pa_te;<o:p></o:p></p><p class=MsoNormal>+                             g_cash.pa_dir[ix / g_pa_table_entry_num].used = 0;<o:p></o:p></p><p class=MsoNormal>                                g_cash.cur_nr_pages++;<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>@@ -167,8 +169,8 @@<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> static void pa_put_page(uint32_t ix)<o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal>-              pa_free_page(g_cash.pa_dir[ix / PA_TABLE_ENTRY_NUM].pa_te);<o:p></o:p></p><p class=MsoNormal>-              g_cash.pa_dir[ix / PA_TABLE_ENTRY_NUM].pa_te = NULL;<o:p></o:p></p><p class=MsoNormal>+             pa_free_page(g_cash.pa_dir[ix / g_pa_table_entry_num].pa_te);<o:p></o:p></p><p class=MsoNormal>+             g_cash.pa_dir[ix / g_pa_table_entry_num].pa_te = NULL;<o:p></o:p></p><p class=MsoNormal>                g_cash.cur_nr_pages--;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>@@ -189,9 +191,9 @@<o:p></o:p></p><p class=MsoNormal>                                return -ENOMEM;<o:p></o:p></p><p class=MsoNormal>                <o:p></o:p></p><p class=MsoNormal>                /* register page address */<o:p></o:p></p><p class=MsoNormal>-              if (!pa_te[ix % PA_TABLE_ENTRY_NUM].ref_cnt)<o:p></o:p></p><p class=MsoNormal>-                              ++g_cash.pa_dir[ix / PA_TABLE_ENTRY_NUM].used;<o:p></o:p></p><p class=MsoNormal>-              ++pa_te[ix % PA_TABLE_ENTRY_NUM].ref_cnt;<o:p></o:p></p><p class=MsoNormal>+             if (!pa_te[ix % g_pa_table_entry_num].ref_cnt)<o:p></o:p></p><p class=MsoNormal>+                             ++g_cash.pa_dir[ix / g_pa_table_entry_num].used;<o:p></o:p></p><p class=MsoNormal>+             ++pa_te[ix % g_pa_table_entry_num].ref_cnt;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                return 0;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal>@@ -208,7 +210,7 @@<o:p></o:p></p><p class=MsoNormal>                                return -EFAULT;<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>                                <o:p></o:p></p><p class=MsoNormal>-              pa_te =  g_cash.pa_dir[ix / PA_TABLE_ENTRY_NUM].pa_te;<o:p></o:p></p><p class=MsoNormal>+             pa_te =  g_cash.pa_dir[ix / g_pa_table_entry_num].pa_te;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                /* no this page_table - error*/<o:p></o:p></p><p class=MsoNormal>                if (!pa_te)  {<o:p></o:p></p><p class=MsoNormal>@@ -217,13 +219,13 @@<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                /* deregister page address */<o:p></o:p></p><p class=MsoNormal>-              --pa_te[ix % PA_TABLE_ENTRY_NUM].ref_cnt;<o:p></o:p></p><p class=MsoNormal>-              ASSERT(pa_te[ix % PA_TABLE_ENTRY_NUM].ref_cnt >= 0);<o:p></o:p></p><p class=MsoNormal>+             --pa_te[ix % g_pa_table_entry_num].ref_cnt;<o:p></o:p></p><p class=MsoNormal>+             ASSERT(pa_te[ix % g_pa_table_entry_num].ref_cnt >= 0);<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                /* release the page on need */<o:p></o:p></p><p class=MsoNormal>-              if (!pa_te[ix % PA_TABLE_ENTRY_NUM].ref_cnt)<o:p></o:p></p><p class=MsoNormal>-                              --g_cash.pa_dir[ix / PA_TABLE_ENTRY_NUM].used;<o:p></o:p></p><p class=MsoNormal>-              if (!g_cash.pa_dir[ix / PA_TABLE_ENTRY_NUM].used) <o:p></o:p></p><p class=MsoNormal>+             if (!pa_te[ix % g_pa_table_entry_num].ref_cnt)<o:p></o:p></p><p class=MsoNormal>+                             --g_cash.pa_dir[ix / g_pa_table_entry_num].used;<o:p></o:p></p><p class=MsoNormal>+             if (!g_cash.pa_dir[ix / g_pa_table_entry_num].used) <o:p></o:p></p><p class=MsoNormal>                                pa_put_page(ix);<o:p></o:p></p><p class=MsoNormal>                                <o:p></o:p></p><p class=MsoNormal>                return 0;<o:p></o:p></p><p class=MsoNormal>@@ -301,7 +303,7 @@<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> void pa_cash_release()<o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal>-              int i;<o:p></o:p></p><p class=MsoNormal>+             u32 i;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                pa_cash_print();<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>@@ -309,7 +311,7 @@<o:p></o:p></p><p class=MsoNormal>                                return;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                /* free cash tables */<o:p></o:p></p><p class=MsoNormal>-              for (i=0; i<PA_DIR_ENTRY_NUM; ++i)<o:p></o:p></p><p class=MsoNormal>+             for (i=0; i<g_pa_dir_entry_num; ++i)<o:p></o:p></p><p class=MsoNormal>                                if (g_cash.pa_dir[i].pa_te) {<o:p></o:p></p><p class=MsoNormal>                                                kfree(g_cash.pa_dir[i].pa_te);<o:p></o:p></p><p class=MsoNormal>                                                g_cash.cur_nr_pages--;<o:p></o:p></p><p class=MsoNormal>@@ -338,24 +340,31 @@<o:p></o:p></p><p class=MsoNormal>                                return -EFAULT;<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>                                <o:p></o:p></p><p class=MsoNormal>-              pa_te =  g_cash.pa_dir[ix / PA_TABLE_ENTRY_NUM].pa_te;<o:p></o:p></p><p class=MsoNormal>+             pa_te =  g_cash.pa_dir[ix / g_pa_table_entry_num].pa_te;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>                /* no this page_table */<o:p></o:p></p><p class=MsoNormal>                if (!pa_te)<o:p></o:p></p><p class=MsoNormal>                                return 0;<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>-              return pa_te[ix % PA_TABLE_ENTRY_NUM].ref_cnt;<o:p></o:p></p><p class=MsoNormal>+             return pa_te[ix % g_pa_table_entry_num].ref_cnt;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal> int pa_cash_init()<o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal>                void *pa_dir;<o:p></o:p></p><p class=MsoNormal>-              pa_dir = kzalloc(PA_DIR_SIZE, GFP_KERNEL);<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>+             g_max_pages_supported = MAX_PAGES_SUPPORTED;<o:p></o:p></p><p class=MsoNormal>+             g_pa_table_entry_num = PAGE_SIZE / PA_TABLE_ENTRY_SIZE;<o:p></o:p></p><p class=MsoNormal>+             g_pa_table_size = PA_TABLE_ENTRY_SIZE * g_pa_table_entry_num;<o:p></o:p></p><p class=MsoNormal>+             g_pa_dir_entry_num = g_max_pages_supported /g_pa_table_entry_num;<o:p></o:p></p><p class=MsoNormal>+             g_pa_dir_size = PA_DIR_ENTRY_SIZE * g_pa_dir_entry_num;<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+             pa_dir = kzalloc(g_pa_dir_size, GFP_KERNEL);<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>                if (!pa_dir)<o:p></o:p></p><p class=MsoNormal>                                return -ENOMEM;<o:p></o:p></p><p class=MsoNormal>                g_cash.pa_dir = pa_dir;<o:p></o:p></p><p class=MsoNormal>-              g_cash.max_nr_pages = PA_TABLE_ENTRY_NUM * PA_DIR_ENTRY_NUM;<o:p></o:p></p><p class=MsoNormal>+             g_cash.max_nr_pages = g_pa_table_entry_num * g_pa_dir_entry_num;<o:p></o:p></p><p class=MsoNormal>                g_cash.free_list_hdr.Next = NULL;<o:p></o:p></p><p class=MsoNormal>                g_cash.cur_nr_pages = 0;<o:p></o:p></p><p class=MsoNormal>                g_cash.free_nr_pages = 0;<o:p></o:p></p><p class=MsoNormal>@@ -363,4 +372,4 @@<o:p></o:p></p><p class=MsoNormal>                mutex_init(&g_pa_mutex);<o:p></o:p></p><p class=MsoNormal>                return 0;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal>-<o:p></o:p></p><p class=MsoNormal>+             <o:p></o:p></p></div></div></div></body></html>