Re: [PATCH] rbd: use GFP_NOIO consistently for request allocations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Apr 5, 2016 at 11:13 AM, David Disseldorp <ddiss@xxxxxxx> wrote:
> As of 5a60e87603c4c533492c515b7f62578189b03c9c, RBD object request
> allocations are made via rbd_obj_request_create() with GFP_NOIO.
> However, subsequent OSD request allocations in rbd_osd_req_create*()
> use GFP_ATOMIC.
>
> With heavy page cache usage (e.g. OSDs running on same host as krbd
> client), rbd_osd_req_create() order-1 GFP_ATOMIC allocations have been
> observed to fail, where direct reclaim would have allowed GFP_NOIO
> allocations to succeed.
>
> Suggested-by: Vlastimil Babka <vbabka@xxxxxxx>
> Suggested-by: Neil Brown <neilb@xxxxxxxx>
> Signed-off-by: David Disseldorp <ddiss@xxxxxxx>
> ---
>  drivers/block/rbd.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index 9c62344..94a1843 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -1953,7 +1953,7 @@ static struct ceph_osd_request *rbd_osd_req_create(
>
>         osdc = &rbd_dev->rbd_client->client->osdc;
>         osd_req = ceph_osdc_alloc_request(osdc, snapc, num_ops, false,
> -                                         GFP_ATOMIC);
> +                                         GFP_NOIO);
>         if (!osd_req)
>                 return NULL;    /* ENOMEM */
>
> @@ -2002,7 +2002,7 @@ rbd_osd_req_create_copyup(struct rbd_obj_request *obj_request)
>         rbd_dev = img_request->rbd_dev;
>         osdc = &rbd_dev->rbd_client->client->osdc;
>         osd_req = ceph_osdc_alloc_request(osdc, snapc, num_osd_ops,
> -                                               false, GFP_ATOMIC);
> +                                               false, GFP_NOIO);
>         if (!osd_req)
>                 return NULL;    /* ENOMEM */
>
> @@ -2504,7 +2504,7 @@ static int rbd_img_request_fill(struct rbd_img_request *img_request,
>                                         bio_chain_clone_range(&bio_list,
>                                                                 &bio_offset,
>                                                                 clone_size,
> -                                                               GFP_ATOMIC);
> +                                                               GFP_NOIO);
>                         if (!obj_request->bio_list)
>                                 goto out_unwind;
>                 } else if (type == OBJ_REQUEST_PAGES) {

I've got the first two fixed in one of my wip branches but it's tied to
ceph_osdc_alloc_request() changes.  Given that allocation failures were
observed, I guess it's worth sending this one to stable right away.
I'll queue it up, thanks David.

                Ilya
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux