IB/ehca: Support large page MRs
Add support for MR pages larger than 4K on eHCA2. This reduces firmware memory consumption. If enabled via the mr_largepage module parameter, the MR page size will be determined based on the MR length and the hardware capabilities -- if the MR is >= 16M, 16M pages are used, for example. Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
committed by
Roland Dreier
parent
23f1b38481
commit
5bb7d9290c
@@ -63,6 +63,7 @@ int ehca_port_act_time = 30;
|
||||
int ehca_poll_all_eqs = 1;
|
||||
int ehca_static_rate = -1;
|
||||
int ehca_scaling_code = 0;
|
||||
int ehca_mr_largepage = 0;
|
||||
|
||||
module_param_named(open_aqp1, ehca_open_aqp1, int, 0);
|
||||
module_param_named(debug_level, ehca_debug_level, int, 0);
|
||||
@@ -72,7 +73,8 @@ module_param_named(use_hp_mr, ehca_use_hp_mr, int, 0);
|
||||
module_param_named(port_act_time, ehca_port_act_time, int, 0);
|
||||
module_param_named(poll_all_eqs, ehca_poll_all_eqs, int, 0);
|
||||
module_param_named(static_rate, ehca_static_rate, int, 0);
|
||||
module_param_named(scaling_code, ehca_scaling_code, int, 0);
|
||||
module_param_named(scaling_code, ehca_scaling_code, int, 0);
|
||||
module_param_named(mr_largepage, ehca_mr_largepage, int, 0);
|
||||
|
||||
MODULE_PARM_DESC(open_aqp1,
|
||||
"AQP1 on startup (0: no (default), 1: yes)");
|
||||
@@ -95,6 +97,9 @@ MODULE_PARM_DESC(static_rate,
|
||||
"set permanent static rate (default: disabled)");
|
||||
MODULE_PARM_DESC(scaling_code,
|
||||
"set scaling code (0: disabled/default, 1: enabled)");
|
||||
MODULE_PARM_DESC(mr_largepage,
|
||||
"use large page for MR (0: use PAGE_SIZE (default), "
|
||||
"1: use large page depending on MR size");
|
||||
|
||||
DEFINE_RWLOCK(ehca_qp_idr_lock);
|
||||
DEFINE_RWLOCK(ehca_cq_idr_lock);
|
||||
@@ -295,6 +300,8 @@ int ehca_sense_attributes(struct ehca_shca *shca)
|
||||
if (EHCA_BMASK_GET(hca_cap_descr[i].mask, shca->hca_cap))
|
||||
ehca_gen_dbg(" %s", hca_cap_descr[i].descr);
|
||||
|
||||
shca->hca_cap_mr_pgsize = rblock->memory_page_size_supported;
|
||||
|
||||
port = (struct hipz_query_port *)rblock;
|
||||
h_ret = hipz_h_query_port(shca->ipz_hca_handle, 1, port);
|
||||
if (h_ret != H_SUCCESS) {
|
||||
@@ -590,6 +597,14 @@ static ssize_t ehca_show_adapter_handle(struct device *dev,
|
||||
}
|
||||
static DEVICE_ATTR(adapter_handle, S_IRUGO, ehca_show_adapter_handle, NULL);
|
||||
|
||||
static ssize_t ehca_show_mr_largepage(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
return sprintf(buf, "%d\n", ehca_mr_largepage);
|
||||
}
|
||||
static DEVICE_ATTR(mr_largepage, S_IRUGO, ehca_show_mr_largepage, NULL);
|
||||
|
||||
static struct attribute *ehca_dev_attrs[] = {
|
||||
&dev_attr_adapter_handle.attr,
|
||||
&dev_attr_num_ports.attr,
|
||||
@@ -606,6 +621,7 @@ static struct attribute *ehca_dev_attrs[] = {
|
||||
&dev_attr_cur_mw.attr,
|
||||
&dev_attr_max_pd.attr,
|
||||
&dev_attr_max_ah.attr,
|
||||
&dev_attr_mr_largepage.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user