Message ID | 1600283326-30323-1-git-send-email-manjunath.b.patil@oracle.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [1/1] net/rds: suppress page allocation failure error in recv buffer refill | expand |
On 9/16/20 12:08 PM, Manjunath Patil wrote: > RDS/IB tries to refill the recv buffer in softirq context using > GFP_NOWAIT flag. However alloc failure is handled by queueing a work to > refill the recv buffer with GFP_KERNEL flag. This means failure to > allocate with GFP_NOWAIT isn't fatal. Do not print the PAF warnings if > softirq context fails to refill the recv buffer, instead print a one > line warning once a day. > > Signed-off-by: Manjunath Patil <manjunath.b.patil@oracle.com> > Reviewed-by: Aruna Ramakrishna <aruna.ramakrishna@oracle.com> > --- > net/rds/ib_recv.c | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > > diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c > index 694d411dc72f..38d2894f6bb2 100644 > --- a/net/rds/ib_recv.c > +++ b/net/rds/ib_recv.c > @@ -310,8 +310,8 @@ static int rds_ib_recv_refill_one(struct rds_connection *conn, > struct rds_ib_connection *ic = conn->c_transport_data; > struct ib_sge *sge; > int ret = -ENOMEM; > - gfp_t slab_mask = GFP_NOWAIT; > - gfp_t page_mask = GFP_NOWAIT; > + gfp_t slab_mask = gfp; > + gfp_t page_mask = gfp; > > if (gfp & __GFP_DIRECT_RECLAIM) { > slab_mask = GFP_KERNEL; > @@ -406,6 +406,16 @@ void rds_ib_recv_refill(struct rds_connection *conn, int prefill, gfp_t gfp) > recv = &ic->i_recvs[pos]; > ret = rds_ib_recv_refill_one(conn, recv, gfp); > if (ret) { > + static unsigned long warn_time; Comment should start on next line. > + /* warn max once per day. This should be enough to > + * warn users about low mem situation. > + */ > + if (printk_timed_ratelimit(&warn_time, > + 24 * 60 * 60 * 1000)) > + pr_warn("RDS/IB: failed to refill recv buffer for <%pI6c,%pI6c,%d>, waking worker\n", > + &conn->c_laddr, &conn->c_faddr, > + conn->c_tos); Didn't notice this before. Why not just use "pr_warn_ratelimited()" ? > + > must_wake = true; > break; > } > @@ -1020,7 +1030,7 @@ void rds_ib_recv_cqe_handler(struct rds_ib_connection *ic, > rds_ib_stats_inc(s_ib_rx_ring_empty); > > if (rds_ib_ring_low(&ic->i_recv_ring)) { > - rds_ib_recv_refill(conn, 0, GFP_NOWAIT); > + rds_ib_recv_refill(conn, 0, GFP_NOWAIT | __GFP_NOWARN); > rds_ib_stats_inc(s_ib_rx_refill_from_cq); > } > } >
Hi Santosh, inline. On 9/16/2020 12:27 PM, santosh.shilimkar@oracle.com wrote: > On 9/16/20 12:08 PM, Manjunath Patil wrote: >> RDS/IB tries to refill the recv buffer in softirq context using >> GFP_NOWAIT flag. However alloc failure is handled by queueing a work to >> refill the recv buffer with GFP_KERNEL flag. This means failure to >> allocate with GFP_NOWAIT isn't fatal. Do not print the PAF warnings if >> softirq context fails to refill the recv buffer, instead print a one >> line warning once a day. >> >> Signed-off-by: Manjunath Patil <manjunath.b.patil@oracle.com> >> Reviewed-by: Aruna Ramakrishna <aruna.ramakrishna@oracle.com> >> --- >> net/rds/ib_recv.c | 16 +++++++++++++--- >> 1 file changed, 13 insertions(+), 3 deletions(-) >> >> diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c >> index 694d411dc72f..38d2894f6bb2 100644 >> --- a/net/rds/ib_recv.c >> +++ b/net/rds/ib_recv.c >> @@ -310,8 +310,8 @@ static int rds_ib_recv_refill_one(struct >> rds_connection *conn, >> struct rds_ib_connection *ic = conn->c_transport_data; >> struct ib_sge *sge; >> int ret = -ENOMEM; >> - gfp_t slab_mask = GFP_NOWAIT; >> - gfp_t page_mask = GFP_NOWAIT; >> + gfp_t slab_mask = gfp; >> + gfp_t page_mask = gfp; >> if (gfp & __GFP_DIRECT_RECLAIM) { >> slab_mask = GFP_KERNEL; >> @@ -406,6 +406,16 @@ void rds_ib_recv_refill(struct rds_connection >> *conn, int prefill, gfp_t gfp) >> recv = &ic->i_recvs[pos]; >> ret = rds_ib_recv_refill_one(conn, recv, gfp); >> if (ret) { >> + static unsigned long warn_time; > Comment should start on next line. I will add new line. checkpatch.pl didn't find it though. >> + /* warn max once per day. This should be enough to >> + * warn users about low mem situation. >> + */ >> + if (printk_timed_ratelimit(&warn_time, >> + 24 * 60 * 60 * 1000)) >> + pr_warn("RDS/IB: failed to refill recv buffer for >> <%pI6c,%pI6c,%d>, waking worker\n", >> + &conn->c_laddr, &conn->c_faddr, >> + conn->c_tos); > Didn't notice this before. > Why not just use "pr_warn_ratelimited()" ? I think you meant, get rid of if clause and use "pr_warn_ratelimited()" instead. That can still produce more than needed logs during low memory situation. -Thanks, Manjunath >> + >> must_wake = true; >> break; >> } >> @@ -1020,7 +1030,7 @@ void rds_ib_recv_cqe_handler(struct >> rds_ib_connection *ic, >> rds_ib_stats_inc(s_ib_rx_ring_empty); >> if (rds_ib_ring_low(&ic->i_recv_ring)) { >> - rds_ib_recv_refill(conn, 0, GFP_NOWAIT); >> + rds_ib_recv_refill(conn, 0, GFP_NOWAIT | __GFP_NOWARN); >> rds_ib_stats_inc(s_ib_rx_refill_from_cq); >> } >> } >>
On 9/16/20 2:15 PM, Manjunath Patil wrote: > Hi Santosh, > > inline. > On 9/16/2020 12:27 PM, santosh.shilimkar@oracle.com wrote: >> On 9/16/20 12:08 PM, Manjunath Patil wrote: >>> RDS/IB tries to refill the recv buffer in softirq context using >>> GFP_NOWAIT flag. However alloc failure is handled by queueing a work to >>> refill the recv buffer with GFP_KERNEL flag. This means failure to >>> allocate with GFP_NOWAIT isn't fatal. Do not print the PAF warnings if >>> softirq context fails to refill the recv buffer, instead print a one >>> line warning once a day. >>> >>> Signed-off-by: Manjunath Patil <manjunath.b.patil@oracle.com> >>> Reviewed-by: Aruna Ramakrishna <aruna.ramakrishna@oracle.com> >>> --- >>> net/rds/ib_recv.c | 16 +++++++++++++--- >>> 1 file changed, 13 insertions(+), 3 deletions(-) >>> >>> diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c >>> index 694d411dc72f..38d2894f6bb2 100644 >>> --- a/net/rds/ib_recv.c >>> +++ b/net/rds/ib_recv.c >>> @@ -310,8 +310,8 @@ static int rds_ib_recv_refill_one(struct >>> rds_connection *conn, >>> struct rds_ib_connection *ic = conn->c_transport_data; >>> struct ib_sge *sge; >>> int ret = -ENOMEM; >>> - gfp_t slab_mask = GFP_NOWAIT; >>> - gfp_t page_mask = GFP_NOWAIT; >>> + gfp_t slab_mask = gfp; >>> + gfp_t page_mask = gfp; >>> if (gfp & __GFP_DIRECT_RECLAIM) { >>> slab_mask = GFP_KERNEL; >>> @@ -406,6 +406,16 @@ void rds_ib_recv_refill(struct rds_connection >>> *conn, int prefill, gfp_t gfp) >>> recv = &ic->i_recvs[pos]; >>> ret = rds_ib_recv_refill_one(conn, recv, gfp); >>> if (ret) { >>> + static unsigned long warn_time; >> Comment should start on next line. > I will add new line. checkpatch.pl didn't find it though. >>> + /* warn max once per day. This should be enough to >>> + * warn users about low mem situation. >>> + */ >>> + if (printk_timed_ratelimit(&warn_time, >>> + 24 * 60 * 60 * 1000)) >>> + pr_warn("RDS/IB: failed to refill recv buffer for >>> <%pI6c,%pI6c,%d>, waking worker\n", >>> + &conn->c_laddr, &conn->c_faddr, >>> + conn->c_tos); >> Didn't notice this before. >> Why not just use "pr_warn_ratelimited()" ? > I think you meant, get rid of if clause and use "pr_warn_ratelimited()" > instead. > That can still produce more than needed logs during low memory situation. > Try it out. It will do the same job as what you are trying to do.
On 9/16/2020 2:25 PM, santosh.shilimkar@oracle.com wrote: > On 9/16/20 2:15 PM, Manjunath Patil wrote: >> Hi Santosh, >> >> inline. >> On 9/16/2020 12:27 PM, santosh.shilimkar@oracle.com wrote: >>> On 9/16/20 12:08 PM, Manjunath Patil wrote: >>>> RDS/IB tries to refill the recv buffer in softirq context using >>>> GFP_NOWAIT flag. However alloc failure is handled by queueing a >>>> work to >>>> refill the recv buffer with GFP_KERNEL flag. This means failure to >>>> allocate with GFP_NOWAIT isn't fatal. Do not print the PAF warnings if >>>> softirq context fails to refill the recv buffer, instead print a one >>>> line warning once a day. >>>> >>>> Signed-off-by: Manjunath Patil <manjunath.b.patil@oracle.com> >>>> Reviewed-by: Aruna Ramakrishna <aruna.ramakrishna@oracle.com> >>>> --- >>>> net/rds/ib_recv.c | 16 +++++++++++++--- >>>> 1 file changed, 13 insertions(+), 3 deletions(-) >>>> >>>> diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c >>>> index 694d411dc72f..38d2894f6bb2 100644 >>>> --- a/net/rds/ib_recv.c >>>> +++ b/net/rds/ib_recv.c >>>> @@ -310,8 +310,8 @@ static int rds_ib_recv_refill_one(struct >>>> rds_connection *conn, >>>> struct rds_ib_connection *ic = conn->c_transport_data; >>>> struct ib_sge *sge; >>>> int ret = -ENOMEM; >>>> - gfp_t slab_mask = GFP_NOWAIT; >>>> - gfp_t page_mask = GFP_NOWAIT; >>>> + gfp_t slab_mask = gfp; >>>> + gfp_t page_mask = gfp; >>>> if (gfp & __GFP_DIRECT_RECLAIM) { >>>> slab_mask = GFP_KERNEL; >>>> @@ -406,6 +406,16 @@ void rds_ib_recv_refill(struct rds_connection >>>> *conn, int prefill, gfp_t gfp) >>>> recv = &ic->i_recvs[pos]; >>>> ret = rds_ib_recv_refill_one(conn, recv, gfp); >>>> if (ret) { >>>> + static unsigned long warn_time; >>> Comment should start on next line. >> I will add new line. checkpatch.pl didn't find it though. >>>> + /* warn max once per day. This should be enough to >>>> + * warn users about low mem situation. >>>> + */ >>>> + if (printk_timed_ratelimit(&warn_time, >>>> + 24 * 60 * 60 * 1000)) >>>> + pr_warn("RDS/IB: failed to refill recv buffer for >>>> <%pI6c,%pI6c,%d>, waking worker\n", >>>> + &conn->c_laddr, &conn->c_faddr, >>>> + conn->c_tos); >>> Didn't notice this before. >>> Why not just use "pr_warn_ratelimited()" ? >> I think you meant, get rid of if clause and use >> "pr_warn_ratelimited()" instead. >> That can still produce more than needed logs during low memory >> situation. >> > Try it out. It will do the same job as what you are trying to do. Sure. I will use it and see. I will submit next version after my testing. -Thanks, Manjunath
diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c index 694d411dc72f..38d2894f6bb2 100644 --- a/net/rds/ib_recv.c +++ b/net/rds/ib_recv.c @@ -310,8 +310,8 @@ static int rds_ib_recv_refill_one(struct rds_connection *conn, struct rds_ib_connection *ic = conn->c_transport_data; struct ib_sge *sge; int ret = -ENOMEM; - gfp_t slab_mask = GFP_NOWAIT; - gfp_t page_mask = GFP_NOWAIT; + gfp_t slab_mask = gfp; + gfp_t page_mask = gfp; if (gfp & __GFP_DIRECT_RECLAIM) { slab_mask = GFP_KERNEL; @@ -406,6 +406,16 @@ void rds_ib_recv_refill(struct rds_connection *conn, int prefill, gfp_t gfp) recv = &ic->i_recvs[pos]; ret = rds_ib_recv_refill_one(conn, recv, gfp); if (ret) { + static unsigned long warn_time; + /* warn max once per day. This should be enough to + * warn users about low mem situation. + */ + if (printk_timed_ratelimit(&warn_time, + 24 * 60 * 60 * 1000)) + pr_warn("RDS/IB: failed to refill recv buffer for <%pI6c,%pI6c,%d>, waking worker\n", + &conn->c_laddr, &conn->c_faddr, + conn->c_tos); + must_wake = true; break; } @@ -1020,7 +1030,7 @@ void rds_ib_recv_cqe_handler(struct rds_ib_connection *ic, rds_ib_stats_inc(s_ib_rx_ring_empty); if (rds_ib_ring_low(&ic->i_recv_ring)) { - rds_ib_recv_refill(conn, 0, GFP_NOWAIT); + rds_ib_recv_refill(conn, 0, GFP_NOWAIT | __GFP_NOWARN); rds_ib_stats_inc(s_ib_rx_refill_from_cq); } }