Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp3014835pxu; Sat, 10 Oct 2020 16:09:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzWoUeMFb6SedsQPB7ytE+3GPFxdX/kN7g2LrRdllVjZHe2NCOi01mAtwhuSnvWOpMivPPE X-Received: by 2002:aa7:c586:: with SMTP id g6mr6652613edq.343.1602371397883; Sat, 10 Oct 2020 16:09:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1602371397; cv=none; d=google.com; s=arc-20160816; b=E49HrMVEz1TCdtZaWT01qAv3qO5O7Z7QQrMfYdUE9evSIV0cSEDPKSCpi4kCPlvdXi 5yKxjY47P3uRh+OUP9FEPQZEnWW2QlDZ4wcNPdXoGGXt8NObEhkR43GCRWvrSPOwV2Dj 5T9QVRf76AuHrtzI1y8XBT+ap6I/zz1ICHOuK0xh7PlLo10Gs+14v4f3TGPoLDi7Klm8 zD/1hNMAEFioHwHV0fTi3xf6ZLExXgQl/c9FhOW5Bm8r3qahimSjrBZQZiT6fUEjMQVZ dc+QdZJIfH6RHhRB48MYfGF8MpMmZ68Ga1gWYXn3b3DldSnlo3Sa9VDTWhZY6LGi0BVC h1Sg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=eOErpfOgEHvqoynno+X7K2KGQQjqKpNf/4DLHM6VCxI=; b=S17c7uppknviv6joTTP74l5BzpDXfZvwhX/vVczBZ8bvV7j0jqFEYwMVt6pqQX0kHx LoJeB1dCXEopZTCX6a6HH3QfWLJXJhwZCksiLT9kkWC7jOYkWm7AY22kCe5MfGFa7kFA Jfa6LZ45ode2oB6wE1120vedXShPwxUezwlm/RnelYfrdFC6yogtzTZmqaDzACUAJxUo UW9lZHwpZ1b9IHuIzW3AZ6z1bkyszFm3d4nsKbw53LJi1drvR/D7nlydqwP0xowxFaw3 TRcPJbTxT8NECTXGRyCTioudmTBQMeSCJu+ghBDRTOHYqpVysyc/B+5sG5iAJ6YSj1Fi uFWQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ffwll.ch header.s=google header.b=bkgteCVx; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b15si9759480edk.374.2020.10.10.16.09.35; Sat, 10 Oct 2020 16:09:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@ffwll.ch header.s=google header.b=bkgteCVx; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732489AbgJJW7g (ORCPT + 99 others); Sat, 10 Oct 2020 18:59:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57244 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728491AbgJJVcW (ORCPT ); Sat, 10 Oct 2020 17:32:22 -0400 Received: from mail-oi1-x244.google.com (mail-oi1-x244.google.com [IPv6:2607:f8b0:4864:20::244]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3E559C0613D5 for ; Sat, 10 Oct 2020 14:32:15 -0700 (PDT) Received: by mail-oi1-x244.google.com with SMTP id t77so14306983oie.4 for ; Sat, 10 Oct 2020 14:32:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=eOErpfOgEHvqoynno+X7K2KGQQjqKpNf/4DLHM6VCxI=; b=bkgteCVxwM6kN0aEzNJYsf26mAIxhPv2McdrAdqiyH+C70JfkVfDt7/M5rR+rAdLhG cuhWtQlVsFvREMMLlMZEjS9TQsBb7WZQ8UggkyE4P+OvWApOlJjAa2toOrzS1mKuBYLH D1CUxJYWqX5UONNm+6mBvlB1DGdxP0Yv9uoBY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=eOErpfOgEHvqoynno+X7K2KGQQjqKpNf/4DLHM6VCxI=; b=HDxw8uo9Rznu7bPmIqu3xnnxSEDlx7kzdEUGv4dJa4O9G1U4rYKs8bZRYfj/DUaVOA RC0fnNh+dZgLXRBeOQV2q/4a1u8QQ+y5jcGOrORT3W0Ps9Ho7NOjVyrwqyqHeggY8s+W NLeSwCc9mEkDWEiw57l1c97T5gC+yzEC8a7niCsAs3gRVmRNB2775UePtC/rWFmhHMc9 zXw64g7TEBwBlogeqYSpUFMkYNajyWADFWBEjT8SEIO/FVDD9JEJf5BNMdS0BHFDu/8U mBp3Yp4qxd7a0Khcu2LQ/R3JG+UpcoMD/MgWcayJNO6ZHZPCz7wO+RUjG2pcljleP+oc dygA== X-Gm-Message-State: AOAM530ylb7xHqkWoNz1A27y4TR0oMkvA1bnpok8U35NJAJOKI4KqyDY cnsbDSlTrVM+9VaL/Gz+7sGIjqw4DGgfGzgTwsRqJA== X-Received: by 2002:aca:52c4:: with SMTP id g187mr6142563oib.101.1602365534555; Sat, 10 Oct 2020 14:32:14 -0700 (PDT) MIME-Version: 1.0 References: <20201009075934.3509076-1-daniel.vetter@ffwll.ch> <20201009075934.3509076-4-daniel.vetter@ffwll.ch> In-Reply-To: From: Daniel Vetter Date: Sat, 10 Oct 2020 23:32:03 +0200 Message-ID: Subject: Re: [PATCH v2 03/17] misc/habana: Stop using frame_vector helpers To: Oded Gabbay Cc: DRI Development , LKML , KVM list , linux-mm , "list@263.net:IOMMU DRIVERS , Joerg Roedel ," , linux-samsung-soc , Linux Media Mailing List , linux-s390 , Daniel Vetter , Jason Gunthorpe , Andrew Morton , John Hubbard , =?UTF-8?B?SsOpcsO0bWUgR2xpc3Nl?= , Jan Kara , Dan Williams , Omer Shpigelman , Ofir Bitton , Tomer Tayar , Moti Haimovski , Greg Kroah-Hartman , Pawel Piskorski Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, Oct 10, 2020 at 10:27 PM Oded Gabbay wrote: > > On Fri, Oct 9, 2020 at 10:59 AM Daniel Vetter wr= ote: > > > > All we need are a pages array, pin_user_pages_fast can give us that > > directly. Plus this avoids the entire raw pfn side of get_vaddr_frames. > > > Thanks for the patch Daniel. > > > Signed-off-by: Daniel Vetter > > Cc: Jason Gunthorpe > > Cc: Andrew Morton > > Cc: John Hubbard > > Cc: J=C3=A9r=C3=B4me Glisse > > Cc: Jan Kara > > Cc: Dan Williams > > Cc: linux-mm@kvack.org > > Cc: linux-arm-kernel@lists.infradead.org > > Cc: linux-samsung-soc@vger.kernel.org > > Cc: linux-media@vger.kernel.org > > Cc: Oded Gabbay > > Cc: Omer Shpigelman > > Cc: Ofir Bitton > > Cc: Tomer Tayar > > Cc: Moti Haimovski > > Cc: Daniel Vetter > > Cc: Greg Kroah-Hartman > > Cc: Pawel Piskorski > > -- > > v2: Use unpin_user_pages_dirty_lock (John) > > --- > > drivers/misc/habanalabs/Kconfig | 1 - > > drivers/misc/habanalabs/common/habanalabs.h | 3 +- > > drivers/misc/habanalabs/common/memory.c | 49 ++++++++------------- > > 3 files changed, 20 insertions(+), 33 deletions(-) > > > > diff --git a/drivers/misc/habanalabs/Kconfig b/drivers/misc/habanalabs/= Kconfig > > index 8eb5d38c618e..2f04187f7167 100644 > > --- a/drivers/misc/habanalabs/Kconfig > > +++ b/drivers/misc/habanalabs/Kconfig > > @@ -6,7 +6,6 @@ > > config HABANA_AI > > tristate "HabanaAI accelerators (habanalabs)" > > depends on PCI && HAS_IOMEM > > - select FRAME_VECTOR > > select DMA_SHARED_BUFFER > > select GENERIC_ALLOCATOR > > select HWMON > > diff --git a/drivers/misc/habanalabs/common/habanalabs.h b/drivers/misc= /habanalabs/common/habanalabs.h > > index edbd627b29d2..c1b3ad613b15 100644 > > --- a/drivers/misc/habanalabs/common/habanalabs.h > > +++ b/drivers/misc/habanalabs/common/habanalabs.h > > @@ -881,7 +881,8 @@ struct hl_ctx_mgr { > > struct hl_userptr { > > enum vm_type_t vm_type; /* must be first */ > > struct list_head job_node; > > - struct frame_vector *vec; > > + struct page **pages; > > + unsigned int npages; > Can you please update the kerneldoc comment section of this structure > according to your changes ? Apologies I missed the nice kerneldoc. I'll fix that in the next round. > > struct sg_table *sgt; > > enum dma_data_direction dir; > > struct list_head debugfs_list; > > diff --git a/drivers/misc/habanalabs/common/memory.c b/drivers/misc/hab= analabs/common/memory.c > > index 5ff4688683fd..327b64479f97 100644 > > --- a/drivers/misc/habanalabs/common/memory.c > > +++ b/drivers/misc/habanalabs/common/memory.c > > @@ -1281,45 +1281,41 @@ static int get_user_memory(struct hl_device *hd= ev, u64 addr, u64 size, > > return -EFAULT; > > } > > > > - userptr->vec =3D frame_vector_create(npages); > > - if (!userptr->vec) { > > + userptr->pages =3D kvmalloc_array(npages, sizeof(*userptr->page= s), > > + GFP_KERNEL); > > + if (!userptr->pages) { > > dev_err(hdev->dev, "Failed to create frame vector\n"); > > return -ENOMEM; > > } > > > > - rc =3D get_vaddr_frames(start, npages, FOLL_FORCE | FOLL_WRITE, > > - userptr->vec); > > + rc =3D pin_user_pages_fast(start, npages, FOLL_FORCE | FOLL_WRI= TE, > > + userptr->pages); > > > > if (rc !=3D npages) { > > dev_err(hdev->dev, > > "Failed to map host memory, user ptr probably w= rong\n"); > > if (rc < 0) > > - goto destroy_framevec; > > + goto destroy_pages; > > + npages =3D rc; > > rc =3D -EFAULT; > > - goto put_framevec; > > - } > > - > > - if (frame_vector_to_pages(userptr->vec) < 0) { > > - dev_err(hdev->dev, > > - "Failed to translate frame vector to pages\n"); > > - rc =3D -EFAULT; > > - goto put_framevec; > > + goto put_pages; > > } > > + userptr->npages =3D npages; > > > > rc =3D sg_alloc_table_from_pages(userptr->sgt, > > - frame_vector_pages(userptr->vec= ), > > - npages, offset, size, GFP_ATOMI= C); > > + userptr->pages, > > + npages, offset, size, GFP_ATOMIC= ); > I think that because the call to kvmalloc_array() is done with > GFP_KERNEL, there is no point in using GFP_ATOMIC here. > And actually, this path only needs to avoid yielding when using a > special debug mode. > So I suggest putting here GFP_KERNEL. Huh, I didn't even notice the GFP_ATOMIC here. This looks indeed strange and GFP_KERNEL should be perfectly fine in a function that also calls pin_user_pages (since that one can allocate and do worse stuff like userspace pagefaults). But since that GFP_ATOMIC is there already I'll do that in a separate patch= . > In the meanwhile, I'll run this patch (coupled with the next patch) in > our C/I to make sure there are no regressions. Excellent. I'll wait with v3 until that's done, just in case you hit a snag I need to fix. Cheers, Daniel > Thanks, > Oded > > > if (rc < 0) { > > dev_err(hdev->dev, "failed to create SG table from page= s\n"); > > - goto put_framevec; > > + goto put_pages; > > } > > > > return 0; > > > > -put_framevec: > > - put_vaddr_frames(userptr->vec); > > -destroy_framevec: > > - frame_vector_destroy(userptr->vec); > > +put_pages: > > + unpin_user_pages(userptr->pages, npages); > > +destroy_pages: > > + kvfree(userptr->pages); > > return rc; > > } > > > > @@ -1405,8 +1401,6 @@ int hl_pin_host_memory(struct hl_device *hdev, u6= 4 addr, u64 size, > > */ > > void hl_unpin_host_memory(struct hl_device *hdev, struct hl_userptr *u= serptr) > > { > > - struct page **pages; > > - > > hl_debugfs_remove_userptr(hdev, userptr); > > > > if (userptr->dma_mapped) > > @@ -1414,15 +1408,8 @@ void hl_unpin_host_memory(struct hl_device *hdev= , struct hl_userptr *userptr) > > userptr->sgt->n= ents, > > userptr->dir); > > > > - pages =3D frame_vector_pages(userptr->vec); > > - if (!IS_ERR(pages)) { > > - int i; > > - > > - for (i =3D 0; i < frame_vector_count(userptr->vec); i++= ) > > - set_page_dirty_lock(pages[i]); > > - } > > - put_vaddr_frames(userptr->vec); > > - frame_vector_destroy(userptr->vec); > > + unpin_user_pages_dirty_lock(userptr->pages, userptr->npages, tr= ue); > > + kvfree(userptr->pages); > > > > list_del(&userptr->job_node); > > > > -- > > 2.28.0 > > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch