Commit 0f4d027c authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Doug Ledford

IB/{rdmavt, qib, hfi1}: Remove gfp flags argument

The caller to the driver marks GFP_NOIO allocations with help
of memalloc_noio-* calls now. This makes redundant to pass down
to the driver gfp flags, which can be GFP_KERNEL only.

The patch removes the gfp flags argument and updates all driver paths.
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Acked-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent d83187dd
...@@ -647,18 +647,17 @@ void qp_iter_print(struct seq_file *s, struct qp_iter *iter) ...@@ -647,18 +647,17 @@ void qp_iter_print(struct seq_file *s, struct qp_iter *iter)
qp->pid); qp->pid);
} }
void *qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp, void *qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp)
gfp_t gfp)
{ {
struct hfi1_qp_priv *priv; struct hfi1_qp_priv *priv;
priv = kzalloc_node(sizeof(*priv), gfp, rdi->dparms.node); priv = kzalloc_node(sizeof(*priv), GFP_KERNEL, rdi->dparms.node);
if (!priv) if (!priv)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
priv->owner = qp; priv->owner = qp;
priv->s_ahg = kzalloc_node(sizeof(*priv->s_ahg), gfp, priv->s_ahg = kzalloc_node(sizeof(*priv->s_ahg), GFP_KERNEL,
rdi->dparms.node); rdi->dparms.node);
if (!priv->s_ahg) { if (!priv->s_ahg) {
kfree(priv); kfree(priv);
......
...@@ -123,8 +123,7 @@ void hfi1_migrate_qp(struct rvt_qp *qp); ...@@ -123,8 +123,7 @@ void hfi1_migrate_qp(struct rvt_qp *qp);
/* /*
* Functions provided by hfi1 driver for rdmavt to use * Functions provided by hfi1 driver for rdmavt to use
*/ */
void *qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp, void *qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp);
gfp_t gfp);
void qp_priv_free(struct rvt_dev_info *rdi, struct rvt_qp *qp); void qp_priv_free(struct rvt_dev_info *rdi, struct rvt_qp *qp);
unsigned free_all_qps(struct rvt_dev_info *rdi); unsigned free_all_qps(struct rvt_dev_info *rdi);
void notify_qp_reset(struct rvt_qp *qp); void notify_qp_reset(struct rvt_qp *qp);
......
...@@ -104,10 +104,9 @@ const struct rvt_operation_params qib_post_parms[RVT_OPERATION_MAX] = { ...@@ -104,10 +104,9 @@ const struct rvt_operation_params qib_post_parms[RVT_OPERATION_MAX] = {
}; };
static void get_map_page(struct rvt_qpn_table *qpt, struct rvt_qpn_map *map, static void get_map_page(struct rvt_qpn_table *qpt, struct rvt_qpn_map *map)
gfp_t gfp)
{ {
unsigned long page = get_zeroed_page(gfp); unsigned long page = get_zeroed_page(GFP_KERNEL);
/* /*
* Free the page if someone raced with us installing it. * Free the page if someone raced with us installing it.
...@@ -126,7 +125,7 @@ static void get_map_page(struct rvt_qpn_table *qpt, struct rvt_qpn_map *map, ...@@ -126,7 +125,7 @@ static void get_map_page(struct rvt_qpn_table *qpt, struct rvt_qpn_map *map,
* zero/one for QP type IB_QPT_SMI/IB_QPT_GSI. * zero/one for QP type IB_QPT_SMI/IB_QPT_GSI.
*/ */
int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt, int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
enum ib_qp_type type, u8 port, gfp_t gfp) enum ib_qp_type type, u8 port)
{ {
u32 i, offset, max_scan, qpn; u32 i, offset, max_scan, qpn;
struct rvt_qpn_map *map; struct rvt_qpn_map *map;
...@@ -160,7 +159,7 @@ int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt, ...@@ -160,7 +159,7 @@ int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
max_scan = qpt->nmaps - !offset; max_scan = qpt->nmaps - !offset;
for (i = 0;;) { for (i = 0;;) {
if (unlikely(!map->page)) { if (unlikely(!map->page)) {
get_map_page(qpt, map, gfp); get_map_page(qpt, map);
if (unlikely(!map->page)) if (unlikely(!map->page))
break; break;
} }
...@@ -317,16 +316,16 @@ u32 qib_mtu_from_qp(struct rvt_dev_info *rdi, struct rvt_qp *qp, u32 pmtu) ...@@ -317,16 +316,16 @@ u32 qib_mtu_from_qp(struct rvt_dev_info *rdi, struct rvt_qp *qp, u32 pmtu)
return ib_mtu_enum_to_int(pmtu); return ib_mtu_enum_to_int(pmtu);
} }
void *qib_qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp, gfp_t gfp) void *qib_qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp)
{ {
struct qib_qp_priv *priv; struct qib_qp_priv *priv;
priv = kzalloc(sizeof(*priv), gfp); priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv) if (!priv)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
priv->owner = qp; priv->owner = qp;
priv->s_hdr = kzalloc(sizeof(*priv->s_hdr), gfp); priv->s_hdr = kzalloc(sizeof(*priv->s_hdr), GFP_KERNEL);
if (!priv->s_hdr) { if (!priv->s_hdr) {
kfree(priv); kfree(priv);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
......
...@@ -274,11 +274,11 @@ int qib_get_counters(struct qib_pportdata *ppd, ...@@ -274,11 +274,11 @@ int qib_get_counters(struct qib_pportdata *ppd,
* Functions provided by qib driver for rdmavt to use * Functions provided by qib driver for rdmavt to use
*/ */
unsigned qib_free_all_qps(struct rvt_dev_info *rdi); unsigned qib_free_all_qps(struct rvt_dev_info *rdi);
void *qib_qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp, gfp_t gfp); void *qib_qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp);
void qib_qp_priv_free(struct rvt_dev_info *rdi, struct rvt_qp *qp); void qib_qp_priv_free(struct rvt_dev_info *rdi, struct rvt_qp *qp);
void qib_notify_qp_reset(struct rvt_qp *qp); void qib_notify_qp_reset(struct rvt_qp *qp);
int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt, int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
enum ib_qp_type type, u8 port, gfp_t gfp); enum ib_qp_type type, u8 port);
void qib_restart_rc(struct rvt_qp *qp, u32 psn, int wait); void qib_restart_rc(struct rvt_qp *qp, u32 psn, int wait);
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
......
...@@ -118,10 +118,9 @@ const int ib_rvt_state_ops[IB_QPS_ERR + 1] = { ...@@ -118,10 +118,9 @@ const int ib_rvt_state_ops[IB_QPS_ERR + 1] = {
EXPORT_SYMBOL(ib_rvt_state_ops); EXPORT_SYMBOL(ib_rvt_state_ops);
static void get_map_page(struct rvt_qpn_table *qpt, static void get_map_page(struct rvt_qpn_table *qpt,
struct rvt_qpn_map *map, struct rvt_qpn_map *map)
gfp_t gfp)
{ {
unsigned long page = get_zeroed_page(gfp); unsigned long page = get_zeroed_page(GFP_KERNEL);
/* /*
* Free the page if someone raced with us installing it. * Free the page if someone raced with us installing it.
...@@ -173,7 +172,7 @@ static int init_qpn_table(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt) ...@@ -173,7 +172,7 @@ static int init_qpn_table(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt)
rdi->dparms.qpn_res_start, rdi->dparms.qpn_res_end); rdi->dparms.qpn_res_start, rdi->dparms.qpn_res_end);
for (i = rdi->dparms.qpn_res_start; i <= rdi->dparms.qpn_res_end; i++) { for (i = rdi->dparms.qpn_res_start; i <= rdi->dparms.qpn_res_end; i++) {
if (!map->page) { if (!map->page) {
get_map_page(qpt, map, GFP_KERNEL); get_map_page(qpt, map);
if (!map->page) { if (!map->page) {
ret = -ENOMEM; ret = -ENOMEM;
break; break;
...@@ -342,14 +341,14 @@ static inline unsigned mk_qpn(struct rvt_qpn_table *qpt, ...@@ -342,14 +341,14 @@ static inline unsigned mk_qpn(struct rvt_qpn_table *qpt,
* Return: The queue pair number * Return: The queue pair number
*/ */
static int alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt, static int alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
enum ib_qp_type type, u8 port_num, gfp_t gfp) enum ib_qp_type type, u8 port_num)
{ {
u32 i, offset, max_scan, qpn; u32 i, offset, max_scan, qpn;
struct rvt_qpn_map *map; struct rvt_qpn_map *map;
u32 ret; u32 ret;
if (rdi->driver_f.alloc_qpn) if (rdi->driver_f.alloc_qpn)
return rdi->driver_f.alloc_qpn(rdi, qpt, type, port_num, gfp); return rdi->driver_f.alloc_qpn(rdi, qpt, type, port_num);
if (type == IB_QPT_SMI || type == IB_QPT_GSI) { if (type == IB_QPT_SMI || type == IB_QPT_GSI) {
unsigned n; unsigned n;
...@@ -374,7 +373,7 @@ static int alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt, ...@@ -374,7 +373,7 @@ static int alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
max_scan = qpt->nmaps - !offset; max_scan = qpt->nmaps - !offset;
for (i = 0;;) { for (i = 0;;) {
if (unlikely(!map->page)) { if (unlikely(!map->page)) {
get_map_page(qpt, map, gfp); get_map_page(qpt, map);
if (unlikely(!map->page)) if (unlikely(!map->page))
break; break;
} }
...@@ -672,7 +671,6 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, ...@@ -672,7 +671,6 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
struct ib_qp *ret = ERR_PTR(-ENOMEM); struct ib_qp *ret = ERR_PTR(-ENOMEM);
struct rvt_dev_info *rdi = ib_to_rvt(ibpd->device); struct rvt_dev_info *rdi = ib_to_rvt(ibpd->device);
void *priv = NULL; void *priv = NULL;
gfp_t gfp;
size_t sqsize; size_t sqsize;
if (!rdi) if (!rdi)
...@@ -680,18 +678,9 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, ...@@ -680,18 +678,9 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
if (init_attr->cap.max_send_sge > rdi->dparms.props.max_sge || if (init_attr->cap.max_send_sge > rdi->dparms.props.max_sge ||
init_attr->cap.max_send_wr > rdi->dparms.props.max_qp_wr || init_attr->cap.max_send_wr > rdi->dparms.props.max_qp_wr ||
init_attr->create_flags & ~(IB_QP_CREATE_USE_GFP_NOIO)) init_attr->create_flags)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
/* GFP_NOIO is applicable to RC QP's only */
if (init_attr->create_flags & IB_QP_CREATE_USE_GFP_NOIO &&
init_attr->qp_type != IB_QPT_RC)
return ERR_PTR(-EINVAL);
gfp = init_attr->create_flags & IB_QP_CREATE_USE_GFP_NOIO ?
GFP_NOIO : GFP_KERNEL;
/* Check receive queue parameters if no SRQ is specified. */ /* Check receive queue parameters if no SRQ is specified. */
if (!init_attr->srq) { if (!init_attr->srq) {
if (init_attr->cap.max_recv_sge > rdi->dparms.props.max_sge || if (init_attr->cap.max_recv_sge > rdi->dparms.props.max_sge ||
...@@ -719,14 +708,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, ...@@ -719,14 +708,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
sz = sizeof(struct rvt_sge) * sz = sizeof(struct rvt_sge) *
init_attr->cap.max_send_sge + init_attr->cap.max_send_sge +
sizeof(struct rvt_swqe); sizeof(struct rvt_swqe);
if (gfp == GFP_NOIO) swq = vzalloc_node(sqsize * sz, rdi->dparms.node);
swq = __vmalloc(
sqsize * sz,
gfp | __GFP_ZERO, PAGE_KERNEL);
else
swq = vzalloc_node(
sqsize * sz,
rdi->dparms.node);
if (!swq) if (!swq)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -741,7 +723,8 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, ...@@ -741,7 +723,8 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
} else if (init_attr->cap.max_recv_sge > 1) } else if (init_attr->cap.max_recv_sge > 1)
sg_list_sz = sizeof(*qp->r_sg_list) * sg_list_sz = sizeof(*qp->r_sg_list) *
(init_attr->cap.max_recv_sge - 1); (init_attr->cap.max_recv_sge - 1);
qp = kzalloc_node(sz + sg_list_sz, gfp, rdi->dparms.node); qp = kzalloc_node(sz + sg_list_sz, GFP_KERNEL,
rdi->dparms.node);
if (!qp) if (!qp)
goto bail_swq; goto bail_swq;
...@@ -751,7 +734,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, ...@@ -751,7 +734,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
kzalloc_node( kzalloc_node(
sizeof(*qp->s_ack_queue) * sizeof(*qp->s_ack_queue) *
rvt_max_atomic(rdi), rvt_max_atomic(rdi),
gfp, GFP_KERNEL,
rdi->dparms.node); rdi->dparms.node);
if (!qp->s_ack_queue) if (!qp->s_ack_queue)
goto bail_qp; goto bail_qp;
...@@ -766,7 +749,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, ...@@ -766,7 +749,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
* Driver needs to set up it's private QP structure and do any * Driver needs to set up it's private QP structure and do any
* initialization that is needed. * initialization that is needed.
*/ */
priv = rdi->driver_f.qp_priv_alloc(rdi, qp, gfp); priv = rdi->driver_f.qp_priv_alloc(rdi, qp);
if (IS_ERR(priv)) { if (IS_ERR(priv)) {
ret = priv; ret = priv;
goto bail_qp; goto bail_qp;
...@@ -786,11 +769,6 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, ...@@ -786,11 +769,6 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
qp->r_rq.wq = vmalloc_user( qp->r_rq.wq = vmalloc_user(
sizeof(struct rvt_rwq) + sizeof(struct rvt_rwq) +
qp->r_rq.size * sz); qp->r_rq.size * sz);
else if (gfp == GFP_NOIO)
qp->r_rq.wq = __vmalloc(
sizeof(struct rvt_rwq) +
qp->r_rq.size * sz,
gfp | __GFP_ZERO, PAGE_KERNEL);
else else
qp->r_rq.wq = vzalloc_node( qp->r_rq.wq = vzalloc_node(
sizeof(struct rvt_rwq) + sizeof(struct rvt_rwq) +
...@@ -824,7 +802,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, ...@@ -824,7 +802,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
err = alloc_qpn(rdi, &rdi->qp_dev->qpn_table, err = alloc_qpn(rdi, &rdi->qp_dev->qpn_table,
init_attr->qp_type, init_attr->qp_type,
init_attr->port_num, gfp); init_attr->port_num);
if (err < 0) { if (err < 0) {
ret = ERR_PTR(err); ret = ERR_PTR(err);
goto bail_rq_wq; goto bail_rq_wq;
......
...@@ -229,8 +229,7 @@ struct rvt_driver_provided { ...@@ -229,8 +229,7 @@ struct rvt_driver_provided {
* ERR_PTR(err). The driver is free to return NULL or a valid * ERR_PTR(err). The driver is free to return NULL or a valid
* pointer. * pointer.
*/ */
void * (*qp_priv_alloc)(struct rvt_dev_info *rdi, struct rvt_qp *qp, void * (*qp_priv_alloc)(struct rvt_dev_info *rdi, struct rvt_qp *qp);
gfp_t gfp);
/* /*
* Free the driver's private qp structure. * Free the driver's private qp structure.
...@@ -319,7 +318,7 @@ struct rvt_driver_provided { ...@@ -319,7 +318,7 @@ struct rvt_driver_provided {
/* Let the driver pick the next queue pair number*/ /* Let the driver pick the next queue pair number*/
int (*alloc_qpn)(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt, int (*alloc_qpn)(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
enum ib_qp_type type, u8 port_num, gfp_t gfp); enum ib_qp_type type, u8 port_num);
/* Determine if its safe or allowed to modify the qp */ /* Determine if its safe or allowed to modify the qp */
int (*check_modify_qp)(struct rvt_qp *qp, struct ib_qp_attr *attr, int (*check_modify_qp)(struct rvt_qp *qp, struct ib_qp_attr *attr,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment