Re: [PATCH RFC PKS/PMEM 22/58] fs/f2fs: Utilize new kmap_thread()

2020-10-09 Thread James Bottomley
On Fri, 2020-10-09 at 14:34 -0700, Eric Biggers wrote:
> On Fri, Oct 09, 2020 at 12:49:57PM -0700, ira.we...@intel.com wrote:
> > From: Ira Weiny 
> > 
> > The kmap() calls in this FS are localized to a single thread.  To
> > avoid the over head of global PKRS updates use the new
> > kmap_thread() call.
> > 
> > Cc: Jaegeuk Kim 
> > Cc: Chao Yu 
> > Signed-off-by: Ira Weiny 
> > ---
> >  fs/f2fs/f2fs.h | 8 
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> > 
> > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> > index d9e52a7f3702..ff72a45a577e 100644
> > --- a/fs/f2fs/f2fs.h
> > +++ b/fs/f2fs/f2fs.h
> > @@ -2410,12 +2410,12 @@ static inline struct page
> > *f2fs_pagecache_get_page(
> >  
> >  static inline void f2fs_copy_page(struct page *src, struct page
> > *dst)
> >  {
> > -   char *src_kaddr = kmap(src);
> > -   char *dst_kaddr = kmap(dst);
> > +   char *src_kaddr = kmap_thread(src);
> > +   char *dst_kaddr = kmap_thread(dst);
> >  
> > memcpy(dst_kaddr, src_kaddr, PAGE_SIZE);
> > -   kunmap(dst);
> > -   kunmap(src);
> > +   kunmap_thread(dst);
> > +   kunmap_thread(src);
> >  }
> 
> Wouldn't it make more sense to switch cases like this to
> kmap_atomic()?
> The pages are only mapped to do a memcpy(), then they're immediately
> unmapped.

On a VIPT/VIVT architecture, this is horrendously wasteful.  You're
taking something that was mapped at colour c_src mapping it to a new
address src_kaddr, which is likely a different colour and necessitates
flushing the original c_src, then you copy it to dst_kaddr, which is
also likely a different colour from c_dst, so dst_kaddr has to be
flushed on kunmap and c_dst has to be invalidated on kmap.  What we
should have is an architectural primitive for doing this, something
like kmemcopy_arch(dst, src).  PIPT architectures can implement it as
the above (possibly losing kmap if they don't need it) but VIPT/VIVT
architectures can set up a correctly coloured mapping so they can
simply copy from c_src to c_dst without any need to flush and the data
arrives cache hot at c_dst.

James


___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH RFC PKS/PMEM 57/58] nvdimm/pmem: Stray access protection for pmem->virt_addr

2020-10-09 Thread John Hubbard

On 10/9/20 12:50 PM, ira.we...@intel.com wrote:

From: Ira Weiny 

The pmem driver uses a cached virtual address to access its memory
directly.  Because the nvdimm driver is well aware of the special
protections it has mapped memory with, we call dev_access_[en|dis]able()
around the direct pmem->virt_addr (pmem_addr) usage instead of the
unnecessary overhead of trying to get a page to kmap.

Signed-off-by: Ira Weiny 
---
  drivers/nvdimm/pmem.c | 4 
  1 file changed, 4 insertions(+)

diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index fab29b514372..e4dc1ae990fc 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -148,7 +148,9 @@ static blk_status_t pmem_do_read(struct pmem_device *pmem,
if (unlikely(is_bad_pmem(>bb, sector, len)))
return BLK_STS_IOERR;
  
+	dev_access_enable(false);

rc = read_pmem(page, page_off, pmem_addr, len);
+   dev_access_disable(false);


Hi Ira!

The APIs should be tweaked to use a symbol (GLOBAL, PER_THREAD), instead of
true/false. Try reading the above and you'll see that it sounds like it's
doing the opposite of what it is ("enable_this(false)" sounds like a clumsy
API design to *disable*, right?). And there is no hint about the scope.

And it *could* be so much more readable like this:

dev_access_enable(DEV_ACCESS_THIS_THREAD);



thanks,
--
John Hubbard
NVIDIA
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH RFC PKS/PMEM 22/58] fs/f2fs: Utilize new kmap_thread()

2020-10-09 Thread Eric Biggers
On Sat, Oct 10, 2020 at 01:39:54AM +0100, Matthew Wilcox wrote:
> On Fri, Oct 09, 2020 at 02:34:34PM -0700, Eric Biggers wrote:
> > On Fri, Oct 09, 2020 at 12:49:57PM -0700, ira.we...@intel.com wrote:
> > > The kmap() calls in this FS are localized to a single thread.  To avoid
> > > the over head of global PKRS updates use the new kmap_thread() call.
> > >
> > > @@ -2410,12 +2410,12 @@ static inline struct page 
> > > *f2fs_pagecache_get_page(
> > >  
> > >  static inline void f2fs_copy_page(struct page *src, struct page *dst)
> > >  {
> > > - char *src_kaddr = kmap(src);
> > > - char *dst_kaddr = kmap(dst);
> > > + char *src_kaddr = kmap_thread(src);
> > > + char *dst_kaddr = kmap_thread(dst);
> > >  
> > >   memcpy(dst_kaddr, src_kaddr, PAGE_SIZE);
> > > - kunmap(dst);
> > > - kunmap(src);
> > > + kunmap_thread(dst);
> > > + kunmap_thread(src);
> > >  }
> > 
> > Wouldn't it make more sense to switch cases like this to kmap_atomic()?
> > The pages are only mapped to do a memcpy(), then they're immediately 
> > unmapped.
> 
> Maybe you missed the earlier thread from Thomas trying to do something
> similar for rather different reasons ...
> 
> https://lore.kernel.org/lkml/20200919091751.06...@linutronix.de/

I did miss it.  I'm not subscribed to any of the mailing lists it was sent to.

Anyway, it shouldn't matter.  Patchsets should be standalone, and not require
reading random prior threads on linux-kernel to understand.

And I still don't really understand.  After this patchset, there is still code
nearly identical to the above (doing a temporary mapping just for a memcpy) that
would still be using kmap_atomic().  Is the idea that later, such code will be
converted to use kmap_thread() instead?  If not, why use one over the other?

- Eric
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [Nouveau] nouveau broken on Riva TNT2 in 5.9.0-rc8: GPU not supported on big-endian

2020-10-09 Thread Karol Herbst
On Sat, Oct 10, 2020 at 12:23 AM Ilia Mirkin  wrote:
>
> On Fri, Oct 9, 2020 at 5:54 PM Karol Herbst  wrote:
> >
> > On Fri, Oct 9, 2020 at 11:35 PM Ondrej Zary  wrote:
> > >
> > > Hello,
> > > I'm testing 5.9.0-rc8 and found that Riva TNT2 stopped working:
> > > [0.00] Linux version 5.9.0-rc8+ (zary@gsql) (gcc (Debian 8.3.0-6) 
> > > 8.3.0, GNU ld (GNU Binutils for Debian) 2.31.1) #326 SMP Fri Oct 9 
> > > 22:31:40 CEST 2020
> > > ...
> > > [   14.771464] nouveau :01:00.0: GPU not supported on big-endian
> > > [   14.771782] nouveau: probe of :01:00.0 failed with error -38
> > >
> > > big-endian? WTF? The machine is x86.
> > >
> >
> > mhh, we reworked the endianess checks a bit and apparently that broke
> > something... I will give it some thoughts, but could you be so kind
> > and create an mmiotrace under 5.9 with nouveau? You won't need to
> > start X or anything while doing it. Just enable the trace and modprobe
> > nouveau and collect the trace.
>
> Looks like nvkm_device_endianness unconditionally reads out 0x4. I
> don't think that reg is there pre-NV11. At least NV4, NV5, NV10 and
> maybe NV15 (which is logically pre-NV11) don't support big-endian
> mode. Not sure about NV1A, which was the IGP of the series and IIRC
> logically pre-NV11 as well (but clearly could only be used with x86
> chips, since it was part of the motherboard).
>
> Aha, it's documented in rnndb:
>
> https://github.com/envytools/envytools/blob/master/rnndb/bus/pmc.xml
> 
>

ohh, I should have checked there.. yeah, will write a fix for it then.
Before my patch we just always tried to switch it, but never threw an
error.

>   -ilia
>

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 8/7] dt-bindings: display: mxsfb: Add compatible for i.MX8MM

2020-10-09 Thread Laurent Pinchart
From: Marek Vasut 

NXP's i.MX8MM has an LCDIF as well.

Signed-off-by: Marek Vasut 
Reviewed-by: Laurent Pinchart 
Signed-off-by: Laurent Pinchart 
---
Changes since v1:

- Rebased on top of the YAML conversion
---
 Documentation/devicetree/bindings/display/fsl,lcdif.yaml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/display/fsl,lcdif.yaml 
b/Documentation/devicetree/bindings/display/fsl,lcdif.yaml
index 404bd516b7f5..c1690ae7 100644
--- a/Documentation/devicetree/bindings/display/fsl,lcdif.yaml
+++ b/Documentation/devicetree/bindings/display/fsl,lcdif.yaml
@@ -26,6 +26,7 @@ properties:
 - fsl,imx6sll-lcdif
 - fsl,imx6ul-lcdif
 - fsl,imx7d-lcdif
+- fsl,imx8mm-lcdif
 - fsl,imx8mq-lcdif
 - const: fsl,imx6sx-lcdif
 
-- 
Regards,

Laurent Pinchart

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 3/7] dt-bindings: display: mxsfb: Add a bus-width endpoint property

2020-10-09 Thread Laurent Pinchart
Hi Marek,

On Wed, Oct 07, 2020 at 10:40:26AM +0200, Marek Vasut wrote:
> On 10/7/20 3:24 AM, Laurent Pinchart wrote:
> 
> [...]
> 
> > +  bus-width:
> > +enum: [16, 18, 24]
> > +description: |
> > +  The output bus width. This value overrides the configuration
> > +  derived from the connected device (encoder or panel). It 
> > should
> > +  only be specified when PCB routing of the data signals 
> > require a
> > +  different bus width on the LCDIF and the connected device. 
> > For
> > +  instance, when a 18-bit RGB panel has its R[5:0], G[5:0] and
> > +  B[5:0] signals connected to LCD_DATA[7:2], LCD_DATA[15:10] 
> > and
> > +  LCD_DATA[23:18] instead of LCD_DATA[5:0], LCD_DATA[11:6] and
> > +  LCD_DATA[17:12], bus-width should be set to 24.
> 
> The iMX6 IPUv3 uses interface-pix-fmt which is a bit more flexible, but
> I'm not sure whether it's the right way to go about this, see:
> Documentation/devicetree/bindings/display/imx/fsl-imx-drm.txt

I think specifying the bus with is better. It's a standard property, but
more than that, a given bus width can carry different formats. For
instance, a 24-bus could carry RGB666 data (with dithering for the
LSBs).

-- 
Regards,

Laurent Pinchart
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 1/7] dt-bindings: display: mxsfb: Convert binding to YAML

2020-10-09 Thread Laurent Pinchart
Hi Rob,

On Wed, Oct 07, 2020 at 11:00:20AM -0500, Rob Herring wrote:
> On Wed, Oct 07, 2020 at 04:24:32AM +0300, Laurent Pinchart wrote:
> > Convert the mxsfb binding to YAML. The deprecated binding is dropped, as
> > neither the DT sources nor the driver support it anymore. The converted
> > binding is named fsl,lcdif.yaml to match the usual bindings naming
> > scheme.
> > 
> > The compatible strings are messy, and DT sources use different kinds of
> > combination of documented and undocumented values. Keep it simple for
> > now, and update the example to make it valid. Aligning the binding with
> > the existing DT sources will be performed separately.
> > 
> > Signed-off-by: Laurent Pinchart 
> > Reviewed-by: Sam Ravnborg 
> > --
> > Changes since v1:
> > 
> > - Drop unneeded quotes in string
> > - Replace minItems with maxItems in conditional check
> > - Add blank line before ...
> > - Squash the rename in this commit
> > ---
> >  .../bindings/display/fsl,lcdif.yaml   | 116 ++
> >  .../devicetree/bindings/display/mxsfb.txt |  87 -
> >  MAINTAINERS   |   2 +-
> >  3 files changed, 117 insertions(+), 88 deletions(-)
> >  create mode 100644 Documentation/devicetree/bindings/display/fsl,lcdif.yaml
> >  delete mode 100644 Documentation/devicetree/bindings/display/mxsfb.txt
> > 
> > diff --git a/Documentation/devicetree/bindings/display/fsl,lcdif.yaml 
> > b/Documentation/devicetree/bindings/display/fsl,lcdif.yaml
> > new file mode 100644
> > index ..063bb8c58114
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/display/fsl,lcdif.yaml
> > @@ -0,0 +1,116 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/display/fsl,lcdif.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Freescale/NXP i.MX LCD Interface (LCDIF)
> > +
> > +maintainers:
> > +  - Marek Vasut 
> > +  - Stefan Agner 
> > +
> > +description: |
> > +  (e)LCDIF display controller found in the Freescale/NXP i.MX SoCs.
> > +
> > +properties:
> > +  compatible:
> > +enum:
> > +  - fsl,imx23-lcdif
> > +  - fsl,imx28-lcdif
> > +  - fsl,imx6sx-lcdif
> > +  - fsl,imx8mq-lcdif
> > +
> > +  reg:
> > +maxItems: 1
> > +
> > +  clocks:
> > +items:
> > +  - description: Pixel clock
> > +  - description: Bus clock
> > +  - description: Display AXI clock
> > +minItems: 1
> > +
> > +  clock-names:
> > +items:
> > +  - const: pix
> > +  - const: axi
> > +  - const: disp_axi
> > +minItems: 1
> > +
> > +  interrupts:
> > +maxItems: 1
> > +
> > +  port:
> > +description: The LCDIF output port
> > +type: object
> > +
> > +properties:
> > +  endpoint:
> 
> What happened on the graph binding schema work?

Still on my todo list, I hope to switch back to that task in the not too
distant future.

> I started a meta-schema for it BTW.

Nice :-) Is it available in a public tree ?

> You can drop all the endpoint parts. With that,
> 
> Reviewed-by: Rob Herring 
> 
> > +type: object
> > +
> > +properties:
> > +  remote-endpoint:
> > +$ref: /schemas/types.yaml#/definitions/phandle
> > +
> > +required:
> > +  - remote-endpoint
> > +
> > +additionalProperties: false
> > +
> > +additionalProperties: false
> > +
> > +required:
> > +  - compatible
> > +  - reg
> > +  - clocks
> > +  - interrupts
> > +  - port
> > +
> > +additionalProperties: false
> > +
> > +allOf:
> > +  - if:
> > +  properties:
> > +compatible:
> > +  contains:
> > +const: fsl,imx6sx-lcdif
> > +then:
> > +  properties:
> > +clocks:
> > +  minItems: 2
> > +  maxItems: 3
> > +clock-names:
> > +  minItems: 2
> > +  maxItems: 3
> > +  required:
> > +- clock-names
> > +else:
> > +  properties:
> > +clocks:
> > +  maxItems: 1
> > +clock-names:
> > +  maxItems: 1
> > +
> > +examples:
> > +  - |
> > +#include 
> > +#include 
> > +
> > +display-controller@222 {
> > +compatible = "fsl,imx6sx-lcdif";
> > +reg = <0x0222 0x4000>;
> > +interrupts = ;
> > +clocks = < IMX6SX_CLK_LCDIF1_PIX>,
> > + < IMX6SX_CLK_LCDIF_APB>,
> > + < IMX6SX_CLK_DISPLAY_AXI>;
> > +clock-names = "pix", "axi", "disp_axi";
> > +
> > +port {
> > +endpoint {
> > +remote-endpoint = <_in>;
> > +};
> > +};
> > +};
> > +
> > +...
> > diff --git a/Documentation/devicetree/bindings/display/mxsfb.txt 
> > b/Documentation/devicetree/bindings/display/mxsfb.txt
> > deleted file mode 100644
> > index c985871c46b3..
> > --- a/Documentation/devicetree/bindings/display/mxsfb.txt
> > +++ /dev/null
> > @@ -1,87 +0,0 @@
> > -* 

[PATCH 3/3] drm/vkms: fbdev emulation support

2020-10-09 Thread Daniel Vetter
Hooray for generic fbdev support, making this a oneliner. We just
needed to fix preferred_depth fixed and the vmap support added first.

Signed-off-by: Daniel Vetter 
Cc: Rodrigo Siqueira 
Cc: Melissa Wen 
Cc: Haneen Mohammed 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/vkms/vkms_drv.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index 6221e5040264..cc09e2df5cb1 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -169,6 +169,8 @@ static int __init vkms_init(void)
if (ret)
goto out_devres;
 
+   drm_fbdev_generic_setup(_device->drm, 0);
+
return 0;
 
 out_devres:
-- 
2.28.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 1/3] drm/vkms: Set preferred depth correctly

2020-10-09 Thread Daniel Vetter
The only thing we support is xrgb.

Signed-off-by: Daniel Vetter 
Cc: Rodrigo Siqueira 
Cc: Melissa Wen 
Cc: Haneen Mohammed 
Cc: Daniel Vetter 
---
 drivers/gpu/drm/vkms/vkms_drv.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index 726801ab44d4..eb4007443706 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -124,7 +124,7 @@ static int vkms_modeset_init(struct vkms_device *vkmsdev)
dev->mode_config.max_height = YRES_MAX;
dev->mode_config.cursor_width = 512;
dev->mode_config.cursor_height = 512;
-   dev->mode_config.preferred_depth = 24;
+   dev->mode_config.preferred_depth = 32;
dev->mode_config.helper_private = _mode_config_helpers;
 
return vkms_output_init(vkmsdev, 0);
-- 
2.28.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 2/3] drm/vkms: Switch to shmem helpers

2020-10-09 Thread Daniel Vetter
Inspired by a patch by Chris Wilson for vgem. Plus this gives us vmap
at the gem bo level, which we need for generic fbdev emulation.

Luckily shmem also tracks ->vaddr, so we just need to adjust the code
all over a bit to make this fit.

Also wire up handle_to_fd, dunno why that was missing.

Signed-off-by: Daniel Vetter 
Cc: Chris Wilson 
Cc: Maarten Lankhorst 
Cc: Maxime Ripard 
Cc: Thomas Zimmermann 
Cc: David Airlie 
Cc: Daniel Vetter 
Cc: Rodrigo Siqueira 
Cc: Melissa Wen 
Cc: Haneen Mohammed 
---
 drivers/gpu/drm/Kconfig   |   1 +
 drivers/gpu/drm/vkms/Makefile |   1 -
 drivers/gpu/drm/vkms/vkms_composer.c  |  17 +-
 drivers/gpu/drm/vkms/vkms_drv.c   |  19 +-
 drivers/gpu/drm/vkms/vkms_drv.h   |  26 ---
 drivers/gpu/drm/vkms/vkms_gem.c   | 261 --
 drivers/gpu/drm/vkms/vkms_plane.c |  13 +-
 drivers/gpu/drm/vkms/vkms_writeback.c |  17 +-
 8 files changed, 32 insertions(+), 323 deletions(-)
 delete mode 100644 drivers/gpu/drm/vkms/vkms_gem.c

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 9efb82caaa87..b796c118fc3b 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -287,6 +287,7 @@ config DRM_VKMS
tristate "Virtual KMS (EXPERIMENTAL)"
depends on DRM
select DRM_KMS_HELPER
+   select DRM_GEM_SHMEM_HELPER
select CRC32
default n
help
diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
index 333d3cead0e3..72f779cbfedd 100644
--- a/drivers/gpu/drm/vkms/Makefile
+++ b/drivers/gpu/drm/vkms/Makefile
@@ -4,7 +4,6 @@ vkms-y := \
vkms_plane.o \
vkms_output.o \
vkms_crtc.o \
-   vkms_gem.o \
vkms_composer.o \
vkms_writeback.o
 
diff --git a/drivers/gpu/drm/vkms/vkms_composer.c 
b/drivers/gpu/drm/vkms/vkms_composer.c
index 33c031f27c2c..66c6842d70db 100644
--- a/drivers/gpu/drm/vkms/vkms_composer.c
+++ b/drivers/gpu/drm/vkms/vkms_composer.c
@@ -5,6 +5,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include "vkms_drv.h"
@@ -129,15 +130,15 @@ static void compose_cursor(struct vkms_composer 
*cursor_composer,
   void *vaddr_out)
 {
struct drm_gem_object *cursor_obj;
-   struct vkms_gem_object *cursor_vkms_obj;
+   struct drm_gem_shmem_object *cursor_shmem_obj;
 
cursor_obj = drm_gem_fb_get_obj(_composer->fb, 0);
-   cursor_vkms_obj = drm_gem_to_vkms_gem(cursor_obj);
+   cursor_shmem_obj = to_drm_gem_shmem_obj(cursor_obj);
 
-   if (WARN_ON(!cursor_vkms_obj->vaddr))
+   if (WARN_ON(!cursor_shmem_obj->vaddr))
return;
 
-   blend(vaddr_out, cursor_vkms_obj->vaddr,
+   blend(vaddr_out, cursor_shmem_obj->vaddr,
  primary_composer, cursor_composer);
 }
 
@@ -147,20 +148,20 @@ static int compose_planes(void **vaddr_out,
 {
struct drm_framebuffer *fb = _composer->fb;
struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
-   struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(gem_obj);
+   struct drm_gem_shmem_object *shmem_obj = to_drm_gem_shmem_obj(gem_obj);
 
if (!*vaddr_out) {
-   *vaddr_out = kzalloc(vkms_obj->gem.size, GFP_KERNEL);
+   *vaddr_out = kzalloc(shmem_obj->base.size, GFP_KERNEL);
if (!*vaddr_out) {
DRM_ERROR("Cannot allocate memory for output frame.");
return -ENOMEM;
}
}
 
-   if (WARN_ON(!vkms_obj->vaddr))
+   if (WARN_ON(!shmem_obj->vaddr))
return -EINVAL;
 
-   memcpy(*vaddr_out, vkms_obj->vaddr, vkms_obj->gem.size);
+   memcpy(*vaddr_out, shmem_obj->vaddr, shmem_obj->base.size);
 
if (cursor_composer)
compose_cursor(cursor_composer, primary_composer, *vaddr_out);
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index eb4007443706..6221e5040264 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -23,6 +23,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include "vkms_drv.h"
@@ -39,17 +40,7 @@ bool enable_cursor = true;
 module_param_named(enable_cursor, enable_cursor, bool, 0444);
 MODULE_PARM_DESC(enable_cursor, "Enable/Disable cursor support");
 
-static const struct file_operations vkms_driver_fops = {
-   .owner  = THIS_MODULE,
-   .open   = drm_open,
-   .mmap   = drm_gem_mmap,
-   .unlocked_ioctl = drm_ioctl,
-   .compat_ioctl   = drm_compat_ioctl,
-   .poll   = drm_poll,
-   .read   = drm_read,
-   .llseek = no_llseek,
-   .release= drm_release,
-};
+DEFINE_DRM_GEM_FOPS(vkms_driver_fops);
 
 static void vkms_release(struct drm_device *dev)
 {
@@ -91,9 +82,11 @@ static struct drm_driver vkms_driver = {
.driver_features= DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_GEM,
.release  

Re: [Intel-gfx] [PATCH] drm/vgem: Replace vgem_object_funcs with the common drm shmem helper

2020-10-09 Thread Daniel Vetter
On Fri, Oct 09, 2020 at 06:16:06PM +0200, Daniel Vetter wrote:
> On Fri, Oct 9, 2020 at 12:21 PM Chris Wilson  wrote:
> >
> > vgem is a minimalistic driver that provides shmemfs objects to
> > userspace that may then be used as an in-memory surface and transported
> > across dma-buf to other drivers. Since it's introduction,
> > drm_gem_shmem_helper now provides the same shmemfs facilities and so we
> > can trim vgem to wrap the helper.
> >
> > Signed-off-by: Chris Wilson 
> > ---
> >  drivers/gpu/drm/Kconfig |   1 +
> >  drivers/gpu/drm/vgem/vgem_drv.c | 281 ++--
> >  drivers/gpu/drm/vgem/vgem_drv.h |  11 --
> >  3 files changed, 13 insertions(+), 280 deletions(-)
> 
> Nice diffstat :-)
> 
> Reviewed-by: Daniel Vetter 

Just noticed, but I think with

.dumb_create= drm_gem_shmem_dumb_create,

you can delete a bunhc more :-)
-Daniel

> 
> >
> > diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
> > index 147d61b9674e..db2ff76638cd 100644
> > --- a/drivers/gpu/drm/Kconfig
> > +++ b/drivers/gpu/drm/Kconfig
> > @@ -278,6 +278,7 @@ source "drivers/gpu/drm/i915/Kconfig"
> >  config DRM_VGEM
> > tristate "Virtual GEM provider"
> > depends on DRM
> > +   select DRM_GEM_SHMEM_HELPER
> > help
> >   Choose this option to get a virtual graphics memory manager,
> >   as used by Mesa's software renderer for enhanced performance.
> > diff --git a/drivers/gpu/drm/vgem/vgem_drv.c 
> > b/drivers/gpu/drm/vgem/vgem_drv.c
> > index fa54a6d1403d..73cb17c4f7a8 100644
> > --- a/drivers/gpu/drm/vgem/vgem_drv.c
> > +++ b/drivers/gpu/drm/vgem/vgem_drv.c
> > @@ -38,6 +38,7 @@
> >
> >  #include 
> >  #include 
> > +#include 
> >  #include 
> >  #include 
> >  #include 
> > @@ -50,87 +51,11 @@
> >  #define DRIVER_MAJOR   1
> >  #define DRIVER_MINOR   0
> >
> > -static const struct drm_gem_object_funcs vgem_gem_object_funcs;
> > -
> >  static struct vgem_device {
> > struct drm_device drm;
> > struct platform_device *platform;
> >  } *vgem_device;
> >
> > -static void vgem_gem_free_object(struct drm_gem_object *obj)
> > -{
> > -   struct drm_vgem_gem_object *vgem_obj = to_vgem_bo(obj);
> > -
> > -   kvfree(vgem_obj->pages);
> > -   mutex_destroy(_obj->pages_lock);
> > -
> > -   if (obj->import_attach)
> > -   drm_prime_gem_destroy(obj, vgem_obj->table);
> > -
> > -   drm_gem_object_release(obj);
> > -   kfree(vgem_obj);
> > -}
> > -
> > -static vm_fault_t vgem_gem_fault(struct vm_fault *vmf)
> > -{
> > -   struct vm_area_struct *vma = vmf->vma;
> > -   struct drm_vgem_gem_object *obj = vma->vm_private_data;
> > -   /* We don't use vmf->pgoff since that has the fake offset */
> > -   unsigned long vaddr = vmf->address;
> > -   vm_fault_t ret = VM_FAULT_SIGBUS;
> > -   loff_t num_pages;
> > -   pgoff_t page_offset;
> > -   page_offset = (vaddr - vma->vm_start) >> PAGE_SHIFT;
> > -
> > -   num_pages = DIV_ROUND_UP(obj->base.size, PAGE_SIZE);
> > -
> > -   if (page_offset >= num_pages)
> > -   return VM_FAULT_SIGBUS;
> > -
> > -   mutex_lock(>pages_lock);
> > -   if (obj->pages) {
> > -   get_page(obj->pages[page_offset]);
> > -   vmf->page = obj->pages[page_offset];
> > -   ret = 0;
> > -   }
> > -   mutex_unlock(>pages_lock);
> > -   if (ret) {
> > -   struct page *page;
> > -
> > -   page = shmem_read_mapping_page(
> > -   
> > file_inode(obj->base.filp)->i_mapping,
> > -   page_offset);
> > -   if (!IS_ERR(page)) {
> > -   vmf->page = page;
> > -   ret = 0;
> > -   } else switch (PTR_ERR(page)) {
> > -   case -ENOSPC:
> > -   case -ENOMEM:
> > -   ret = VM_FAULT_OOM;
> > -   break;
> > -   case -EBUSY:
> > -   ret = VM_FAULT_RETRY;
> > -   break;
> > -   case -EFAULT:
> > -   case -EINVAL:
> > -   ret = VM_FAULT_SIGBUS;
> > -   break;
> > -   default:
> > -   WARN_ON(PTR_ERR(page));
> > -   ret = VM_FAULT_SIGBUS;
> > -   break;
> > -   }
> > -
> > -   }
> > -   return ret;
> > -}
> > -
> > -static const struct vm_operations_struct vgem_gem_vm_ops = {
> > -   .fault = vgem_gem_fault,
> > -   .open = drm_gem_vm_open,
> > -   .close = drm_gem_vm_close,
> > -};
> > -
> >  static int vgem_open(struct drm_device *dev, struct drm_file *file)
> >  {
> > struct vgem_file *vfile;
> > @@ -159,41 +84,25 @@ static void 

[pull] amdgpu drm-fixes-5.10

2020-10-09 Thread Alex Deucher
Hi Dave, Daniel,

Fixes for 5.10.

The following changes since commit f2fa07b39fafb2a5f49c71a504862c5efa57d03e:

  drm/amd/amdkfd: Surface files in Sysfs to allow users to get number of 
compute units that are in use. (2020-09-30 15:26:27 -0400)

are available in the Git repository at:

  git://people.freedesktop.org/~agd5f/linux tags/amd-drm-fixes-5.10-2020-10-09

for you to fetch changes up to 9c27bc97aff8bbe62b5b29ebf528291dd85d9c86:

  drm/amdgpu: Fix invalid number of character '{' in amdgpu_acpi_init 
(2020-10-09 15:16:10 -0400)


amd-drm-fixes-5.10-2020-10-09:

amdgpu:
- Clean up indirect register access
- Navy Flounder fixes
- SMU11 AC/DC interrupt fixes
- GPUVM alignment fix
- Display fixes
- Misc other fixes


Alex Deucher (4):
  drm/amdgpu/swsmu: add interrupt work function
  drm/amdgpu/swsmu: add interrupt work handler for smu11 parts
  drm/amdgpu/swsmu: fix ARC build errors
  drm/amdgpu: prevent spurious warning

Alex Sierra (1):
  drm/amdgpu: align frag_end to covered address space

Alvin Lee (1):
  drm/amd/display: Don't allow pstate if no support in blank

Chris Park (1):
  drm/amd/display: Change to correct unit on audio rate

Dirk Gouders (1):
  drm/amdgpu: fix NULL pointer dereference for Renoir

Dmytro Laktyushkin (1):
  drm/amd/display: Fix OPTC_DATA_FORMAT programming

Emily.Deng (1):
  drm/amdgpu: Remove warning for virtual_display

Evan Quan (1):
  drm/amd/pm: setup APU dpm clock table in SMU HW initialization

Fangzhi Zuo (1):
  drm/amd/display: HDMI remote sink need mode validation for Linux

Hawking Zhang (4):
  drm/amdgpu: add helper function for indirect reg access (v3)
  drm/amdgpu: switch to indirect reg access helper
  drm/amdgpu: support indirect access reg outside of mmio bar (v2)
  drm/amdgpu: enable GDDR6 save-restore support for navy_flounder

Rodrigo Siqueira (1):
  drm/amd/display: Avoid set zero in the requested clk

Ye Bin (1):
  drm/amdgpu: Fix invalid number of character '{' in amdgpu_acpi_init

kernel test robot (1):
  drm/amdgpu: kfd_initialized can be static

 drivers/gpu/drm/amd/amdgpu/amdgpu.h|  36 +++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c   |   2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c |   2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c|   2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 228 +++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h  |   4 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c |   2 +
 drivers/gpu/drm/amd/amdgpu/dce_virtual.c   |   4 +-
 drivers/gpu/drm/amd/amdgpu/nv.c|  51 +
 drivers/gpu/drm/amd/amdgpu/soc15.c |  61 ++
 .../amd/display/dc/clk_mgr/dce112/dce112_clk_mgr.c |   3 +-
 drivers/gpu/drm/amd/display/dc/core/dc_link.c  |   2 +-
 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c  |  11 +
 drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c  |   8 -
 .../gpu/drm/amd/display/dc/dcn20/dcn20_resource.c  |   5 +-
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c  |   8 -
 .../amd/display/dc/dml/dcn30/display_mode_vba_30.c |   2 +-
 drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h|   2 +
 drivers/gpu/drm/amd/pm/inc/smu_v11_0.h |   2 +
 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c  |  37 +++-
 drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c  |   1 +
 drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c|  15 +-
 .../drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c|  15 +-
 drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c |  10 +-
 25 files changed, 308 insertions(+), 206 deletions(-)
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [Nouveau] nouveau broken on Riva TNT2 in 5.9.0-rc8: GPU not supported on big-endian

2020-10-09 Thread Ilia Mirkin
On Fri, Oct 9, 2020 at 5:54 PM Karol Herbst  wrote:
>
> On Fri, Oct 9, 2020 at 11:35 PM Ondrej Zary  wrote:
> >
> > Hello,
> > I'm testing 5.9.0-rc8 and found that Riva TNT2 stopped working:
> > [0.00] Linux version 5.9.0-rc8+ (zary@gsql) (gcc (Debian 8.3.0-6) 
> > 8.3.0, GNU ld (GNU Binutils for Debian) 2.31.1) #326 SMP Fri Oct 9 22:31:40 
> > CEST 2020
> > ...
> > [   14.771464] nouveau :01:00.0: GPU not supported on big-endian
> > [   14.771782] nouveau: probe of :01:00.0 failed with error -38
> >
> > big-endian? WTF? The machine is x86.
> >
>
> mhh, we reworked the endianess checks a bit and apparently that broke
> something... I will give it some thoughts, but could you be so kind
> and create an mmiotrace under 5.9 with nouveau? You won't need to
> start X or anything while doing it. Just enable the trace and modprobe
> nouveau and collect the trace.

Looks like nvkm_device_endianness unconditionally reads out 0x4. I
don't think that reg is there pre-NV11. At least NV4, NV5, NV10 and
maybe NV15 (which is logically pre-NV11) don't support big-endian
mode. Not sure about NV1A, which was the IGP of the series and IIRC
logically pre-NV11 as well (but clearly could only be used with x86
chips, since it was part of the motherboard).

Aha, it's documented in rnndb:

https://github.com/envytools/envytools/blob/master/rnndb/bus/pmc.xml


  -ilia
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v1 1/4] drm: Add Keem Bay VPU codec DRM

2020-10-09 Thread Daniel Vetter
On Fri, Oct 09, 2020 at 07:57:52PM +0800, kuhanh.murugasen.krish...@intel.com 
wrote:
> From: "Murugasen Krishnan, Kuhanh" 
> 
> This is a new DRM media codec driver for Intel's Keem Bay SOC which
> integrates the Verisilicon's Hantro Video Processor Unit (VPU) IP.
> The SoC couples an ARM Cortex A53 CPU with an Intel Movidius VPU.
> 
> Hantro VPU IP is a series of video decoder and encoder semiconductor IP cores,
> which can be flexibly configured for video surveillance, multimedia consumer
> products, Internet of Things, cloud service products, data centers, aerial
> photography and recorders, thereby providing video transcoding and 
> multi-channel
> HD video encoding and decoding.
> 
> Hantro VPU IP consists of Hantro VC8000D for decoder and Hantro VC8000E for 
> encoder.
> 
> Signed-off-by: Murugasen Krishnan, Kuhanh 
> 
> Acked-by: Mark, Gross 

So there's this intel-internal pre-approval review process thing going on,
and apparently it's utterly useless.

This driver here happily copypastes like half of drm. This is not how
upstream developement is done.

The other issue, and that's the same as with the other kmb drm driver:
Doesn't start out with dt changes and schema, in the same patch series as
the driver itself. In the case of kmb display driver this means it's at
v9, and only now did we discover that the architecture is (maybe, verdict
by dt/armsoc people is still pending) is all wrong.

And finally you might have picked the wrong subsystem, proposing the first
media codec for drm is certainly bold, but not entirely out of line.

I'm not sure what the goal here is, but you might want to send a mail to
my intel address first before we proceed here.
-Daniel

> ---
>  drivers/gpu/drm/hantro/hantro_drm.c   | 1673 
> +
>  drivers/gpu/drm/hantro/hantro_drm.h   |  208 
>  drivers/gpu/drm/hantro/hantro_fence.c |  284 ++
>  drivers/gpu/drm/hantro/hantro_priv.h  |  106 +++
>  4 files changed, 2271 insertions(+)
>  create mode 100644 drivers/gpu/drm/hantro/hantro_drm.c
>  create mode 100644 drivers/gpu/drm/hantro/hantro_drm.h
>  create mode 100644 drivers/gpu/drm/hantro/hantro_fence.c
>  create mode 100644 drivers/gpu/drm/hantro/hantro_priv.h
> 
> diff --git a/drivers/gpu/drm/hantro/hantro_drm.c 
> b/drivers/gpu/drm/hantro/hantro_drm.c
> new file mode 100644
> index 000..50ccddf
> --- /dev/null
> +++ b/drivers/gpu/drm/hantro/hantro_drm.c
> @@ -0,0 +1,1673 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + *Hantro driver main DRM file
> + *
> + *Copyright (c) 2017 - 2020, VeriSilicon Inc.
> + *Copyright (c) 2020 Intel Corporation
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +/* hantro header */
> +#include "hantro_priv.h"
> +#include "hantro_enc.h"
> +#include "hantro_dec.h"
> +/* for dynamic ddr */
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +struct hantro_device_handle hantro_dev;
> +
> +/* struct used for dynamic ddr allocations */
> +struct hantro_mem ddr1;
> +struct device *ddr_dev;
> +
> +static u32 hantro_vblank_no_hw_counter(struct drm_device *dev,
> +unsigned int pipe)
> +{
> + return 0;
> +}
> +
> +static int hantro_recordmem(struct drm_file *priv, void *obj, int size)
> +{
> + int ret;
> + struct idr *list = (struct idr *)priv->driver_priv;
> +
> + ret = idr_alloc(list, obj, 1, 0, GFP_KERNEL);
> +
> + return (ret > 0 ? 0 : -ENOMEM);
> +}
> +
> +static void hantro_unrecordmem(struct drm_file *priv, void *obj)
> +{
> + int id;
> + struct idr *list = (struct idr *)priv->driver_priv;
> + void *gemobj;
> +
> + idr_for_each_entry(list, gemobj, id) {
> + if (gemobj == obj) {
> + idr_remove(list, id);
> + break;
> + }
> + }
> +}
> +
> +static void hantro_drm_fb_destroy(struct drm_framebuffer *fb)
> +{
> + struct hantro_drm_fb *vsi_fb = (struct hantro_drm_fb *)fb;
> + int i;
> +
> + for (i = 0; i < 4; i++)
> + hantro_unref_drmobj(vsi_fb->obj[i]);
> +
> + drm_framebuffer_cleanup(fb);
> + kfree(vsi_fb);
> +}
> +
> +static int hantro_drm_fb_create_handle(struct drm_framebuffer *fb,
> +struct drm_file *file_priv,
> +unsigned int *handle)
> +{
> + struct hantro_drm_fb *vsi_fb = (struct hantro_drm_fb *)fb;
> +
> + return drm_gem_handle_create(file_priv, vsi_fb->obj[0], handle);
> +}
> +
> +static int hantro_drm_fb_dirty(struct drm_framebuffer *fb,
> +struct drm_file *file, unsigned int flags,
> +unsigned int color, struct drm_clip_rect *clips,
> +unsigned int num_clips)
> +{
> + return 0;
> +}
> 

Re: [PATCH RFC PKS/PMEM 09/58] drivers/gpu: Utilize new kmap_thread()

2020-10-09 Thread Daniel Vetter
On Fri, Oct 09, 2020 at 12:49:44PM -0700, ira.we...@intel.com wrote:
> From: Ira Weiny 
> 
> These kmap() calls in the gpu stack are localized to a single thread.
> To avoid the over head of global PKRS updates use the new kmap_thread()
> call.
> 
> Cc: David Airlie 
> Cc: Daniel Vetter 
> Cc: Patrik Jakobsson 
> Signed-off-by: Ira Weiny 

I'm guessing the entire pile goes in through some other tree. If so:

Acked-by: Daniel Vetter 

If you want this to land through maintainer trees, then we need a
per-driver split (since aside from amdgpu and radeon they're all different
subtrees).

btw the two kmap calls in drm you highlight in the cover letter should
also be convertible to kmap_thread. We only hold vmalloc mappings for a
longer time (or it'd be quite a driver bug). So if you want maybe throw
those two as two additional patches on top, and we can do some careful
review & testing for them.
-Daniel

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c  | 12 ++--
>  drivers/gpu/drm/gma500/gma_display.c |  4 ++--
>  drivers/gpu/drm/gma500/mmu.c | 10 +-
>  drivers/gpu/drm/i915/gem/i915_gem_shmem.c|  4 ++--
>  .../gpu/drm/i915/gem/selftests/i915_gem_context.c|  4 ++--
>  drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c   |  8 
>  drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c |  4 ++--
>  drivers/gpu/drm/i915/gt/intel_gtt.c  |  4 ++--
>  drivers/gpu/drm/i915/gt/shmem_utils.c|  4 ++--
>  drivers/gpu/drm/i915/i915_gem.c  |  8 
>  drivers/gpu/drm/i915/i915_gpu_error.c|  4 ++--
>  drivers/gpu/drm/i915/selftests/i915_perf.c   |  4 ++--
>  drivers/gpu/drm/radeon/radeon_ttm.c  |  4 ++--
>  13 files changed, 37 insertions(+), 37 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 978bae731398..bd564bccb7a3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -2437,11 +2437,11 @@ static ssize_t amdgpu_ttm_gtt_read(struct file *f, 
> char __user *buf,
>  
>   page = adev->gart.pages[p];
>   if (page) {
> - ptr = kmap(page);
> + ptr = kmap_thread(page);
>   ptr += off;
>  
>   r = copy_to_user(buf, ptr, cur_size);
> - kunmap(adev->gart.pages[p]);
> + kunmap_thread(adev->gart.pages[p]);
>   } else
>   r = clear_user(buf, cur_size);
>  
> @@ -2507,9 +2507,9 @@ static ssize_t amdgpu_iomem_read(struct file *f, char 
> __user *buf,
>   if (p->mapping != adev->mman.bdev.dev_mapping)
>   return -EPERM;
>  
> - ptr = kmap(p);
> + ptr = kmap_thread(p);
>   r = copy_to_user(buf, ptr + off, bytes);
> - kunmap(p);
> + kunmap_thread(p);
>   if (r)
>   return -EFAULT;
>  
> @@ -2558,9 +2558,9 @@ static ssize_t amdgpu_iomem_write(struct file *f, const 
> char __user *buf,
>   if (p->mapping != adev->mman.bdev.dev_mapping)
>   return -EPERM;
>  
> - ptr = kmap(p);
> + ptr = kmap_thread(p);
>   r = copy_from_user(ptr + off, buf, bytes);
> - kunmap(p);
> + kunmap_thread(p);
>   if (r)
>   return -EFAULT;
>  
> diff --git a/drivers/gpu/drm/gma500/gma_display.c 
> b/drivers/gpu/drm/gma500/gma_display.c
> index 3df6d6e850f5..35f4e55c941f 100644
> --- a/drivers/gpu/drm/gma500/gma_display.c
> +++ b/drivers/gpu/drm/gma500/gma_display.c
> @@ -400,9 +400,9 @@ int gma_crtc_cursor_set(struct drm_crtc *crtc,
>   /* Copy the cursor to cursor mem */
>   tmp_dst = dev_priv->vram_addr + cursor_gt->offset;
>   for (i = 0; i < cursor_pages; i++) {
> - tmp_src = kmap(gt->pages[i]);
> + tmp_src = kmap_thread(gt->pages[i]);
>   memcpy(tmp_dst, tmp_src, PAGE_SIZE);
> - kunmap(gt->pages[i]);
> + kunmap_thread(gt->pages[i]);
>   tmp_dst += PAGE_SIZE;
>   }
>  
> diff --git a/drivers/gpu/drm/gma500/mmu.c b/drivers/gpu/drm/gma500/mmu.c
> index 505044c9a673..fba7a3a461fd 100644
> --- a/drivers/gpu/drm/gma500/mmu.c
> +++ b/drivers/gpu/drm/gma500/mmu.c
> @@ -192,20 +192,20 @@ struct psb_mmu_pd *psb_mmu_alloc_pd(struct 
> psb_mmu_driver *driver,
>   pd->invalid_pte = 0;
>   }
>  
> - v = kmap(pd->dummy_pt);
> + v = kmap_thread(pd->dummy_pt);
>   for (i = 0; i < (PAGE_SIZE / sizeof(uint32_t)); ++i)
>   v[i] = pd->invalid_pte;
>  
> - kunmap(pd->dummy_pt);
> + kunmap_thread(pd->dummy_pt);
>  
> - v = kmap(pd->p);
> +

Re: [PATCH 1/6] mm: mmap: fix fput in error path

2020-10-09 Thread Andrew Morton
On Fri,  9 Oct 2020 17:03:37 +0200 "Christian König" 
 wrote:

> Patch "495c10cc1c0c CHROMIUM: dma-buf: restore args..."
> adds a workaround for a bug in mmap_region.
> 
> As the comment states ->mmap() callback can change
> vma->vm_file and so we might call fput() on the wrong file.
> 
> Revert the workaround and proper fix this in mmap_region.
> 

Doesn't this patch series address the same thing as
https://lkml.kernel.org/r/20200916090733.31427-1-linmia...@huawei.com?

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [Nouveau] nouveau broken on Riva TNT2 in 5.9.0-rc8: GPU not supported on big-endian

2020-10-09 Thread Karol Herbst
On Fri, Oct 9, 2020 at 11:35 PM Ondrej Zary  wrote:
>
> Hello,
> I'm testing 5.9.0-rc8 and found that Riva TNT2 stopped working:
> [0.00] Linux version 5.9.0-rc8+ (zary@gsql) (gcc (Debian 8.3.0-6) 
> 8.3.0, GNU ld (GNU Binutils for Debian) 2.31.1) #326 SMP Fri Oct 9 22:31:40 
> CEST 2020
> ...
> [   14.771464] nouveau :01:00.0: GPU not supported on big-endian
> [   14.771782] nouveau: probe of :01:00.0 failed with error -38
>
> big-endian? WTF? The machine is x86.
>

mhh, we reworked the endianess checks a bit and apparently that broke
something... I will give it some thoughts, but could you be so kind
and create an mmiotrace under 5.9 with nouveau? You won't need to
start X or anything while doing it. Just enable the trace and modprobe
nouveau and collect the trace.

> It works fine with Debian 5.7 kernel (5.7.10-1~bpo10+1):
> [0.00] Linux version 5.7.0-0.bpo.2-686 
> (debian-ker...@lists.debian.org) (gcc version 8.3.0 (Debian 8.3.0-6), GNU ld 
> (GNU Binutils for Debian) 2.31.1) #1 SMP Debian 5.7.10-1~bpo10+1 (2020-07-30)
> ...
> [   23.266196] nouveau :01:00.0: NVIDIA NV05 (20154000)
> [   23.288582] nouveau :01:00.0: bios: version 02.05.20.02.00
> [   23.288869] nouveau :01:00.0: bios: DCB table not found
> [   23.289595] nouveau :01:00.0: bios: DCB table not found
> [   23.289956] nouveau :01:00.0: bios: DCB table not found
> [   23.290015] nouveau :01:00.0: bios: DCB table not found
> [   23.290215] agpgart-intel :00:00.0: AGP 3.0 bridge
> [   23.290287] agpgart-intel :00:00.0: bridge is in legacy mode, falling 
> back to 2.x
> [   23.290351] agpgart-intel :00:00.0: putting AGP V2 device into 4x mode
> [   23.290430] nouveau :01:00.0: putting AGP V2 device into 4x mode
> [   23.290565] agpgart-intel :00:00.0: AGP 3.0 bridge
> [   23.290627] agpgart-intel :00:00.0: bridge is in legacy mode, falling 
> back to 2.x
> [   23.290690] agpgart-intel :00:00.0: putting AGP V2 device into 4x mode
> [   23.290768] nouveau :01:00.0: putting AGP V2 device into 4x mode
> [   23.290830] nouveau :01:00.0: tmr: unknown input clock freq
> [   23.293026] nouveau :01:00.0: fb: 32 MiB SDRAM
> [   23.301269] [TTM] Zone  kernel: Available graphics memory: 382728 KiB
> [   23.301327] [TTM] Initializing pool allocator
> [   23.301414] nouveau :01:00.0: DRM: VRAM: 31 MiB
> [   23.301465] nouveau :01:00.0: DRM: GART: 128 MiB
> [   23.301518] nouveau :01:00.0: DRM: BMP version 5.6
> [   23.301570] nouveau :01:00.0: DRM: No DCB data found in VBIOS
> [   23.303594] nouveau :01:00.0: DRM: MM: using M2MF for buffer copies
> [   23.303719] nouveau :01:00.0: bios: DCB table not found
> [   23.304904] nouveau :01:00.0: DRM: Saving VGA fonts
> [   23.349089] nouveau :01:00.0: DRM: No DCB data found in VBIOS
> [   23.349681] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
> [   23.383066] nouveau :01:00.0: DRM: allocated 1280x1024 fb: 0x4000, bo 
> b10d2f17
> [   23.413903] fbcon: nouveaudrmfb (fb0) is primary device
> [   23.569851] Console: switching to colour frame buffer device 160x64
> [   23.571050] nouveau :01:00.0: fb0: nouveaudrmfb frame buffer device
>
>
> --
> Ondrej Zary
> ___
> Nouveau mailing list
> nouv...@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/nouveau
>

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH RFC PKS/PMEM 22/58] fs/f2fs: Utilize new kmap_thread()

2020-10-09 Thread Eric Biggers
On Fri, Oct 09, 2020 at 12:49:57PM -0700, ira.we...@intel.com wrote:
> From: Ira Weiny 
> 
> The kmap() calls in this FS are localized to a single thread.  To avoid
> the over head of global PKRS updates use the new kmap_thread() call.
> 
> Cc: Jaegeuk Kim 
> Cc: Chao Yu 
> Signed-off-by: Ira Weiny 
> ---
>  fs/f2fs/f2fs.h | 8 
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index d9e52a7f3702..ff72a45a577e 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -2410,12 +2410,12 @@ static inline struct page *f2fs_pagecache_get_page(
>  
>  static inline void f2fs_copy_page(struct page *src, struct page *dst)
>  {
> - char *src_kaddr = kmap(src);
> - char *dst_kaddr = kmap(dst);
> + char *src_kaddr = kmap_thread(src);
> + char *dst_kaddr = kmap_thread(dst);
>  
>   memcpy(dst_kaddr, src_kaddr, PAGE_SIZE);
> - kunmap(dst);
> - kunmap(src);
> + kunmap_thread(dst);
> + kunmap_thread(src);
>  }

Wouldn't it make more sense to switch cases like this to kmap_atomic()?
The pages are only mapped to do a memcpy(), then they're immediately unmapped.

- Eric
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


RE: [PATCH] drm/amd/display: Fix module load hangs when connected to an eDP

2020-10-09 Thread Li, Roman
[AMD Public Use]

Reviewed-by: Roman Li 

-Original Message-
From: Siqueira, Rodrigo  
Sent: Friday, October 9, 2020 5:18 PM
To: dri-devel@lists.freedesktop.org
Cc: Wentland, Harry ; Li, Sun peng (Leo) 
; Deucher, Alexander ; Li, Roman 
; Kazlauskas, Nicholas 
Subject: [PATCH] drm/amd/display: Fix module load hangs when connected to an eDP

It was recently introduced a change that enables driver to disable streams if 
pixel clock changes. Consequently, the code path executed in the disable vbios 
function expanded to an encoder verification part.
The encoder loop is nested inside the pipe count loop, and both loops share the 
'i' variable in control of their flow. This situation may lead to an infinite 
loop because the encoder loop constantly updates the `i` variable, making the 
first loop always positive. As a result, we can see a soft hang during the 
module load (modprobe amdgpu) and a series of dmesg log that looks like this:

kernel:[  124.538727] watchdog: BUG: soft lockup - CPU#2 stuck for 22s!
[modprobe:1000]
RSP: 0018:abbf419bf0e8 EFLAGS: 0282
RAX: c0809de0 RBX: 93b35ccc RCX: 93b366c21800
RDX:  RSI: 0141 RDI: 93b35ccc
RBP: abbf419bf108 R08: abbf419bf164 R09: 0001
R10: 0003 R11: 0003 R12: 08677d40
R13: 0141 R14: 93b35cfc R15: 93b35abc
FS:  7f1400717540() GS:93b37f68()
knlGS:
CS:  0010 DS:  ES:  CR0: 80050033
CR2: 5649b66b0968 CR3: 0003e0fec000 CR4: 00350ee0

Call Trace:
 amdgpu_device_rreg+0x17/0x20 [amdgpu]
 amdgpu_cgs_read_register+0x14/0x20 [amdgpu]
 dm_read_reg_func+0x3a/0xb0 [amdgpu]
 get_pixel_clk_frequency_100hz+0x30/0x50 [amdgpu]
 dc_commit_state+0x8f1/0xae0 [amdgpu]
 ? drm_calc_timestamping_constants+0x101/0x160 [drm]
 amdgpu_dm_atomic_commit_tail+0x39d/0x21a0 [amdgpu]  ? 
dcn21_validate_bandwidth+0xe5/0x290 [amdgpu]  ? kfree+0xc3/0x390  ? 
dcn21_validate_bandwidth+0xe5/0x290 [amdgpu] ...
RSP: 002b:7fff26009bd8 EFLAGS: 0246 ORIG_RAX: 0139
RAX: ffda RBX: 55a8025bea50 RCX: 7f140085c89d
RDX:  RSI: 55a8025b8290 RDI: 000c
RBP: 0004 R08:  R09: 
R10: 000c R11: 0246 R12: 55a8025b8290
R13:  R14: 55a8025bead0 R15: 55a8025bea50

This issue was fixed by introducing a second variable for the internal loop.

Fixes: 32933ac6ec3a ("drm/amd/display: disable stream if pixel clock changed 
with link active")
Signed-off-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 8d96ef157987..3f7d04b8956a 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -848,7 +848,7 @@ static void disable_vbios_mode_if_required(
struct dc *dc,
struct dc_state *context)
 {
-   unsigned int i;
+   unsigned int i, j;
 
/* check if timing_changed, disable stream*/
for (i = 0; i < dc->res_pool->pipe_count; i++) { @@ -872,10 +872,10 @@ 
static void disable_vbios_mode_if_required(
 
enc_inst = 
link->link_enc->funcs->get_dig_frontend(link->link_enc);
if (enc_inst != ENGINE_ID_UNKNOWN) {
-   for (i = 0; i < dc->res_pool->stream_enc_count; 
i++) {
-   if (dc->res_pool->stream_enc[i]->id == 
enc_inst) {
-   tg_inst = 
dc->res_pool->stream_enc[i]->funcs->dig_source_otg(
-   
dc->res_pool->stream_enc[i]);
+   for (j = 0; j < dc->res_pool->stream_enc_count; 
j++) {
+   if (dc->res_pool->stream_enc[j]->id == 
enc_inst) {
+   tg_inst = 
dc->res_pool->stream_enc[j]->funcs->dig_source_otg(
+   
dc->res_pool->stream_enc[j]);
break;
}
}
--
2.28.0
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] drm/amd/display: Fix module load hangs when connected to an eDP

2020-10-09 Thread Rodrigo Siqueira
It was recently introduced a change that enables driver to disable
streams if pixel clock changes. Consequently, the code path executed in
the disable vbios function expanded to an encoder verification part.
The encoder loop is nested inside the pipe count loop, and both loops
share the 'i' variable in control of their flow. This situation may lead
to an infinite loop because the encoder loop constantly updates the `i`
variable, making the first loop always positive. As a result, we can see
a soft hang during the module load (modprobe amdgpu) and a series of
dmesg log that looks like this:

kernel:[  124.538727] watchdog: BUG: soft lockup - CPU#2 stuck for 22s!
[modprobe:1000]
RSP: 0018:abbf419bf0e8 EFLAGS: 0282
RAX: c0809de0 RBX: 93b35ccc RCX: 93b366c21800
RDX:  RSI: 0141 RDI: 93b35ccc
RBP: abbf419bf108 R08: abbf419bf164 R09: 0001
R10: 0003 R11: 0003 R12: 08677d40
R13: 0141 R14: 93b35cfc R15: 93b35abc
FS:  7f1400717540() GS:93b37f68()
knlGS:
CS:  0010 DS:  ES:  CR0: 80050033
CR2: 5649b66b0968 CR3: 0003e0fec000 CR4: 00350ee0

Call Trace:
 amdgpu_device_rreg+0x17/0x20 [amdgpu]
 amdgpu_cgs_read_register+0x14/0x20 [amdgpu]
 dm_read_reg_func+0x3a/0xb0 [amdgpu]
 get_pixel_clk_frequency_100hz+0x30/0x50 [amdgpu]
 dc_commit_state+0x8f1/0xae0 [amdgpu]
 ? drm_calc_timestamping_constants+0x101/0x160 [drm]
 amdgpu_dm_atomic_commit_tail+0x39d/0x21a0 [amdgpu]
 ? dcn21_validate_bandwidth+0xe5/0x290 [amdgpu]
 ? kfree+0xc3/0x390
 ? dcn21_validate_bandwidth+0xe5/0x290 [amdgpu]
...
RSP: 002b:7fff26009bd8 EFLAGS: 0246 ORIG_RAX: 0139
RAX: ffda RBX: 55a8025bea50 RCX: 7f140085c89d
RDX:  RSI: 55a8025b8290 RDI: 000c
RBP: 0004 R08:  R09: 
R10: 000c R11: 0246 R12: 55a8025b8290
R13:  R14: 55a8025bead0 R15: 55a8025bea50

This issue was fixed by introducing a second variable for the internal
loop.

Fixes: 32933ac6ec3a ("drm/amd/display: disable stream if pixel clock changed 
with link active")
Signed-off-by: Rodrigo Siqueira 
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 8d96ef157987..3f7d04b8956a 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -848,7 +848,7 @@ static void disable_vbios_mode_if_required(
struct dc *dc,
struct dc_state *context)
 {
-   unsigned int i;
+   unsigned int i, j;
 
/* check if timing_changed, disable stream*/
for (i = 0; i < dc->res_pool->pipe_count; i++) {
@@ -872,10 +872,10 @@ static void disable_vbios_mode_if_required(
 
enc_inst = 
link->link_enc->funcs->get_dig_frontend(link->link_enc);
if (enc_inst != ENGINE_ID_UNKNOWN) {
-   for (i = 0; i < dc->res_pool->stream_enc_count; 
i++) {
-   if (dc->res_pool->stream_enc[i]->id == 
enc_inst) {
-   tg_inst = 
dc->res_pool->stream_enc[i]->funcs->dig_source_otg(
-   
dc->res_pool->stream_enc[i]);
+   for (j = 0; j < dc->res_pool->stream_enc_count; 
j++) {
+   if (dc->res_pool->stream_enc[j]->id == 
enc_inst) {
+   tg_inst = 
dc->res_pool->stream_enc[j]->funcs->dig_source_otg(
+   
dc->res_pool->stream_enc[j]);
break;
}
}
-- 
2.28.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 57/58] nvdimm/pmem: Stray access protection for pmem->virt_addr

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The pmem driver uses a cached virtual address to access its memory
directly.  Because the nvdimm driver is well aware of the special
protections it has mapped memory with, we call dev_access_[en|dis]able()
around the direct pmem->virt_addr (pmem_addr) usage instead of the
unnecessary overhead of trying to get a page to kmap.

Signed-off-by: Ira Weiny 
---
 drivers/nvdimm/pmem.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index fab29b514372..e4dc1ae990fc 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -148,7 +148,9 @@ static blk_status_t pmem_do_read(struct pmem_device *pmem,
if (unlikely(is_bad_pmem(>bb, sector, len)))
return BLK_STS_IOERR;
 
+   dev_access_enable(false);
rc = read_pmem(page, page_off, pmem_addr, len);
+   dev_access_disable(false);
flush_dcache_page(page);
return rc;
 }
@@ -180,11 +182,13 @@ static blk_status_t pmem_do_write(struct pmem_device 
*pmem,
 * after clear poison.
 */
flush_dcache_page(page);
+   dev_access_enable(false);
write_pmem(pmem_addr, page, page_off, len);
if (unlikely(bad_pmem)) {
rc = pmem_clear_poison(pmem, pmem_off, len);
write_pmem(pmem_addr, page, page_off, len);
}
+   dev_access_disable(false);
 
return rc;
 }
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 58/58] [dax|pmem]: Enable stray access protection

2020-10-09 Thread ira . weiny
From: Ira Weiny 

Protecting against stray writes is particularly important for PMEM
because, unlike writes to anonymous memory, writes to PMEM persists
across a reboot.  Thus data corruption could result in permanent loss of
data.

While stray writes are more serious than reads, protection is also
enabled for reads.  This helps to detect bugs in code which would
incorrectly access device memory and prevents a more serious machine
checks should those bug reads from a poison page.

Enable stray access protection by setting the flag in pgmap which
requests it.  There is no option presented to the user.  If Zone Device
Access Protection not be supported this flag will have no affect.

Signed-off-by: Ira Weiny 
---
 drivers/dax/device.c  | 2 ++
 drivers/nvdimm/pmem.c | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/drivers/dax/device.c b/drivers/dax/device.c
index 1e89513f3c59..e6fb35b4f0fb 100644
--- a/drivers/dax/device.c
+++ b/drivers/dax/device.c
@@ -430,6 +430,8 @@ int dev_dax_probe(struct device *dev)
}
 
dev_dax->pgmap.type = MEMORY_DEVICE_GENERIC;
+   dev_dax->pgmap.flags |= PGMAP_PROT_ENABLED;
+
addr = devm_memremap_pages(dev, _dax->pgmap);
if (IS_ERR(addr))
return PTR_ERR(addr);
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index e4dc1ae990fc..9fcd8338e23f 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -426,6 +426,8 @@ static int pmem_attach_disk(struct device *dev,
return -EBUSY;
}
 
+   pmem->pgmap.flags |= PGMAP_PROT_ENABLED;
+
q = blk_alloc_queue(dev_to_node(dev));
if (!q)
return -ENOMEM;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 56/58] dax: Stray access protection for dax_direct_access()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

dax_direct_access() is a special case of accessing pmem via a page
offset and without a struct page.

Because the dax driver is well aware of the special protections it has
mapped memory with, call dev_access_[en|dis]able() directly instead of
the unnecessary overhead of trying to get a page to kmap.

Similar to kmap, we leverage existing functions, dax_read_[un]lock(),
because they are already required to surround the use of the memory
returned from dax_direct_access().

Signed-off-by: Ira Weiny 
---
 drivers/dax/super.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/dax/super.c b/drivers/dax/super.c
index e84070b55463..0ddb3ee73e36 100644
--- a/drivers/dax/super.c
+++ b/drivers/dax/super.c
@@ -30,6 +30,7 @@ static DEFINE_SPINLOCK(dax_host_lock);
 
 int dax_read_lock(void)
 {
+   dev_access_enable(false);
return srcu_read_lock(_srcu);
 }
 EXPORT_SYMBOL_GPL(dax_read_lock);
@@ -37,6 +38,7 @@ EXPORT_SYMBOL_GPL(dax_read_lock);
 void dax_read_unlock(int id)
 {
srcu_read_unlock(_srcu, id);
+   dev_access_disable(false);
 }
 EXPORT_SYMBOL_GPL(dax_read_unlock);
 
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 49/58] drivers/misc: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Greg Kroah-Hartman 
Signed-off-by: Ira Weiny 
---
 drivers/misc/vmw_vmci/vmci_queue_pair.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/misc/vmw_vmci/vmci_queue_pair.c 
b/drivers/misc/vmw_vmci/vmci_queue_pair.c
index 8531ae781195..f308abb8ad03 100644
--- a/drivers/misc/vmw_vmci/vmci_queue_pair.c
+++ b/drivers/misc/vmw_vmci/vmci_queue_pair.c
@@ -343,7 +343,7 @@ static int qp_memcpy_to_queue_iter(struct vmci_queue *queue,
size_t to_copy;
 
if (kernel_if->host)
-   va = kmap(kernel_if->u.h.page[page_index]);
+   va = kmap_thread(kernel_if->u.h.page[page_index]);
else
va = kernel_if->u.g.vas[page_index + 1];
/* Skip header. */
@@ -357,12 +357,12 @@ static int qp_memcpy_to_queue_iter(struct vmci_queue 
*queue,
if (!copy_from_iter_full((u8 *)va + page_offset, to_copy,
 from)) {
if (kernel_if->host)
-   kunmap(kernel_if->u.h.page[page_index]);
+   kunmap_thread(kernel_if->u.h.page[page_index]);
return VMCI_ERROR_INVALID_ARGS;
}
bytes_copied += to_copy;
if (kernel_if->host)
-   kunmap(kernel_if->u.h.page[page_index]);
+   kunmap_thread(kernel_if->u.h.page[page_index]);
}
 
return VMCI_SUCCESS;
@@ -391,7 +391,7 @@ static int qp_memcpy_from_queue_iter(struct iov_iter *to,
int err;
 
if (kernel_if->host)
-   va = kmap(kernel_if->u.h.page[page_index]);
+   va = kmap_thread(kernel_if->u.h.page[page_index]);
else
va = kernel_if->u.g.vas[page_index + 1];
/* Skip header. */
@@ -405,12 +405,12 @@ static int qp_memcpy_from_queue_iter(struct iov_iter *to,
err = copy_to_iter((u8 *)va + page_offset, to_copy, to);
if (err != to_copy) {
if (kernel_if->host)
-   kunmap(kernel_if->u.h.page[page_index]);
+   kunmap_thread(kernel_if->u.h.page[page_index]);
return VMCI_ERROR_INVALID_ARGS;
}
bytes_copied += to_copy;
if (kernel_if->host)
-   kunmap(kernel_if->u.h.page[page_index]);
+   kunmap_thread(kernel_if->u.h.page[page_index]);
}
 
return VMCI_SUCCESS;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 55/58] samples: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Kirti Wankhede 
Signed-off-by: Ira Weiny 
---
 samples/vfio-mdev/mbochs.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/samples/vfio-mdev/mbochs.c b/samples/vfio-mdev/mbochs.c
index 3cc5e5921682..6d95422c0b46 100644
--- a/samples/vfio-mdev/mbochs.c
+++ b/samples/vfio-mdev/mbochs.c
@@ -479,12 +479,12 @@ static ssize_t mdev_access(struct mdev_device *mdev, char 
*buf, size_t count,
pos -= MBOCHS_MMIO_BAR_OFFSET;
poff = pos & ~PAGE_MASK;
pg = __mbochs_get_page(mdev_state, pos >> PAGE_SHIFT);
-   map = kmap(pg);
+   map = kmap_thread(pg);
if (is_write)
memcpy(map + poff, buf, count);
else
memcpy(buf, map + poff, count);
-   kunmap(pg);
+   kunmap_thread(pg);
put_page(pg);
 
} else {
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 46/58] drives/staging: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Greg Kroah-Hartman 
Signed-off-by: Ira Weiny 
---
 drivers/staging/rts5208/rtsx_transport.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/rts5208/rtsx_transport.c 
b/drivers/staging/rts5208/rtsx_transport.c
index 0027bcf638ad..f747cc23951b 100644
--- a/drivers/staging/rts5208/rtsx_transport.c
+++ b/drivers/staging/rts5208/rtsx_transport.c
@@ -92,13 +92,13 @@ unsigned int rtsx_stor_access_xfer_buf(unsigned char 
*buffer,
while (sglen > 0) {
unsigned int plen = min(sglen, (unsigned int)
PAGE_SIZE - poff);
-   unsigned char *ptr = kmap(page);
+   unsigned char *ptr = kmap_thread(page);
 
if (dir == TO_XFER_BUF)
memcpy(ptr + poff, buffer + cnt, plen);
else
memcpy(buffer + cnt, ptr + poff, plen);
-   kunmap(page);
+   kunmap_thread(page);
 
/* Start at the beginning of the next page */
poff = 0;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 50/58] drivers/android: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Greg Kroah-Hartman 
Signed-off-by: Ira Weiny 
---
 drivers/android/binder_alloc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c
index 69609696a843..5f50856caad7 100644
--- a/drivers/android/binder_alloc.c
+++ b/drivers/android/binder_alloc.c
@@ -1118,9 +1118,9 @@ binder_alloc_copy_user_to_buffer(struct binder_alloc 
*alloc,
page = binder_alloc_get_page(alloc, buffer,
 buffer_offset, );
size = min_t(size_t, bytes, PAGE_SIZE - pgoff);
-   kptr = kmap(page) + pgoff;
+   kptr = kmap_thread(page) + pgoff;
ret = copy_from_user(kptr, from, size);
-   kunmap(page);
+   kunmap_thread(page);
if (ret)
return bytes - size + ret;
bytes -= size;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 53/58] lib: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Alexander Viro 
Cc: "Jérôme Glisse" 
Cc: Martin KaFai Lau 
Cc: Song Liu 
Cc: Yonghong Song 
Cc: Andrii Nakryiko 
Cc: John Fastabend 
Cc: KP Singh 
Signed-off-by: Ira Weiny 
---
 lib/iov_iter.c | 12 ++--
 lib/test_bpf.c |  4 ++--
 lib/test_hmm.c |  8 
 3 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/lib/iov_iter.c b/lib/iov_iter.c
index 5e40786c8f12..1d47f957cf95 100644
--- a/lib/iov_iter.c
+++ b/lib/iov_iter.c
@@ -208,7 +208,7 @@ static size_t copy_page_to_iter_iovec(struct page *page, 
size_t offset, size_t b
}
/* Too bad - revert to non-atomic kmap */
 
-   kaddr = kmap(page);
+   kaddr = kmap_thread(page);
from = kaddr + offset;
left = copyout(buf, from, copy);
copy -= left;
@@ -225,7 +225,7 @@ static size_t copy_page_to_iter_iovec(struct page *page, 
size_t offset, size_t b
from += copy;
bytes -= copy;
}
-   kunmap(page);
+   kunmap_thread(page);
 
 done:
if (skip == iov->iov_len) {
@@ -292,7 +292,7 @@ static size_t copy_page_from_iter_iovec(struct page *page, 
size_t offset, size_t
}
/* Too bad - revert to non-atomic kmap */
 
-   kaddr = kmap(page);
+   kaddr = kmap_thread(page);
to = kaddr + offset;
left = copyin(to, buf, copy);
copy -= left;
@@ -309,7 +309,7 @@ static size_t copy_page_from_iter_iovec(struct page *page, 
size_t offset, size_t
to += copy;
bytes -= copy;
}
-   kunmap(page);
+   kunmap_thread(page);
 
 done:
if (skip == iov->iov_len) {
@@ -1742,10 +1742,10 @@ int iov_iter_for_each_range(struct iov_iter *i, size_t 
bytes,
return 0;
 
iterate_all_kinds(i, bytes, v, -EINVAL, ({
-   w.iov_base = kmap(v.bv_page) + v.bv_offset;
+   w.iov_base = kmap_thread(v.bv_page) + v.bv_offset;
w.iov_len = v.bv_len;
err = f(, context);
-   kunmap(v.bv_page);
+   kunmap_thread(v.bv_page);
err;}), ({
w = v;
err = f(, context);})
diff --git a/lib/test_bpf.c b/lib/test_bpf.c
index ca7d635bccd9..441f822f56ba 100644
--- a/lib/test_bpf.c
+++ b/lib/test_bpf.c
@@ -6506,11 +6506,11 @@ static void *generate_test_data(struct bpf_test *test, 
int sub)
if (!page)
goto err_kfree_skb;
 
-   ptr = kmap(page);
+   ptr = kmap_thread(page);
if (!ptr)
goto err_free_page;
memcpy(ptr, test->frag_data, MAX_DATA);
-   kunmap(page);
+   kunmap_thread(page);
skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
}
 
diff --git a/lib/test_hmm.c b/lib/test_hmm.c
index e7dc3de355b7..e40d26f97f45 100644
--- a/lib/test_hmm.c
+++ b/lib/test_hmm.c
@@ -329,9 +329,9 @@ static int dmirror_do_read(struct dmirror *dmirror, 
unsigned long start,
if (!page)
return -ENOENT;
 
-   tmp = kmap(page);
+   tmp = kmap_thread(page);
memcpy(ptr, tmp, PAGE_SIZE);
-   kunmap(page);
+   kunmap_thread(page);
 
ptr += PAGE_SIZE;
bounce->cpages++;
@@ -398,9 +398,9 @@ static int dmirror_do_write(struct dmirror *dmirror, 
unsigned long start,
if (!page || xa_pointer_tag(entry) != DPT_XA_TAG_WRITE)
return -ENOENT;
 
-   tmp = kmap(page);
+   tmp = kmap_thread(page);
memcpy(tmp, ptr, PAGE_SIZE);
-   kunmap(page);
+   kunmap_thread(page);
 
ptr += PAGE_SIZE;
bounce->cpages++;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 47/58] drivers/mtd: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Miquel Raynal 
Cc: Richard Weinberger 
Cc: Vignesh Raghavendra 
Signed-off-by: Ira Weiny 
---
 drivers/mtd/mtd_blkdevs.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c
index 0c05f77f9b21..4b18998273fa 100644
--- a/drivers/mtd/mtd_blkdevs.c
+++ b/drivers/mtd/mtd_blkdevs.c
@@ -88,14 +88,14 @@ static blk_status_t do_blktrans_request(struct 
mtd_blktrans_ops *tr,
return BLK_STS_IOERR;
return BLK_STS_OK;
case REQ_OP_READ:
-   buf = kmap(bio_page(req->bio)) + bio_offset(req->bio);
+   buf = kmap_thread(bio_page(req->bio)) + bio_offset(req->bio);
for (; nsect > 0; nsect--, block++, buf += tr->blksize) {
if (tr->readsect(dev, block, buf)) {
-   kunmap(bio_page(req->bio));
+   kunmap_thread(bio_page(req->bio));
return BLK_STS_IOERR;
}
}
-   kunmap(bio_page(req->bio));
+   kunmap_thread(bio_page(req->bio));
rq_flush_dcache_pages(req);
return BLK_STS_OK;
case REQ_OP_WRITE:
@@ -103,14 +103,14 @@ static blk_status_t do_blktrans_request(struct 
mtd_blktrans_ops *tr,
return BLK_STS_IOERR;
 
rq_flush_dcache_pages(req);
-   buf = kmap(bio_page(req->bio)) + bio_offset(req->bio);
+   buf = kmap_thread(bio_page(req->bio)) + bio_offset(req->bio);
for (; nsect > 0; nsect--, block++, buf += tr->blksize) {
if (tr->writesect(dev, block, buf)) {
-   kunmap(bio_page(req->bio));
+   kunmap_thread(bio_page(req->bio));
return BLK_STS_IOERR;
}
}
-   kunmap(bio_page(req->bio));
+   kunmap_thread(bio_page(req->bio));
return BLK_STS_OK;
default:
return BLK_STS_IOERR;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 52/58] mm: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Signed-off-by: Ira Weiny 
---
 mm/memory.c  | 8 
 mm/swapfile.c| 4 ++--
 mm/userfaultfd.c | 4 ++--
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/mm/memory.c b/mm/memory.c
index fcfc4ca36eba..75a054882d7a 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -4945,7 +4945,7 @@ int __access_remote_vm(struct task_struct *tsk, struct 
mm_struct *mm,
if (bytes > PAGE_SIZE-offset)
bytes = PAGE_SIZE-offset;
 
-   maddr = kmap(page);
+   maddr = kmap_thread(page);
if (write) {
copy_to_user_page(vma, page, addr,
  maddr + offset, buf, bytes);
@@ -4954,7 +4954,7 @@ int __access_remote_vm(struct task_struct *tsk, struct 
mm_struct *mm,
copy_from_user_page(vma, page, addr,
buf, maddr + offset, bytes);
}
-   kunmap(page);
+   kunmap_thread(page);
put_page(page);
}
len -= bytes;
@@ -5216,14 +5216,14 @@ long copy_huge_page_from_user(struct page *dst_page,
 
for (i = 0; i < pages_per_huge_page; i++) {
if (allow_pagefault)
-   page_kaddr = kmap(dst_page + i);
+   page_kaddr = kmap_thread(dst_page + i);
else
page_kaddr = kmap_atomic(dst_page + i);
rc = copy_from_user(page_kaddr,
(const void __user *)(src + i * PAGE_SIZE),
PAGE_SIZE);
if (allow_pagefault)
-   kunmap(dst_page + i);
+   kunmap_thread(dst_page + i);
else
kunmap_atomic(page_kaddr);
 
diff --git a/mm/swapfile.c b/mm/swapfile.c
index debc94155f74..e3296ff95648 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -3219,7 +3219,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, 
int, swap_flags)
error = PTR_ERR(page);
goto bad_swap_unlock_inode;
}
-   swap_header = kmap(page);
+   swap_header = kmap_thread(page);
 
maxpages = read_swap_header(p, swap_header, inode);
if (unlikely(!maxpages)) {
@@ -3395,7 +3395,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, 
int, swap_flags)
filp_close(swap_file, NULL);
 out:
if (page && !IS_ERR(page)) {
-   kunmap(page);
+   kunmap_thread(page);
put_page(page);
}
if (name)
diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c
index 9a3d451402d7..4d38c881bb2d 100644
--- a/mm/userfaultfd.c
+++ b/mm/userfaultfd.c
@@ -586,11 +586,11 @@ static __always_inline ssize_t __mcopy_atomic(struct 
mm_struct *dst_mm,
mmap_read_unlock(dst_mm);
BUG_ON(!page);
 
-   page_kaddr = kmap(page);
+   page_kaddr = kmap_thread(page);
err = copy_from_user(page_kaddr,
 (const void __user *) src_addr,
 PAGE_SIZE);
-   kunmap(page);
+   kunmap_thread(page);
if (unlikely(err)) {
err = -EFAULT;
goto out;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 54/58] powerpc: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Benjamin Herrenschmidt 
Cc: Paul Mackerras 
Signed-off-by: Ira Weiny 
---
 arch/powerpc/mm/mem.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 42e25874f5a8..6ef557b8dda6 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -573,9 +573,9 @@ void flush_icache_user_page(struct vm_area_struct *vma, 
struct page *page,
 {
unsigned long maddr;
 
-   maddr = (unsigned long) kmap(page) + (addr & ~PAGE_MASK);
+   maddr = (unsigned long) kmap_thread(page) + (addr & ~PAGE_MASK);
flush_icache_range(maddr, maddr + len);
-   kunmap(page);
+   kunmap_thread(page);
 }
 
 /*
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 48/58] drivers/md: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Coly Li  (maintainer:BCACHE (BLOCK LAYER CACHE))
Cc: Kent Overstreet  (maintainer:BCACHE (BLOCK LAYER 
CACHE))
Signed-off-by: Ira Weiny 
---
 drivers/md/bcache/request.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c
index c7cadaafa947..a4571f6d09dd 100644
--- a/drivers/md/bcache/request.c
+++ b/drivers/md/bcache/request.c
@@ -44,10 +44,10 @@ static void bio_csum(struct bio *bio, struct bkey *k)
uint64_t csum = 0;
 
bio_for_each_segment(bv, bio, iter) {
-   void *d = kmap(bv.bv_page) + bv.bv_offset;
+   void *d = kmap_thread(bv.bv_page) + bv.bv_offset;
 
csum = bch_crc64_update(csum, d, bv.bv_len);
-   kunmap(bv.bv_page);
+   kunmap_thread(bv.bv_page);
}
 
k->ptr[KEY_PTRS(k)] = csum & (~0ULL >> 1);
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 51/58] kernel: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

This kmap() call is localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Eric Biederman 
Signed-off-by: Ira Weiny 
---
 kernel/kexec_core.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
index c19c0dad1ebe..272a9920c0d6 100644
--- a/kernel/kexec_core.c
+++ b/kernel/kexec_core.c
@@ -815,7 +815,7 @@ static int kimage_load_normal_segment(struct kimage *image,
if (result < 0)
goto out;
 
-   ptr = kmap(page);
+   ptr = kmap_thread(page);
/* Start with a clear page */
clear_page(ptr);
ptr += maddr & ~PAGE_MASK;
@@ -828,7 +828,7 @@ static int kimage_load_normal_segment(struct kimage *image,
memcpy(ptr, kbuf, uchunk);
else
result = copy_from_user(ptr, buf, uchunk);
-   kunmap(page);
+   kunmap_thread(page);
if (result) {
result = -EFAULT;
goto out;
@@ -879,7 +879,7 @@ static int kimage_load_crash_segment(struct kimage *image,
goto out;
}
arch_kexec_post_alloc_pages(page_address(page), 1, 0);
-   ptr = kmap(page);
+   ptr = kmap_thread(page);
ptr += maddr & ~PAGE_MASK;
mchunk = min_t(size_t, mbytes,
PAGE_SIZE - (maddr & ~PAGE_MASK));
@@ -895,7 +895,7 @@ static int kimage_load_crash_segment(struct kimage *image,
else
result = copy_from_user(ptr, buf, uchunk);
kexec_flush_icache_page(page);
-   kunmap(page);
+   kunmap_thread(page);
arch_kexec_pre_free_pages(page_address(page), 1);
if (result) {
result = -EFAULT;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 45/58] drivers/firmware: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Ard Biesheuvel 
Signed-off-by: Ira Weiny 
---
 drivers/firmware/efi/capsule-loader.c | 6 +++---
 drivers/firmware/efi/capsule.c| 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/firmware/efi/capsule-loader.c 
b/drivers/firmware/efi/capsule-loader.c
index 4dde8edd53b6..aa2e0b5940fd 100644
--- a/drivers/firmware/efi/capsule-loader.c
+++ b/drivers/firmware/efi/capsule-loader.c
@@ -197,7 +197,7 @@ static ssize_t efi_capsule_write(struct file *file, const 
char __user *buff,
page = cap_info->pages[cap_info->index - 1];
}
 
-   kbuff = kmap(page);
+   kbuff = kmap_thread(page);
kbuff += PAGE_SIZE - cap_info->page_bytes_remain;
 
/* Copy capsule binary data from user space to kernel space buffer */
@@ -217,7 +217,7 @@ static ssize_t efi_capsule_write(struct file *file, const 
char __user *buff,
}
 
cap_info->count += write_byte;
-   kunmap(page);
+   kunmap_thread(page);
 
/* Submit the full binary to efi_capsule_update() API */
if (cap_info->header.headersize > 0 &&
@@ -236,7 +236,7 @@ static ssize_t efi_capsule_write(struct file *file, const 
char __user *buff,
return write_byte;
 
 fail_unmap:
-   kunmap(page);
+   kunmap_thread(page);
 failed:
efi_free_all_buff_pages(cap_info);
return ret;
diff --git a/drivers/firmware/efi/capsule.c b/drivers/firmware/efi/capsule.c
index 598b7800d14e..edb7797b0e4f 100644
--- a/drivers/firmware/efi/capsule.c
+++ b/drivers/firmware/efi/capsule.c
@@ -244,7 +244,7 @@ int efi_capsule_update(efi_capsule_header_t *capsule, 
phys_addr_t *pages)
for (i = 0; i < sg_count; i++) {
efi_capsule_block_desc_t *sglist;
 
-   sglist = kmap(sg_pages[i]);
+   sglist = kmap_thread(sg_pages[i]);
 
for (j = 0; j < SGLIST_PER_PAGE && count > 0; j++) {
u64 sz = min_t(u64, imagesize,
@@ -265,7 +265,7 @@ int efi_capsule_update(efi_capsule_header_t *capsule, 
phys_addr_t *pages)
else
sglist[j].data = page_to_phys(sg_pages[i + 1]);
 
-   kunmap(sg_pages[i]);
+   kunmap_thread(sg_pages[i]);
}
 
mutex_lock(_mutex);
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 40/58] net: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls in these drivers are localized to a single thread.
To avoid the over head of global PKRS updates use the new kmap_thread()
call.

Cc: "David S. Miller" 
Cc: Jakub Kicinski 
Cc: Alexey Kuznetsov 
Cc: Hideaki YOSHIFUJI 
Cc: Trond Myklebust 
Cc: Anna Schumaker 
Cc: Boris Pismenny 
Cc: Aviad Yehezkel 
Cc: John Fastabend 
Cc: Daniel Borkmann 
Signed-off-by: Ira Weiny 
---
 net/ceph/messenger.c | 4 ++--
 net/core/datagram.c  | 4 ++--
 net/core/sock.c  | 8 
 net/ipv4/ip_output.c | 4 ++--
 net/sunrpc/cache.c   | 4 ++--
 net/sunrpc/xdr.c | 8 
 net/tls/tls_device.c | 4 ++--
 7 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index d4d7a0e52491..0c49b8e333da 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -1535,10 +1535,10 @@ static u32 ceph_crc32c_page(u32 crc, struct page *page,
 {
char *kaddr;
 
-   kaddr = kmap(page);
+   kaddr = kmap_thread(page);
BUG_ON(kaddr == NULL);
crc = crc32c(crc, kaddr + page_offset, length);
-   kunmap(page);
+   kunmap_thread(page);
 
return crc;
 }
diff --git a/net/core/datagram.c b/net/core/datagram.c
index 639745d4f3b9..cbd0a343074a 100644
--- a/net/core/datagram.c
+++ b/net/core/datagram.c
@@ -441,14 +441,14 @@ static int __skb_datagram_iter(const struct sk_buff *skb, 
int offset,
end = start + skb_frag_size(frag);
if ((copy = end - offset) > 0) {
struct page *page = skb_frag_page(frag);
-   u8 *vaddr = kmap(page);
+   u8 *vaddr = kmap_thread(page);
 
if (copy > len)
copy = len;
n = INDIRECT_CALL_1(cb, simple_copy_to_iter,
vaddr + skb_frag_off(frag) + offset - 
start,
copy, data, to);
-   kunmap(page);
+   kunmap_thread(page);
offset += n;
if (n != copy)
goto short_copy;
diff --git a/net/core/sock.c b/net/core/sock.c
index 6c5c6b18eff4..9b46a75cd8c1 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -2846,11 +2846,11 @@ ssize_t sock_no_sendpage(struct socket *sock, struct 
page *page, int offset, siz
ssize_t res;
struct msghdr msg = {.msg_flags = flags};
struct kvec iov;
-   char *kaddr = kmap(page);
+   char *kaddr = kmap_thread(page);
iov.iov_base = kaddr + offset;
iov.iov_len = size;
res = kernel_sendmsg(sock, , , 1, size);
-   kunmap(page);
+   kunmap_thread(page);
return res;
 }
 EXPORT_SYMBOL(sock_no_sendpage);
@@ -2861,12 +2861,12 @@ ssize_t sock_no_sendpage_locked(struct sock *sk, struct 
page *page,
ssize_t res;
struct msghdr msg = {.msg_flags = flags};
struct kvec iov;
-   char *kaddr = kmap(page);
+   char *kaddr = kmap_thread(page);
 
iov.iov_base = kaddr + offset;
iov.iov_len = size;
res = kernel_sendmsg_locked(sk, , , 1, size);
-   kunmap(page);
+   kunmap_thread(page);
return res;
 }
 EXPORT_SYMBOL(sock_no_sendpage_locked);
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index e6f2ada9e7d5..05304fb251a4 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -949,9 +949,9 @@ csum_page(struct page *page, int offset, int copy)
 {
char *kaddr;
__wsum csum;
-   kaddr = kmap(page);
+   kaddr = kmap_thread(page);
csum = csum_partial(kaddr + offset, copy, 0);
-   kunmap(page);
+   kunmap_thread(page);
return csum;
 }
 
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c
index baef5ee43dbb..88193f2a8e6f 100644
--- a/net/sunrpc/cache.c
+++ b/net/sunrpc/cache.c
@@ -935,9 +935,9 @@ static ssize_t cache_downcall(struct address_space *mapping,
if (!page)
goto out_slow;
 
-   kaddr = kmap(page);
+   kaddr = kmap_thread(page);
ret = cache_do_downcall(kaddr, buf, count, cd);
-   kunmap(page);
+   kunmap_thread(page);
unlock_page(page);
put_page(page);
return ret;
diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c
index be11d672b5b9..00afbb48fb0a 100644
--- a/net/sunrpc/xdr.c
+++ b/net/sunrpc/xdr.c
@@ -1353,7 +1353,7 @@ xdr_xcode_array2(struct xdr_buf *buf, unsigned int base,
base &= ~PAGE_MASK;
avail_page = min_t(unsigned int, PAGE_SIZE - base,
avail_here);
-   c = kmap(*ppages) + base;
+   c = kmap_thread(*ppages) + base;
 
while (avail_here) {
avail_here -= avail_page;
@@ -1429,9 +1429,9 @@ xdr_xcode_array2(struct xdr_buf *buf, unsigned int base,
}
}

[PATCH RFC PKS/PMEM 37/58] fs/ext2: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS update use the new kmap_thread() call instead.

Cc: Jan Kara 
Signed-off-by: Ira Weiny 
---
 fs/ext2/dir.c  | 2 +-
 fs/ext2/ext2.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c
index f3194bf20733..abe97ba458c8 100644
--- a/fs/ext2/dir.c
+++ b/fs/ext2/dir.c
@@ -196,7 +196,7 @@ static struct page * ext2_get_page(struct inode *dir, 
unsigned long n,
struct address_space *mapping = dir->i_mapping;
struct page *page = read_mapping_page(mapping, n, NULL);
if (!IS_ERR(page)) {
-   kmap(page);
+   kmap_thread(page);
if (unlikely(!PageChecked(page))) {
if (PageError(page) || !ext2_check_page(page, quiet))
goto fail;
diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h
index 021ec8b42ac3..9bcb6714c255 100644
--- a/fs/ext2/ext2.h
+++ b/fs/ext2/ext2.h
@@ -749,7 +749,7 @@ extern struct ext2_dir_entry_2 * ext2_dotdot (struct inode 
*, struct page **);
 extern void ext2_set_link(struct inode *, struct ext2_dir_entry_2 *, struct 
page *, struct inode *, int);
 static inline void ext2_put_page(struct page *page)
 {
-   kunmap(page);
+   kunmap_thread(page);
put_page(page);
 }
 
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 43/58] drivers/mmc: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Ulf Hansson 
Cc: Sascha Sommer 
Signed-off-by: Ira Weiny 
---
 drivers/mmc/host/mmc_spi.c| 4 ++--
 drivers/mmc/host/sdricoh_cs.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c
index 18a850f37ddc..ab28e7103b8d 100644
--- a/drivers/mmc/host/mmc_spi.c
+++ b/drivers/mmc/host/mmc_spi.c
@@ -918,7 +918,7 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct 
mmc_command *cmd,
}
 
/* allow pio too; we don't allow highmem */
-   kmap_addr = kmap(sg_page(sg));
+   kmap_addr = kmap_thread(sg_page(sg));
if (direction == DMA_TO_DEVICE)
t->tx_buf = kmap_addr + sg->offset;
else
@@ -950,7 +950,7 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct 
mmc_command *cmd,
/* discard mappings */
if (direction == DMA_FROM_DEVICE)
flush_kernel_dcache_page(sg_page(sg));
-   kunmap(sg_page(sg));
+   kunmap_thread(sg_page(sg));
if (dma_dev)
dma_unmap_page(dma_dev, dma_addr, PAGE_SIZE, dir);
 
diff --git a/drivers/mmc/host/sdricoh_cs.c b/drivers/mmc/host/sdricoh_cs.c
index 76a8cd3a186f..7806bc69c4f1 100644
--- a/drivers/mmc/host/sdricoh_cs.c
+++ b/drivers/mmc/host/sdricoh_cs.c
@@ -312,11 +312,11 @@ static void sdricoh_request(struct mmc_host *mmc, struct 
mmc_request *mrq)
int result;
page = sg_page(data->sg);
 
-   buf = kmap(page) + data->sg->offset + (len * i);
+   buf = kmap_thread(page) + data->sg->offset + (len * i);
result =
sdricoh_blockio(host,
data->flags & MMC_DATA_READ, buf, len);
-   kunmap(page);
+   kunmap_thread(page);
flush_dcache_page(page);
if (result) {
dev_err(dev, "sdricoh_request: cmd %i "
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 39/58] fs/jffs2: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over head of
global PKRS updates use the new kmap_thread() call.

Signed-off-by: Ira Weiny 
---
 fs/jffs2/file.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c
index 3e6d54f9b011..14dd2b18cc16 100644
--- a/fs/jffs2/file.c
+++ b/fs/jffs2/file.c
@@ -287,13 +287,13 @@ static int jffs2_write_end(struct file *filp, struct 
address_space *mapping,
 
/* In 2.4, it was already kmapped by generic_file_write(). Doesn't
   hurt to do it again. The alternative is ifdefs, which are ugly. */
-   kmap(pg);
+   kmap_thread(pg);
 
ret = jffs2_write_inode_range(c, f, ri, page_address(pg) + 
aligned_start,
  (pg->index << PAGE_SHIFT) + aligned_start,
  end - aligned_start, );
 
-   kunmap(pg);
+   kunmap_thread(pg);
 
if (ret) {
/* There was an error writing. */
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 44/58] drivers/xen: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Stefano Stabellini 
Signed-off-by: Ira Weiny 
---
 drivers/xen/gntalloc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index 3fa40c723e8e..3b78e055feff 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -184,9 +184,9 @@ static int add_grefs(struct ioctl_gntalloc_alloc_gref *op,
 static void __del_gref(struct gntalloc_gref *gref)
 {
if (gref->notify.flags & UNMAP_NOTIFY_CLEAR_BYTE) {
-   uint8_t *tmp = kmap(gref->page);
+   uint8_t *tmp = kmap_thread(gref->page);
tmp[gref->notify.pgoff] = 0;
-   kunmap(gref->page);
+   kunmap_thread(gref->page);
}
if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
notify_remote_via_evtchn(gref->notify.event);
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 42/58] drivers/scsi: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: "James E.J. Bottomley" 
Cc: "Martin K. Petersen" 
Signed-off-by: Ira Weiny 
---
 drivers/scsi/ipr.c | 8 
 drivers/scsi/pmcraid.c | 8 
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index b0aa58d117cc..a5a0b8feb661 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -3923,9 +3923,9 @@ static int ipr_copy_ucode_buffer(struct ipr_sglist 
*sglist,
buffer += bsize_elem) {
struct page *page = sg_page(sg);
 
-   kaddr = kmap(page);
+   kaddr = kmap_thread(page);
memcpy(kaddr, buffer, bsize_elem);
-   kunmap(page);
+   kunmap_thread(page);
 
sg->length = bsize_elem;
 
@@ -3938,9 +3938,9 @@ static int ipr_copy_ucode_buffer(struct ipr_sglist 
*sglist,
if (len % bsize_elem) {
struct page *page = sg_page(sg);
 
-   kaddr = kmap(page);
+   kaddr = kmap_thread(page);
memcpy(kaddr, buffer, len % bsize_elem);
-   kunmap(page);
+   kunmap_thread(page);
 
sg->length = len % bsize_elem;
}
diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c
index aa9ae2ae8579..4b05ba4b8a11 100644
--- a/drivers/scsi/pmcraid.c
+++ b/drivers/scsi/pmcraid.c
@@ -3269,13 +3269,13 @@ static int pmcraid_copy_sglist(
for (i = 0; i < (len / bsize_elem); i++, sg = sg_next(sg), buffer += 
bsize_elem) {
struct page *page = sg_page(sg);
 
-   kaddr = kmap(page);
+   kaddr = kmap_thread(page);
if (direction == DMA_TO_DEVICE)
rc = copy_from_user(kaddr, buffer, bsize_elem);
else
rc = copy_to_user(buffer, kaddr, bsize_elem);
 
-   kunmap(page);
+   kunmap_thread(page);
 
if (rc) {
pmcraid_err("failed to copy user data into sg list\n");
@@ -3288,14 +3288,14 @@ static int pmcraid_copy_sglist(
if (len % bsize_elem) {
struct page *page = sg_page(sg);
 
-   kaddr = kmap(page);
+   kaddr = kmap_thread(page);
 
if (direction == DMA_TO_DEVICE)
rc = copy_from_user(kaddr, buffer, len % bsize_elem);
else
rc = copy_to_user(buffer, kaddr, len % bsize_elem);
 
-   kunmap(page);
+   kunmap_thread(page);
 
sg->length = len % bsize_elem;
}
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 33/58] fs/cramfs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Nicolas Pitre 
Signed-off-by: Ira Weiny 
---
 fs/cramfs/inode.c | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c
index 912308600d39..003c014a42ed 100644
--- a/fs/cramfs/inode.c
+++ b/fs/cramfs/inode.c
@@ -247,8 +247,8 @@ static void *cramfs_blkdev_read(struct super_block *sb, 
unsigned int offset,
struct page *page = pages[i];
 
if (page) {
-   memcpy(data, kmap(page), PAGE_SIZE);
-   kunmap(page);
+   memcpy(data, kmap_thread(page), PAGE_SIZE);
+   kunmap_thread(page);
put_page(page);
} else
memset(data, 0, PAGE_SIZE);
@@ -826,7 +826,7 @@ static int cramfs_readpage(struct file *file, struct page 
*page)
 
maxblock = (inode->i_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
bytes_filled = 0;
-   pgdata = kmap(page);
+   pgdata = kmap_thread(page);
 
if (page->index < maxblock) {
struct super_block *sb = inode->i_sb;
@@ -914,13 +914,13 @@ static int cramfs_readpage(struct file *file, struct page 
*page)
 
memset(pgdata + bytes_filled, 0, PAGE_SIZE - bytes_filled);
flush_dcache_page(page);
-   kunmap(page);
+   kunmap_thread(page);
SetPageUptodate(page);
unlock_page(page);
return 0;
 
 err:
-   kunmap(page);
+   kunmap_thread(page);
ClearPageUptodate(page);
SetPageError(page);
unlock_page(page);
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 38/58] fs/isofs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over head of
global PKRS updates use the new kmap_thread() call.

Signed-off-by: Ira Weiny 
---
 fs/isofs/compress.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c
index bc12ac7e2312..ddd3fd99d2e1 100644
--- a/fs/isofs/compress.c
+++ b/fs/isofs/compress.c
@@ -344,7 +344,7 @@ static int zisofs_readpage(struct file *file, struct page 
*page)
pages[i] = grab_cache_page_nowait(mapping, index);
if (pages[i]) {
ClearPageError(pages[i]);
-   kmap(pages[i]);
+   kmap_thread(pages[i]);
}
}
 
@@ -356,7 +356,7 @@ static int zisofs_readpage(struct file *file, struct page 
*page)
flush_dcache_page(pages[i]);
if (i == full_page && err)
SetPageError(pages[i]);
-   kunmap(pages[i]);
+   kunmap_thread(pages[i]);
unlock_page(pages[i]);
if (i != full_page)
put_page(pages[i]);
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 36/58] fs/ext2: Use ext2_put_page

2020-10-09 Thread ira . weiny
From: Ira Weiny 

There are 3 places in namei.c where the equivalent of ext2_put_page() is
open coded.  We want to use k[un]map_thread() instead of k[un]map() in
ext2_[get|put]_page().

Move ext2_put_page() to ext2.h and use it in namei.c in prep for
converting the k[un]map() code.

Cc: Jan Kara 
Signed-off-by: Ira Weiny 
---
 fs/ext2/dir.c   |  6 --
 fs/ext2/ext2.h  |  8 
 fs/ext2/namei.c | 15 +--
 3 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c
index 70355ab6740e..f3194bf20733 100644
--- a/fs/ext2/dir.c
+++ b/fs/ext2/dir.c
@@ -66,12 +66,6 @@ static inline unsigned ext2_chunk_size(struct inode *inode)
return inode->i_sb->s_blocksize;
 }
 
-static inline void ext2_put_page(struct page *page)
-{
-   kunmap(page);
-   put_page(page);
-}
-
 /*
  * Return the offset into page `page_nr' of the last valid
  * byte in that page, plus one.
diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h
index 5136b7289e8d..021ec8b42ac3 100644
--- a/fs/ext2/ext2.h
+++ b/fs/ext2/ext2.h
@@ -16,6 +16,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 
 /* XXX Here for now... not interested in restructing headers JUST now */
 
@@ -745,6 +747,12 @@ extern int ext2_delete_entry (struct ext2_dir_entry_2 *, 
struct page *);
 extern int ext2_empty_dir (struct inode *);
 extern struct ext2_dir_entry_2 * ext2_dotdot (struct inode *, struct page **);
 extern void ext2_set_link(struct inode *, struct ext2_dir_entry_2 *, struct 
page *, struct inode *, int);
+static inline void ext2_put_page(struct page *page)
+{
+   kunmap(page);
+   put_page(page);
+}
+
 
 /* ialloc.c */
 extern struct inode * ext2_new_inode (struct inode *, umode_t, const struct 
qstr *);
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c
index 5bf2c145643b..ea980f1e2e99 100644
--- a/fs/ext2/namei.c
+++ b/fs/ext2/namei.c
@@ -389,23 +389,18 @@ static int ext2_rename (struct inode * old_dir, struct 
dentry * old_dentry,
if (dir_de) {
if (old_dir != new_dir)
ext2_set_link(old_inode, dir_de, dir_page, new_dir, 0);
-   else {
-   kunmap(dir_page);
-   put_page(dir_page);
-   }
+   else
+   ext2_put_page(dir_page);
inode_dec_link_count(old_dir);
}
return 0;
 
 
 out_dir:
-   if (dir_de) {
-   kunmap(dir_page);
-   put_page(dir_page);
-   }
+   if (dir_de)
+   ext2_put_page(dir_page);
 out_old:
-   kunmap(old_page);
-   put_page(old_page);
+   ext2_put_page(old_page);
 out:
return err;
 }
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 41/58] drivers/target: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls in this driver are localized to a single thread.  To
avoid the over head of global PKRS updates use the new kmap_thread()
call.

Signed-off-by: Ira Weiny 
---
 drivers/target/target_core_iblock.c| 4 ++--
 drivers/target/target_core_rd.c| 4 ++--
 drivers/target/target_core_transport.c | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/target/target_core_iblock.c 
b/drivers/target/target_core_iblock.c
index 1c181d31f4c8..df7b1568edb3 100644
--- a/drivers/target/target_core_iblock.c
+++ b/drivers/target/target_core_iblock.c
@@ -415,7 +415,7 @@ iblock_execute_zero_out(struct block_device *bdev, struct 
se_cmd *cmd)
unsigned char *buf, *not_zero;
int ret;
 
-   buf = kmap(sg_page(sg)) + sg->offset;
+   buf = kmap_thread(sg_page(sg)) + sg->offset;
if (!buf)
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
/*
@@ -423,7 +423,7 @@ iblock_execute_zero_out(struct block_device *bdev, struct 
se_cmd *cmd)
 * incoming WRITE_SAME payload does not contain zeros.
 */
not_zero = memchr_inv(buf, 0x00, cmd->data_length);
-   kunmap(sg_page(sg));
+   kunmap_thread(sg_page(sg));
 
if (not_zero)
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
diff --git a/drivers/target/target_core_rd.c b/drivers/target/target_core_rd.c
index 408bd975170b..dbbdd39c5bf9 100644
--- a/drivers/target/target_core_rd.c
+++ b/drivers/target/target_core_rd.c
@@ -159,9 +159,9 @@ static int rd_allocate_sgl_table(struct rd_dev *rd_dev, 
struct rd_dev_sg_table *
sg_assign_page([j], pg);
sg[j].length = PAGE_SIZE;
 
-   p = kmap(pg);
+   p = kmap_thread(pg);
memset(p, init_payload, PAGE_SIZE);
-   kunmap(pg);
+   kunmap_thread(pg);
}
 
page_offset += sg_per_table;
diff --git a/drivers/target/target_core_transport.c 
b/drivers/target/target_core_transport.c
index ff26ab0a5f60..8d0bae5a92e5 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -1692,11 +1692,11 @@ int target_submit_cmd_map_sgls(struct se_cmd *se_cmd, 
struct se_session *se_sess
unsigned char *buf = NULL;
 
if (sgl)
-   buf = kmap(sg_page(sgl)) + sgl->offset;
+   buf = kmap_thread(sg_page(sgl)) + sgl->offset;
 
if (buf) {
memset(buf, 0, sgl->length);
-   kunmap(sg_page(sgl));
+   kunmap_thread(sg_page(sgl));
}
}
 
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 32/58] fs/hostfs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Jeff Dike 
Cc: Richard Weinberger 
Cc: Anton Ivanov 
Signed-off-by: Ira Weiny 
---
 fs/hostfs/hostfs_kern.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c
index c070c0d8e3e9..608efd0f83cb 100644
--- a/fs/hostfs/hostfs_kern.c
+++ b/fs/hostfs/hostfs_kern.c
@@ -409,7 +409,7 @@ static int hostfs_writepage(struct page *page, struct 
writeback_control *wbc)
if (page->index >= end_index)
count = inode->i_size & (PAGE_SIZE-1);
 
-   buffer = kmap(page);
+   buffer = kmap_thread(page);
 
err = write_file(HOSTFS_I(inode)->fd, , buffer, count);
if (err != count) {
@@ -425,7 +425,7 @@ static int hostfs_writepage(struct page *page, struct 
writeback_control *wbc)
err = 0;
 
  out:
-   kunmap(page);
+   kunmap_thread(page);
 
unlock_page(page);
return err;
@@ -437,7 +437,7 @@ static int hostfs_readpage(struct file *file, struct page 
*page)
loff_t start = page_offset(page);
int bytes_read, ret = 0;
 
-   buffer = kmap(page);
+   buffer = kmap_thread(page);
bytes_read = read_file(FILE_HOSTFS_I(file)->fd, , buffer,
PAGE_SIZE);
if (bytes_read < 0) {
@@ -454,7 +454,7 @@ static int hostfs_readpage(struct file *file, struct page 
*page)
 
  out:
flush_dcache_page(page);
-   kunmap(page);
+   kunmap_thread(page);
unlock_page(page);
return ret;
 }
@@ -480,9 +480,9 @@ static int hostfs_write_end(struct file *file, struct 
address_space *mapping,
unsigned from = pos & (PAGE_SIZE - 1);
int err;
 
-   buffer = kmap(page);
+   buffer = kmap_thread(page);
err = write_file(FILE_HOSTFS_I(file)->fd, , buffer + from, copied);
-   kunmap(page);
+   kunmap_thread(page);
 
if (!PageUptodate(page) && err == PAGE_SIZE)
SetPageUptodate(page);
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 29/58] fs/ntfs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Anton Altaparmakov 
Signed-off-by: Ira Weiny 
---
 fs/ntfs/aops.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c
index bb0a43860ad2..11633d732809 100644
--- a/fs/ntfs/aops.c
+++ b/fs/ntfs/aops.c
@@ -1099,7 +1099,7 @@ static int ntfs_write_mst_block(struct page *page,
if (!nr_bhs)
goto done;
/* Map the page so we can access its contents. */
-   kaddr = kmap(page);
+   kaddr = kmap_thread(page);
/* Clear the page uptodate flag whilst the mst fixups are applied. */
BUG_ON(!PageUptodate(page));
ClearPageUptodate(page);
@@ -1276,7 +1276,7 @@ static int ntfs_write_mst_block(struct page *page,
iput(VFS_I(base_tni));
}
SetPageUptodate(page);
-   kunmap(page);
+   kunmap_thread(page);
 done:
if (unlikely(err && err != -ENOMEM)) {
/*
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 30/58] fs/romfs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Signed-off-by: Ira Weiny 
---
 fs/romfs/super.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/romfs/super.c b/fs/romfs/super.c
index e582d001f792..9050074c6755 100644
--- a/fs/romfs/super.c
+++ b/fs/romfs/super.c
@@ -107,7 +107,7 @@ static int romfs_readpage(struct file *file, struct page 
*page)
void *buf;
int ret;
 
-   buf = kmap(page);
+   buf = kmap_thread(page);
if (!buf)
return -ENOMEM;
 
@@ -136,7 +136,7 @@ static int romfs_readpage(struct file *file, struct page 
*page)
SetPageUptodate(page);
 
flush_dcache_page(page);
-   kunmap(page);
+   kunmap_thread(page);
unlock_page(page);
return ret;
 }
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 34/58] fs/erofs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Gao Xiang 
Cc: Chao Yu 
Signed-off-by: Ira Weiny 
---
 fs/erofs/super.c | 4 ++--
 fs/erofs/xattr.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/fs/erofs/super.c b/fs/erofs/super.c
index ddaa516c008a..41696b60f1b3 100644
--- a/fs/erofs/super.c
+++ b/fs/erofs/super.c
@@ -139,7 +139,7 @@ static int erofs_read_superblock(struct super_block *sb)
 
sbi = EROFS_SB(sb);
 
-   data = kmap(page);
+   data = kmap_thread(page);
dsb = (struct erofs_super_block *)(data + EROFS_SUPER_OFFSET);
 
ret = -EINVAL;
@@ -189,7 +189,7 @@ static int erofs_read_superblock(struct super_block *sb)
}
ret = 0;
 out:
-   kunmap(page);
+   kunmap_thread(page);
put_page(page);
return ret;
 }
diff --git a/fs/erofs/xattr.c b/fs/erofs/xattr.c
index c8c381eadcd6..1771baa99d77 100644
--- a/fs/erofs/xattr.c
+++ b/fs/erofs/xattr.c
@@ -20,7 +20,7 @@ static inline void xattr_iter_end(struct xattr_iter *it, bool 
atomic)
 {
/* the only user of kunmap() is 'init_inode_xattrs' */
if (!atomic)
-   kunmap(it->page);
+   kunmap_thread(it->page);
else
kunmap_atomic(it->kaddr);
 
@@ -96,7 +96,7 @@ static int init_inode_xattrs(struct inode *inode)
}
 
/* read in shared xattr array (non-atomic, see kmalloc below) */
-   it.kaddr = kmap(it.page);
+   it.kaddr = kmap_thread(it.page);
atomic_map = false;
 
ih = (struct erofs_xattr_ibody_header *)(it.kaddr + it.ofs);
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 31/58] fs/vboxsf: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Hans de Goede 
Signed-off-by: Ira Weiny 
---
 fs/vboxsf/file.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/fs/vboxsf/file.c b/fs/vboxsf/file.c
index c4ab5996d97a..d9c7e6b7b4cc 100644
--- a/fs/vboxsf/file.c
+++ b/fs/vboxsf/file.c
@@ -216,7 +216,7 @@ static int vboxsf_readpage(struct file *file, struct page 
*page)
u8 *buf;
int err;
 
-   buf = kmap(page);
+   buf = kmap_thread(page);
 
err = vboxsf_read(sf_handle->root, sf_handle->handle, off, , buf);
if (err == 0) {
@@ -227,7 +227,7 @@ static int vboxsf_readpage(struct file *file, struct page 
*page)
SetPageError(page);
}
 
-   kunmap(page);
+   kunmap_thread(page);
unlock_page(page);
return err;
 }
@@ -268,10 +268,10 @@ static int vboxsf_writepage(struct page *page, struct 
writeback_control *wbc)
if (!sf_handle)
return -EBADF;
 
-   buf = kmap(page);
+   buf = kmap_thread(page);
err = vboxsf_write(sf_handle->root, sf_handle->handle,
   off, , buf);
-   kunmap(page);
+   kunmap_thread(page);
 
kref_put(_handle->refcount, vboxsf_handle_release);
 
@@ -302,10 +302,10 @@ static int vboxsf_write_end(struct file *file, struct 
address_space *mapping,
if (!PageUptodate(page) && copied < len)
zero_user(page, from + copied, len - copied);
 
-   buf = kmap(page);
+   buf = kmap_thread(page);
err = vboxsf_write(sf_handle->root, sf_handle->handle,
   pos, , buf + from);
-   kunmap(page);
+   kunmap_thread(page);
 
if (err) {
nwritten = 0;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 35/58] fs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls are localized to a single thread.  To avoid the over
head of global PKRS updates use the new kmap_thread() call.

Cc: Alexander Viro 
Cc: Jens Axboe 
Signed-off-by: Ira Weiny 
---
 fs/aio.c  |  4 ++--
 fs/binfmt_elf.c   |  4 ++--
 fs/binfmt_elf_fdpic.c |  4 ++--
 fs/exec.c | 10 +-
 fs/io_uring.c |  4 ++--
 fs/splice.c   |  4 ++--
 6 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/fs/aio.c b/fs/aio.c
index d5ec30385566..27f95996d25f 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1223,10 +1223,10 @@ static long aio_read_events_ring(struct kioctx *ctx,
avail = min(avail, nr - ret);
avail = min_t(long, avail, AIO_EVENTS_PER_PAGE - pos);
 
-   ev = kmap(page);
+   ev = kmap_thread(page);
copy_ret = copy_to_user(event + ret, ev + pos,
sizeof(*ev) * avail);
-   kunmap(page);
+   kunmap_thread(page);
 
if (unlikely(copy_ret)) {
ret = -EFAULT;
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index 13d053982dd7..1a332ef1ae03 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -2430,9 +2430,9 @@ static int elf_core_dump(struct coredump_params *cprm)
 
page = get_dump_page(addr);
if (page) {
-   void *kaddr = kmap(page);
+   void *kaddr = kmap_thread(page);
stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
-   kunmap(page);
+   kunmap_thread(page);
put_page(page);
} else
stop = !dump_skip(cprm, PAGE_SIZE);
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c
index 50f845702b92..8fbe188e0fdd 100644
--- a/fs/binfmt_elf_fdpic.c
+++ b/fs/binfmt_elf_fdpic.c
@@ -1542,9 +1542,9 @@ static bool elf_fdpic_dump_segments(struct 
coredump_params *cprm)
bool res;
struct page *page = get_dump_page(addr);
if (page) {
-   void *kaddr = kmap(page);
+   void *kaddr = kmap_thread(page);
res = dump_emit(cprm, kaddr, PAGE_SIZE);
-   kunmap(page);
+   kunmap_thread(page);
put_page(page);
} else {
res = dump_skip(cprm, PAGE_SIZE);
diff --git a/fs/exec.c b/fs/exec.c
index a91003e28eaa..3948b8511e3a 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -575,11 +575,11 @@ static int copy_strings(int argc, struct user_arg_ptr 
argv,
 
if (kmapped_page) {
flush_kernel_dcache_page(kmapped_page);
-   kunmap(kmapped_page);
+   kunmap_thread(kmapped_page);
put_arg_page(kmapped_page);
}
kmapped_page = page;
-   kaddr = kmap(kmapped_page);
+   kaddr = kmap_thread(kmapped_page);
kpos = pos & PAGE_MASK;
flush_arg_page(bprm, kpos, kmapped_page);
}
@@ -593,7 +593,7 @@ static int copy_strings(int argc, struct user_arg_ptr argv,
 out:
if (kmapped_page) {
flush_kernel_dcache_page(kmapped_page);
-   kunmap(kmapped_page);
+   kunmap_thread(kmapped_page);
put_arg_page(kmapped_page);
}
return ret;
@@ -871,11 +871,11 @@ int transfer_args_to_stack(struct linux_binprm *bprm,
 
for (index = MAX_ARG_PAGES - 1; index >= stop; index--) {
unsigned int offset = index == stop ? bprm->p & ~PAGE_MASK : 0;
-   char *src = kmap(bprm->page[index]) + offset;
+   char *src = kmap_thread(bprm->page[index]) + offset;
sp -= PAGE_SIZE - offset;
if (copy_to_user((void *) sp, src, PAGE_SIZE - offset) != 0)
ret = -EFAULT;
-   kunmap(bprm->page[index]);
+   kunmap_thread(bprm->page[index]);
if (ret)
goto out;
}
diff --git a/fs/io_uring.c b/fs/io_uring.c
index aae0ef2ec34d..f59bb079822d 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -2903,7 +2903,7 @@ static ssize_t loop_rw_iter(int rw, struct file *file, 
struct kiocb *kiocb,
iovec = iov_iter_iovec(iter);
} else {
/* fixed buffers import bvec */
-   iovec.iov_base = 

[PATCH RFC PKS/PMEM 28/58] fs/cachefiles: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: David Howells 
Signed-off-by: Ira Weiny 
---
 fs/cachefiles/rdwr.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/cachefiles/rdwr.c b/fs/cachefiles/rdwr.c
index 3080cda9e824..2468e5c067ba 100644
--- a/fs/cachefiles/rdwr.c
+++ b/fs/cachefiles/rdwr.c
@@ -936,9 +936,9 @@ int cachefiles_write_page(struct fscache_storage *op, 
struct page *page)
}
}
 
-   data = kmap(page);
+   data = kmap_thread(page);
ret = kernel_write(file, data, len, );
-   kunmap(page);
+   kunmap_thread(page);
fput(file);
if (ret != len)
goto error_eio;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 23/58] fs/fuse: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Miklos Szeredi 
Signed-off-by: Ira Weiny 
---
 fs/fuse/readdir.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/fuse/readdir.c b/fs/fuse/readdir.c
index 90e3f01bd796..953ffe6f56e3 100644
--- a/fs/fuse/readdir.c
+++ b/fs/fuse/readdir.c
@@ -536,9 +536,9 @@ static int fuse_readdir_cached(struct file *file, struct 
dir_context *ctx)
 * Contents of the page are now protected against changing by holding
 * the page lock.
 */
-   addr = kmap(page);
+   addr = kmap_thread(page);
res = fuse_parse_cache(ff, addr, size, ctx);
-   kunmap(page);
+   kunmap_thread(page);
unlock_page(page);
put_page(page);
 
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 14/58] fs/cifs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Steve French 
Signed-off-by: Ira Weiny 
---
 fs/cifs/cifsencrypt.c |  6 +++---
 fs/cifs/file.c| 16 
 fs/cifs/smb2ops.c |  8 
 3 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
index 9daa256f69d4..2f8232d01a56 100644
--- a/fs/cifs/cifsencrypt.c
+++ b/fs/cifs/cifsencrypt.c
@@ -82,17 +82,17 @@ int __cifs_calc_signature(struct smb_rqst *rqst,
 
rqst_page_get_length(rqst, i, , );
 
-   kaddr = (char *) kmap(rqst->rq_pages[i]) + offset;
+   kaddr = (char *) kmap_thread(rqst->rq_pages[i]) + offset;
 
rc = crypto_shash_update(shash, kaddr, len);
if (rc) {
cifs_dbg(VFS, "%s: Could not update with payload\n",
 __func__);
-   kunmap(rqst->rq_pages[i]);
+   kunmap_thread(rqst->rq_pages[i]);
return rc;
}
 
-   kunmap(rqst->rq_pages[i]);
+   kunmap_thread(rqst->rq_pages[i]);
}
 
rc = crypto_shash_final(shash, signature);
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index be46fab4c96d..6db2caab8852 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -2145,17 +2145,17 @@ static int cifs_partialpagewrite(struct page *page, 
unsigned from, unsigned to)
inode = page->mapping->host;
 
offset += (loff_t)from;
-   write_data = kmap(page);
+   write_data = kmap_thread(page);
write_data += from;
 
if ((to > PAGE_SIZE) || (from > to)) {
-   kunmap(page);
+   kunmap_thread(page);
return -EIO;
}
 
/* racing with truncate? */
if (offset > mapping->host->i_size) {
-   kunmap(page);
+   kunmap_thread(page);
return 0; /* don't care */
}
 
@@ -2183,7 +2183,7 @@ static int cifs_partialpagewrite(struct page *page, 
unsigned from, unsigned to)
rc = -EIO;
}
 
-   kunmap(page);
+   kunmap_thread(page);
return rc;
 }
 
@@ -2559,10 +2559,10 @@ static int cifs_write_end(struct file *file, struct 
address_space *mapping,
   known which we might as well leverage */
/* BB check if anything else missing out of ppw
   such as updating last write time */
-   page_data = kmap(page);
+   page_data = kmap_thread(page);
rc = cifs_write(cfile, pid, page_data + offset, copied, );
/* if (rc < 0) should we set writebehind rc? */
-   kunmap(page);
+   kunmap_thread(page);
 
free_xid(xid);
} else {
@@ -4511,7 +4511,7 @@ static int cifs_readpage_worker(struct file *file, struct 
page *page,
if (rc == 0)
goto read_complete;
 
-   read_data = kmap(page);
+   read_data = kmap_thread(page);
/* for reads over a certain size could initiate async read ahead */
 
rc = cifs_read(file, read_data, PAGE_SIZE, poffset);
@@ -4540,7 +4540,7 @@ static int cifs_readpage_worker(struct file *file, struct 
page *page,
rc = 0;
 
 io_error:
-   kunmap(page);
+   kunmap_thread(page);
unlock_page(page);
 
 read_complete:
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index 32f90dc82c84..a3e7ebab38b6 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -4068,12 +4068,12 @@ smb3_init_transform_rq(struct TCP_Server_Info *server, 
int num_rqst,
 
rqst_page_get_length(_rq[i], j, , );
 
-   dst = (char *) kmap(new_rq[i].rq_pages[j]) + offset;
-   src = (char *) kmap(old_rq[i - 1].rq_pages[j]) + offset;
+   dst = (char *) kmap_thread(new_rq[i].rq_pages[j]) + 
offset;
+   src = (char *) kmap_thread(old_rq[i - 1].rq_pages[j]) + 
offset;
 
memcpy(dst, src, len);
-   kunmap(new_rq[i].rq_pages[j]);
-   kunmap(old_rq[i - 1].rq_pages[j]);
+   kunmap_thread(new_rq[i].rq_pages[j]);
+   kunmap_thread(old_rq[i - 1].rq_pages[j]);
}
}
 
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 27/58] fs/ubifs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Richard Weinberger 
Signed-off-by: Ira Weiny 
---
 fs/ubifs/file.c | 16 
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c
index b77d1637bbbc..a3537447a885 100644
--- a/fs/ubifs/file.c
+++ b/fs/ubifs/file.c
@@ -111,7 +111,7 @@ static int do_readpage(struct page *page)
ubifs_assert(c, !PageChecked(page));
ubifs_assert(c, !PagePrivate(page));
 
-   addr = kmap(page);
+   addr = kmap_thread(page);
 
block = page->index << UBIFS_BLOCKS_PER_PAGE_SHIFT;
beyond = (i_size + UBIFS_BLOCK_SIZE - 1) >> UBIFS_BLOCK_SHIFT;
@@ -174,7 +174,7 @@ static int do_readpage(struct page *page)
SetPageUptodate(page);
ClearPageError(page);
flush_dcache_page(page);
-   kunmap(page);
+   kunmap_thread(page);
return 0;
 
 error:
@@ -182,7 +182,7 @@ static int do_readpage(struct page *page)
ClearPageUptodate(page);
SetPageError(page);
flush_dcache_page(page);
-   kunmap(page);
+   kunmap_thread(page);
return err;
 }
 
@@ -616,7 +616,7 @@ static int populate_page(struct ubifs_info *c, struct page 
*page,
dbg_gen("ino %lu, pg %lu, i_size %lld, flags %#lx",
inode->i_ino, page->index, i_size, page->flags);
 
-   addr = zaddr = kmap(page);
+   addr = zaddr = kmap_thread(page);
 
end_index = (i_size - 1) >> PAGE_SHIFT;
if (!i_size || page->index > end_index) {
@@ -692,7 +692,7 @@ static int populate_page(struct ubifs_info *c, struct page 
*page,
SetPageUptodate(page);
ClearPageError(page);
flush_dcache_page(page);
-   kunmap(page);
+   kunmap_thread(page);
*n = nn;
return 0;
 
@@ -700,7 +700,7 @@ static int populate_page(struct ubifs_info *c, struct page 
*page,
ClearPageUptodate(page);
SetPageError(page);
flush_dcache_page(page);
-   kunmap(page);
+   kunmap_thread(page);
ubifs_err(c, "bad data node (block %u, inode %lu)",
  page_block, inode->i_ino);
return -EINVAL;
@@ -918,7 +918,7 @@ static int do_writepage(struct page *page, int len)
/* Update radix tree tags */
set_page_writeback(page);
 
-   addr = kmap(page);
+   addr = kmap_thread(page);
block = page->index << UBIFS_BLOCKS_PER_PAGE_SHIFT;
i = 0;
while (len) {
@@ -950,7 +950,7 @@ static int do_writepage(struct page *page, int len)
ClearPagePrivate(page);
ClearPageChecked(page);
 
-   kunmap(page);
+   kunmap_thread(page);
unlock_page(page);
end_page_writeback(page);
return err;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 24/58] fs/freevxfs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Christoph Hellwig 
Signed-off-by: Ira Weiny 
---
 fs/freevxfs/vxfs_immed.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/freevxfs/vxfs_immed.c b/fs/freevxfs/vxfs_immed.c
index bfc780c682fb..9c42fec4cd85 100644
--- a/fs/freevxfs/vxfs_immed.c
+++ b/fs/freevxfs/vxfs_immed.c
@@ -69,9 +69,9 @@ vxfs_immed_readpage(struct file *fp, struct page *pp)
u_int64_t   offset = (u_int64_t)pp->index << PAGE_SHIFT;
caddr_t kaddr;
 
-   kaddr = kmap(pp);
+   kaddr = kmap_thread(pp);
memcpy(kaddr, vip->vii_immed.vi_immed + offset, PAGE_SIZE);
-   kunmap(pp);
+   kunmap_thread(pp);

flush_dcache_page(pp);
SetPageUptodate(pp);
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 19/58] fs/hfsplus: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Signed-off-by: Ira Weiny 
---
 fs/hfsplus/bitmap.c |  20 -
 fs/hfsplus/bnode.c  | 102 ++--
 fs/hfsplus/btree.c  |  18 
 3 files changed, 70 insertions(+), 70 deletions(-)

diff --git a/fs/hfsplus/bitmap.c b/fs/hfsplus/bitmap.c
index cebce0cfe340..9ec7c1559a0c 100644
--- a/fs/hfsplus/bitmap.c
+++ b/fs/hfsplus/bitmap.c
@@ -39,7 +39,7 @@ int hfsplus_block_allocate(struct super_block *sb, u32 size,
start = size;
goto out;
}
-   pptr = kmap(page);
+   pptr = kmap_thread(page);
curr = pptr + (offset & (PAGE_CACHE_BITS - 1)) / 32;
i = offset % 32;
offset &= ~(PAGE_CACHE_BITS - 1);
@@ -74,7 +74,7 @@ int hfsplus_block_allocate(struct super_block *sb, u32 size,
}
curr++;
}
-   kunmap(page);
+   kunmap_thread(page);
offset += PAGE_CACHE_BITS;
if (offset >= size)
break;
@@ -84,7 +84,7 @@ int hfsplus_block_allocate(struct super_block *sb, u32 size,
start = size;
goto out;
}
-   curr = pptr = kmap(page);
+   curr = pptr = kmap_thread(page);
if ((size ^ offset) / PAGE_CACHE_BITS)
end = pptr + PAGE_CACHE_BITS / 32;
else
@@ -127,7 +127,7 @@ int hfsplus_block_allocate(struct super_block *sb, u32 size,
len -= 32;
}
set_page_dirty(page);
-   kunmap(page);
+   kunmap_thread(page);
offset += PAGE_CACHE_BITS;
page = read_mapping_page(mapping, offset / PAGE_CACHE_BITS,
 NULL);
@@ -135,7 +135,7 @@ int hfsplus_block_allocate(struct super_block *sb, u32 size,
start = size;
goto out;
}
-   pptr = kmap(page);
+   pptr = kmap_thread(page);
curr = pptr;
end = pptr + PAGE_CACHE_BITS / 32;
}
@@ -151,7 +151,7 @@ int hfsplus_block_allocate(struct super_block *sb, u32 size,
 done:
*curr = cpu_to_be32(n);
set_page_dirty(page);
-   kunmap(page);
+   kunmap_thread(page);
*max = offset + (curr - pptr) * 32 + i - start;
sbi->free_blocks -= *max;
hfsplus_mark_mdb_dirty(sb);
@@ -185,7 +185,7 @@ int hfsplus_block_free(struct super_block *sb, u32 offset, 
u32 count)
page = read_mapping_page(mapping, pnr, NULL);
if (IS_ERR(page))
goto kaboom;
-   pptr = kmap(page);
+   pptr = kmap_thread(page);
curr = pptr + (offset & (PAGE_CACHE_BITS - 1)) / 32;
end = pptr + PAGE_CACHE_BITS / 32;
len = count;
@@ -215,11 +215,11 @@ int hfsplus_block_free(struct super_block *sb, u32 
offset, u32 count)
if (!count)
break;
set_page_dirty(page);
-   kunmap(page);
+   kunmap_thread(page);
page = read_mapping_page(mapping, ++pnr, NULL);
if (IS_ERR(page))
goto kaboom;
-   pptr = kmap(page);
+   pptr = kmap_thread(page);
curr = pptr;
end = pptr + PAGE_CACHE_BITS / 32;
}
@@ -231,7 +231,7 @@ int hfsplus_block_free(struct super_block *sb, u32 offset, 
u32 count)
}
 out:
set_page_dirty(page);
-   kunmap(page);
+   kunmap_thread(page);
sbi->free_blocks += len;
hfsplus_mark_mdb_dirty(sb);
mutex_unlock(>alloc_mutex);
diff --git a/fs/hfsplus/bnode.c b/fs/hfsplus/bnode.c
index 177fae4e6581..62757d92fbbd 100644
--- a/fs/hfsplus/bnode.c
+++ b/fs/hfsplus/bnode.c
@@ -29,14 +29,14 @@ void hfs_bnode_read(struct hfs_bnode *node, void *buf, int 
off, int len)
off &= ~PAGE_MASK;
 
l = min_t(int, len, PAGE_SIZE - off);
-   memcpy(buf, kmap(*pagep) + off, l);
-   kunmap(*pagep);
+   memcpy(buf, kmap_thread(*pagep) + off, l);
+   kunmap_thread(*pagep);
 
while ((len -= l) != 0) {
buf += l;
l = min_t(int, len, PAGE_SIZE);
-   memcpy(buf, kmap(*++pagep), l);
-   kunmap(*pagep);
+   memcpy(buf, kmap_thread(*++pagep), l);
+   kunmap_thread(*pagep);
}
 }
 
@@ -82,16 +82,16 @@ void hfs_bnode_write(struct hfs_bnode *node, void *buf, int 
off, int len)
off &= ~PAGE_MASK;
 
l = min_t(int, len, PAGE_SIZE - off);
-   memcpy(kmap(*pagep) + off, buf, l);
+   memcpy(kmap_thread(*pagep) + off, buf, l);
set_page_dirty(*pagep);
-   kunmap(*pagep);
+   

[PATCH RFC PKS/PMEM 26/58] fs/zonefs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Damien Le Moal 
Cc: Naohiro Aota 
Signed-off-by: Ira Weiny 
---
 fs/zonefs/super.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
index 8ec7c8f109d7..2fd6c86beee1 100644
--- a/fs/zonefs/super.c
+++ b/fs/zonefs/super.c
@@ -1297,7 +1297,7 @@ static int zonefs_read_super(struct super_block *sb)
if (ret)
goto free_page;
 
-   super = kmap(page);
+   super = kmap_thread(page);
 
ret = -EINVAL;
if (le32_to_cpu(super->s_magic) != ZONEFS_MAGIC)
@@ -1349,7 +1349,7 @@ static int zonefs_read_super(struct super_block *sb)
ret = 0;
 
 unmap:
-   kunmap(page);
+   kunmap_thread(page);
 free_page:
__free_page(page);
 
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 17/58] fs/nilfs2: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Ryusuke Konishi 
Signed-off-by: Ira Weiny 
---
 fs/nilfs2/alloc.c  | 34 +-
 fs/nilfs2/cpfile.c |  4 ++--
 2 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/fs/nilfs2/alloc.c b/fs/nilfs2/alloc.c
index adf3bb0a8048..2aa4c34094ef 100644
--- a/fs/nilfs2/alloc.c
+++ b/fs/nilfs2/alloc.c
@@ -524,7 +524,7 @@ int nilfs_palloc_prepare_alloc_entry(struct inode *inode,
ret = nilfs_palloc_get_desc_block(inode, group, 1, _bh);
if (ret < 0)
return ret;
-   desc_kaddr = kmap(desc_bh->b_page);
+   desc_kaddr = kmap_thread(desc_bh->b_page);
desc = nilfs_palloc_block_get_group_desc(
inode, group, desc_bh, desc_kaddr);
n = nilfs_palloc_rest_groups_in_desc_block(inode, group,
@@ -536,7 +536,7 @@ int nilfs_palloc_prepare_alloc_entry(struct inode *inode,
inode, group, 1, _bh);
if (ret < 0)
goto out_desc;
-   bitmap_kaddr = kmap(bitmap_bh->b_page);
+   bitmap_kaddr = kmap_thread(bitmap_bh->b_page);
bitmap = bitmap_kaddr + bh_offset(bitmap_bh);
pos = nilfs_palloc_find_available_slot(
bitmap, group_offset,
@@ -547,21 +547,21 @@ int nilfs_palloc_prepare_alloc_entry(struct inode *inode,
desc, lock, -1);
req->pr_entry_nr =
entries_per_group * group + pos;
-   kunmap(desc_bh->b_page);
-   kunmap(bitmap_bh->b_page);
+   kunmap_thread(desc_bh->b_page);
+   kunmap_thread(bitmap_bh->b_page);
 
req->pr_desc_bh = desc_bh;
req->pr_bitmap_bh = bitmap_bh;
return 0;
}
-   kunmap(bitmap_bh->b_page);
+   kunmap_thread(bitmap_bh->b_page);
brelse(bitmap_bh);
}
 
group_offset = 0;
}
 
-   kunmap(desc_bh->b_page);
+   kunmap_thread(desc_bh->b_page);
brelse(desc_bh);
}
 
@@ -569,7 +569,7 @@ int nilfs_palloc_prepare_alloc_entry(struct inode *inode,
return -ENOSPC;
 
  out_desc:
-   kunmap(desc_bh->b_page);
+   kunmap_thread(desc_bh->b_page);
brelse(desc_bh);
return ret;
 }
@@ -605,10 +605,10 @@ void nilfs_palloc_commit_free_entry(struct inode *inode,
spinlock_t *lock;
 
group = nilfs_palloc_group(inode, req->pr_entry_nr, _offset);
-   desc_kaddr = kmap(req->pr_desc_bh->b_page);
+   desc_kaddr = kmap_thread(req->pr_desc_bh->b_page);
desc = nilfs_palloc_block_get_group_desc(inode, group,
 req->pr_desc_bh, desc_kaddr);
-   bitmap_kaddr = kmap(req->pr_bitmap_bh->b_page);
+   bitmap_kaddr = kmap_thread(req->pr_bitmap_bh->b_page);
bitmap = bitmap_kaddr + bh_offset(req->pr_bitmap_bh);
lock = nilfs_mdt_bgl_lock(inode, group);
 
@@ -620,8 +620,8 @@ void nilfs_palloc_commit_free_entry(struct inode *inode,
else
nilfs_palloc_group_desc_add_entries(desc, lock, 1);
 
-   kunmap(req->pr_bitmap_bh->b_page);
-   kunmap(req->pr_desc_bh->b_page);
+   kunmap_thread(req->pr_bitmap_bh->b_page);
+   kunmap_thread(req->pr_desc_bh->b_page);
 
mark_buffer_dirty(req->pr_desc_bh);
mark_buffer_dirty(req->pr_bitmap_bh);
@@ -646,10 +646,10 @@ void nilfs_palloc_abort_alloc_entry(struct inode *inode,
spinlock_t *lock;
 
group = nilfs_palloc_group(inode, req->pr_entry_nr, _offset);
-   desc_kaddr = kmap(req->pr_desc_bh->b_page);
+   desc_kaddr = kmap_thread(req->pr_desc_bh->b_page);
desc = nilfs_palloc_block_get_group_desc(inode, group,
 req->pr_desc_bh, desc_kaddr);
-   bitmap_kaddr = kmap(req->pr_bitmap_bh->b_page);
+   bitmap_kaddr = kmap_thread(req->pr_bitmap_bh->b_page);
bitmap = bitmap_kaddr + bh_offset(req->pr_bitmap_bh);
lock = nilfs_mdt_bgl_lock(inode, group);
 
@@ -661,8 +661,8 @@ void nilfs_palloc_abort_alloc_entry(struct inode *inode,
else
nilfs_palloc_group_desc_add_entries(desc, lock, 1);
 
-   

[PATCH RFC PKS/PMEM 18/58] fs/hfs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Signed-off-by: Ira Weiny 
---
 fs/hfs/bnode.c | 14 +++---
 fs/hfs/btree.c | 20 ++--
 2 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/fs/hfs/bnode.c b/fs/hfs/bnode.c
index b63a4df7327b..8b4d02576405 100644
--- a/fs/hfs/bnode.c
+++ b/fs/hfs/bnode.c
@@ -23,8 +23,8 @@ void hfs_bnode_read(struct hfs_bnode *node, void *buf,
off += node->page_offset;
page = node->page[0];
 
-   memcpy(buf, kmap(page) + off, len);
-   kunmap(page);
+   memcpy(buf, kmap_thread(page) + off, len);
+   kunmap_thread(page);
 }
 
 u16 hfs_bnode_read_u16(struct hfs_bnode *node, int off)
@@ -108,9 +108,9 @@ void hfs_bnode_copy(struct hfs_bnode *dst_node, int dst,
src_page = src_node->page[0];
dst_page = dst_node->page[0];
 
-   memcpy(kmap(dst_page) + dst, kmap(src_page) + src, len);
-   kunmap(src_page);
-   kunmap(dst_page);
+   memcpy(kmap_thread(dst_page) + dst, kmap_thread(src_page) + src, len);
+   kunmap_thread(src_page);
+   kunmap_thread(dst_page);
set_page_dirty(dst_page);
 }
 
@@ -125,9 +125,9 @@ void hfs_bnode_move(struct hfs_bnode *node, int dst, int 
src, int len)
src += node->page_offset;
dst += node->page_offset;
page = node->page[0];
-   ptr = kmap(page);
+   ptr = kmap_thread(page);
memmove(ptr + dst, ptr + src, len);
-   kunmap(page);
+   kunmap_thread(page);
set_page_dirty(page);
 }
 
diff --git a/fs/hfs/btree.c b/fs/hfs/btree.c
index 19017d296173..bd4a6d35e361 100644
--- a/fs/hfs/btree.c
+++ b/fs/hfs/btree.c
@@ -80,7 +80,7 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 
id, btree_keycmp ke
goto free_inode;
 
/* Load the header */
-   head = (struct hfs_btree_header_rec *)(kmap(page) + sizeof(struct 
hfs_bnode_desc));
+   head = (struct hfs_btree_header_rec *)(kmap_thread(page) + 
sizeof(struct hfs_bnode_desc));
tree->root = be32_to_cpu(head->root);
tree->leaf_count = be32_to_cpu(head->leaf_count);
tree->leaf_head = be32_to_cpu(head->leaf_head);
@@ -119,7 +119,7 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, 
u32 id, btree_keycmp ke
tree->node_size_shift = ffs(size) - 1;
tree->pages_per_bnode = (tree->node_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
 
-   kunmap(page);
+   kunmap_thread(page);
put_page(page);
return tree;
 
@@ -268,7 +268,7 @@ struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree)
 
off += node->page_offset;
pagep = node->page + (off >> PAGE_SHIFT);
-   data = kmap(*pagep);
+   data = kmap_thread(*pagep);
off &= ~PAGE_MASK;
idx = 0;
 
@@ -281,7 +281,7 @@ struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree)
idx += i;
data[off] |= m;
set_page_dirty(*pagep);
-   kunmap(*pagep);
+   kunmap_thread(*pagep);
tree->free_nodes--;
mark_inode_dirty(tree->inode);
hfs_bnode_put(node);
@@ -290,14 +290,14 @@ struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree)
}
}
if (++off >= PAGE_SIZE) {
-   kunmap(*pagep);
-   data = kmap(*++pagep);
+   kunmap_thread(*pagep);
+   data = kmap_thread(*++pagep);
off = 0;
}
idx += 8;
len--;
}
-   kunmap(*pagep);
+   kunmap_thread(*pagep);
nidx = node->next;
if (!nidx) {
printk(KERN_DEBUG "create new bmap node...\n");
@@ -313,7 +313,7 @@ struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree)
off = off16;
off += node->page_offset;
pagep = node->page + (off >> PAGE_SHIFT);
-   data = kmap(*pagep);
+   data = kmap_thread(*pagep);
off &= ~PAGE_MASK;
}
 }
@@ -360,7 +360,7 @@ void hfs_bmap_free(struct hfs_bnode *node)
}
off += node->page_offset + nidx / 8;
page = node->page[off >> PAGE_SHIFT];
-   data = kmap(page);
+   data = kmap_thread(page);
off &= ~PAGE_MASK;
m = 1 << (~nidx & 7);
byte = data[off];
@@ -373,7 +373,7 @@ void hfs_bmap_free(struct hfs_bnode *node)
}

[PATCH RFC PKS/PMEM 15/58] fs/ecryptfs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Herbert Xu 
Cc: Eric Biggers 
Cc: Aditya Pakki 
Signed-off-by: Ira Weiny 
---
 fs/ecryptfs/crypto.c | 8 
 fs/ecryptfs/read_write.c | 8 
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
index 0681540c48d9..e73e00994bee 100644
--- a/fs/ecryptfs/crypto.c
+++ b/fs/ecryptfs/crypto.c
@@ -469,10 +469,10 @@ int ecryptfs_encrypt_page(struct page *page)
}
 
lower_offset = lower_offset_for_page(crypt_stat, page);
-   enc_extent_virt = kmap(enc_extent_page);
+   enc_extent_virt = kmap_thread(enc_extent_page);
rc = ecryptfs_write_lower(ecryptfs_inode, enc_extent_virt, lower_offset,
  PAGE_SIZE);
-   kunmap(enc_extent_page);
+   kunmap_thread(enc_extent_page);
if (rc < 0) {
ecryptfs_printk(KERN_ERR,
"Error attempting to write lower page; rc = [%d]\n",
@@ -518,10 +518,10 @@ int ecryptfs_decrypt_page(struct page *page)
BUG_ON(!(crypt_stat->flags & ECRYPTFS_ENCRYPTED));
 
lower_offset = lower_offset_for_page(crypt_stat, page);
-   page_virt = kmap(page);
+   page_virt = kmap_thread(page);
rc = ecryptfs_read_lower(page_virt, lower_offset, PAGE_SIZE,
 ecryptfs_inode);
-   kunmap(page);
+   kunmap_thread(page);
if (rc < 0) {
ecryptfs_printk(KERN_ERR,
"Error attempting to read lower page; rc = [%d]\n",
diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c
index 0438997ac9d8..5eca4330c0c0 100644
--- a/fs/ecryptfs/read_write.c
+++ b/fs/ecryptfs/read_write.c
@@ -64,11 +64,11 @@ int ecryptfs_write_lower_page_segment(struct inode 
*ecryptfs_inode,
 
offset = loff_t)page_for_lower->index) << PAGE_SHIFT)
  + offset_in_page);
-   virt = kmap(page_for_lower);
+   virt = kmap_thread(page_for_lower);
rc = ecryptfs_write_lower(ecryptfs_inode, virt, offset, size);
if (rc > 0)
rc = 0;
-   kunmap(page_for_lower);
+   kunmap_thread(page_for_lower);
return rc;
 }
 
@@ -251,11 +251,11 @@ int ecryptfs_read_lower_page_segment(struct page 
*page_for_ecryptfs,
int rc;
 
offset = loff_t)page_index) << PAGE_SHIFT) + offset_in_page);
-   virt = kmap(page_for_ecryptfs);
+   virt = kmap_thread(page_for_ecryptfs);
rc = ecryptfs_read_lower(virt, offset, size, ecryptfs_inode);
if (rc > 0)
rc = 0;
-   kunmap(page_for_ecryptfs);
+   kunmap_thread(page_for_ecryptfs);
flush_dcache_page(page_for_ecryptfs);
return rc;
 }
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 22/58] fs/f2fs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Jaegeuk Kim 
Cc: Chao Yu 
Signed-off-by: Ira Weiny 
---
 fs/f2fs/f2fs.h | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index d9e52a7f3702..ff72a45a577e 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -2410,12 +2410,12 @@ static inline struct page *f2fs_pagecache_get_page(
 
 static inline void f2fs_copy_page(struct page *src, struct page *dst)
 {
-   char *src_kaddr = kmap(src);
-   char *dst_kaddr = kmap(dst);
+   char *src_kaddr = kmap_thread(src);
+   char *dst_kaddr = kmap_thread(dst);
 
memcpy(dst_kaddr, src_kaddr, PAGE_SIZE);
-   kunmap(dst);
-   kunmap(src);
+   kunmap_thread(dst);
+   kunmap_thread(src);
 }
 
 static inline void f2fs_put_page(struct page *page, int unlock)
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 12/58] fs/afs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To
avoid the over head of global PKRS updates use the new kmap_thread()
call.

Cc: David Howells 
Signed-off-by: Ira Weiny 
---
 fs/afs/dir.c  | 16 
 fs/afs/dir_edit.c | 16 
 fs/afs/mntpt.c|  4 ++--
 fs/afs/write.c|  4 ++--
 4 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/fs/afs/dir.c b/fs/afs/dir.c
index 1d2e61e0ab04..5d01cdb590de 100644
--- a/fs/afs/dir.c
+++ b/fs/afs/dir.c
@@ -127,14 +127,14 @@ static bool afs_dir_check_page(struct afs_vnode *dvnode, 
struct page *page,
qty /= sizeof(union afs_xdr_dir_block);
 
/* check them */
-   dbuf = kmap(page);
+   dbuf = kmap_thread(page);
for (tmp = 0; tmp < qty; tmp++) {
if (dbuf->blocks[tmp].hdr.magic != AFS_DIR_MAGIC) {
printk("kAFS: %s(%lx): bad magic %d/%d is %04hx\n",
   __func__, dvnode->vfs_inode.i_ino, tmp, qty,
   ntohs(dbuf->blocks[tmp].hdr.magic));
trace_afs_dir_check_failed(dvnode, off, i_size);
-   kunmap(page);
+   kunmap_thread(page);
trace_afs_file_error(dvnode, -EIO, 
afs_file_error_dir_bad_magic);
goto error;
}
@@ -146,7 +146,7 @@ static bool afs_dir_check_page(struct afs_vnode *dvnode, 
struct page *page,
((u8 *)>blocks[tmp])[AFS_DIR_BLOCK_SIZE - 1] = 0;
}
 
-   kunmap(page);
+   kunmap_thread(page);
 
 checked:
afs_stat_v(dvnode, n_read_dir);
@@ -177,13 +177,13 @@ static bool afs_dir_check_pages(struct afs_vnode *dvnode, 
struct afs_read *req)
req->pos, req->index, req->nr_pages, req->offset);
 
for (i = 0; i < req->nr_pages; i++) {
-   dbuf = kmap(req->pages[i]);
+   dbuf = kmap_thread(req->pages[i]);
for (j = 0; j < qty; j++) {
union afs_xdr_dir_block *block = >blocks[j];
 
pr_warn("[%02x] %32phN\n", i * qty + j, block);
}
-   kunmap(req->pages[i]);
+   kunmap_thread(req->pages[i]);
}
return false;
 }
@@ -481,7 +481,7 @@ static int afs_dir_iterate(struct inode *dir, struct 
dir_context *ctx,
 
limit = blkoff & ~(PAGE_SIZE - 1);
 
-   dbuf = kmap(page);
+   dbuf = kmap_thread(page);
 
/* deal with the individual blocks stashed on this page */
do {
@@ -489,7 +489,7 @@ static int afs_dir_iterate(struct inode *dir, struct 
dir_context *ctx,
   sizeof(union afs_xdr_dir_block)];
ret = afs_dir_iterate_block(dvnode, ctx, dblock, 
blkoff);
if (ret != 1) {
-   kunmap(page);
+   kunmap_thread(page);
goto out;
}
 
@@ -497,7 +497,7 @@ static int afs_dir_iterate(struct inode *dir, struct 
dir_context *ctx,
 
} while (ctx->pos < dir->i_size && blkoff < limit);
 
-   kunmap(page);
+   kunmap_thread(page);
ret = 0;
}
 
diff --git a/fs/afs/dir_edit.c b/fs/afs/dir_edit.c
index b108528bf010..35ed6828e205 100644
--- a/fs/afs/dir_edit.c
+++ b/fs/afs/dir_edit.c
@@ -218,7 +218,7 @@ void afs_edit_dir_add(struct afs_vnode *vnode,
need_slots = round_up(12 + name->len + 1 + 4, AFS_DIR_DIRENT_SIZE);
need_slots /= AFS_DIR_DIRENT_SIZE;
 
-   meta_page = kmap(page0);
+   meta_page = kmap_thread(page0);
meta = _page->blocks[0];
if (i_size == 0)
goto new_directory;
@@ -247,7 +247,7 @@ void afs_edit_dir_add(struct afs_vnode *vnode,
set_page_private(page, 1);
SetPagePrivate(page);
}
-   dir_page = kmap(page);
+   dir_page = kmap_thread(page);
}
 
/* Abandon the edit if we got a callback break. */
@@ -284,7 +284,7 @@ void afs_edit_dir_add(struct afs_vnode *vnode,
 
if (page != page0) {
unlock_page(page);
-   kunmap(page);
+   kunmap_thread(page);
put_page(page);
}
}
@@ -323,7 +323,7 @@ void afs_edit_dir_add(struct afs_vnode *vnode,
afs_set_contig_bits(block, slot, need_slots);
if (page != page0) {
unlock_page(page);
-   kunmap(page);
+   kunmap_thread(page);
put_page(page);
}
 
@@ -337,7 +337,7 @@ void afs_edit_dir_add(struct afs_vnode *vnode,
 
 out_unmap:
unlock_page(page0);
-   kunmap(page0);
+   

[PATCH RFC PKS/PMEM 13/58] fs/btrfs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Chris Mason 
Cc: Josef Bacik 
Cc: David Sterba 
Signed-off-by: Ira Weiny 
---
 fs/btrfs/check-integrity.c |  4 ++--
 fs/btrfs/compression.c |  4 ++--
 fs/btrfs/inode.c   | 16 
 fs/btrfs/lzo.c | 24 
 fs/btrfs/raid56.c  | 34 +-
 fs/btrfs/reflink.c |  8 
 fs/btrfs/send.c|  4 ++--
 fs/btrfs/zlib.c| 32 
 fs/btrfs/zstd.c| 20 ++--
 9 files changed, 73 insertions(+), 73 deletions(-)

diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c
index 81a8c87a5afb..9e5a02512ab5 100644
--- a/fs/btrfs/check-integrity.c
+++ b/fs/btrfs/check-integrity.c
@@ -2706,7 +2706,7 @@ static void __btrfsic_submit_bio(struct bio *bio)
 
bio_for_each_segment(bvec, bio, iter) {
BUG_ON(bvec.bv_len != PAGE_SIZE);
-   mapped_datav[i] = kmap(bvec.bv_page);
+   mapped_datav[i] = kmap_thread(bvec.bv_page);
i++;
 
if (dev_state->state->print_mask &
@@ -2720,7 +2720,7 @@ static void __btrfsic_submit_bio(struct bio *bio)
  bio, _is_patched,
  bio->bi_opf);
bio_for_each_segment(bvec, bio, iter)
-   kunmap(bvec.bv_page);
+   kunmap_thread(bvec.bv_page);
kfree(mapped_datav);
} else if (NULL != dev_state && (bio->bi_opf & REQ_PREFLUSH)) {
if (dev_state->state->print_mask &
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 1ab56a734e70..5944fb36d68a 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -1626,7 +1626,7 @@ static void heuristic_collect_sample(struct inode *inode, 
u64 start, u64 end,
curr_sample_pos = 0;
while (index < index_end) {
page = find_get_page(inode->i_mapping, index);
-   in_data = kmap(page);
+   in_data = kmap_thread(page);
/* Handle case where the start is not aligned to PAGE_SIZE */
i = start % PAGE_SIZE;
while (i < PAGE_SIZE - SAMPLING_READ_SIZE) {
@@ -1639,7 +1639,7 @@ static void heuristic_collect_sample(struct inode *inode, 
u64 start, u64 end,
start += SAMPLING_INTERVAL;
curr_sample_pos += SAMPLING_READ_SIZE;
}
-   kunmap(page);
+   kunmap_thread(page);
put_page(page);
 
index++;
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 9570458aa847..9710a52c6c42 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -4603,7 +4603,7 @@ int btrfs_truncate_block(struct inode *inode, loff_t 
from, loff_t len,
if (offset != blocksize) {
if (!len)
len = blocksize - offset;
-   kaddr = kmap(page);
+   kaddr = kmap_thread(page);
if (front)
memset(kaddr + (block_start - page_offset(page)),
0, offset);
@@ -4611,7 +4611,7 @@ int btrfs_truncate_block(struct inode *inode, loff_t 
from, loff_t len,
memset(kaddr + (block_start - page_offset(page)) +  
offset,
0, len);
flush_dcache_page(page);
-   kunmap(page);
+   kunmap_thread(page);
}
ClearPageChecked(page);
set_page_dirty(page);
@@ -6509,9 +6509,9 @@ static noinline int uncompress_inline(struct btrfs_path 
*path,
 */
 
if (max_size + pg_offset < PAGE_SIZE) {
-   char *map = kmap(page);
+   char *map = kmap_thread(page);
memset(map + pg_offset + max_size, 0, PAGE_SIZE - max_size - 
pg_offset);
-   kunmap(page);
+   kunmap_thread(page);
}
kfree(tmp);
return ret;
@@ -6704,7 +6704,7 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode 
*inode,
goto out;
}
} else {
-   map = kmap(page);
+   map = kmap_thread(page);
read_extent_buffer(leaf, map + pg_offset, ptr,
   copy_size);
if (pg_offset + copy_size < PAGE_SIZE) {
@@ -6712,7 +6712,7 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode 
*inode,
   PAGE_SIZE - pg_offset -
   copy_size);
   

[PATCH RFC PKS/PMEM 21/58] fs/nfs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Trond Myklebust 
Cc: Anna Schumaker 
Signed-off-by: Ira Weiny 
---
 fs/nfs/dir.c | 20 ++--
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index cb52db9a0cfb..fee321acccb4 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -213,7 +213,7 @@ int nfs_readdir_make_qstr(struct qstr *string, const char 
*name, unsigned int le
 static
 int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page)
 {
-   struct nfs_cache_array *array = kmap(page);
+   struct nfs_cache_array *array = kmap_thread(page);
struct nfs_cache_array_entry *cache_entry;
int ret;
 
@@ -235,7 +235,7 @@ int nfs_readdir_add_to_array(struct nfs_entry *entry, 
struct page *page)
if (entry->eof != 0)
array->eof_index = array->size;
 out:
-   kunmap(page);
+   kunmap_thread(page);
return ret;
 }
 
@@ -347,7 +347,7 @@ int nfs_readdir_search_array(nfs_readdir_descriptor_t *desc)
struct nfs_cache_array *array;
int status;
 
-   array = kmap(desc->page);
+   array = kmap_thread(desc->page);
 
if (*desc->dir_cookie == 0)
status = nfs_readdir_search_for_pos(array, desc);
@@ -359,7 +359,7 @@ int nfs_readdir_search_array(nfs_readdir_descriptor_t *desc)
desc->current_index += array->size;
desc->page_index++;
}
-   kunmap(desc->page);
+   kunmap_thread(desc->page);
return status;
 }
 
@@ -602,10 +602,10 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t 
*desc, struct nfs_entry *en
 
 out_nopages:
if (count == 0 || (status == -EBADCOOKIE && entry->eof != 0)) {
-   array = kmap(page);
+   array = kmap_thread(page);
array->eof_index = array->size;
status = 0;
-   kunmap(page);
+   kunmap_thread(page);
}
 
put_page(scratch);
@@ -669,7 +669,7 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t 
*desc, struct page *page,
goto out;
}
 
-   array = kmap(page);
+   array = kmap_thread(page);
 
status = nfs_readdir_alloc_pages(pages, array_size);
if (status < 0)
@@ -691,7 +691,7 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t 
*desc, struct page *page,
 
nfs_readdir_free_pages(pages, array_size);
 out_release_array:
-   kunmap(page);
+   kunmap_thread(page);
nfs4_label_free(entry.label);
 out:
nfs_free_fattr(entry.fattr);
@@ -803,7 +803,7 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc)
struct nfs_cache_array *array = NULL;
struct nfs_open_dir_context *ctx = file->private_data;
 
-   array = kmap(desc->page);
+   array = kmap_thread(desc->page);
for (i = desc->cache_entry_index; i < array->size; i++) {
struct nfs_cache_array_entry *ent;
 
@@ -827,7 +827,7 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc)
if (array->eof_index >= 0)
desc->eof = true;
 
-   kunmap(desc->page);
+   kunmap_thread(desc->page);
dfprintk(DIRCACHE, "NFS: nfs_do_filldir() filling ended @ cookie %Lu; 
returning = %d\n",
(unsigned long long)*desc->dir_cookie, res);
return res;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 16/58] fs/gfs2: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Bob Peterson 
Cc: Andreas Gruenbacher 
Signed-off-by: Ira Weiny 
---
 fs/gfs2/bmap.c   | 4 ++--
 fs/gfs2/ops_fstype.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index 0f69fbd4af66..375af4528411 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -67,7 +67,7 @@ static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct 
buffer_head *dibh,
}
 
if (!PageUptodate(page)) {
-   void *kaddr = kmap(page);
+   void *kaddr = kmap_thread(page);
u64 dsize = i_size_read(inode);
  
if (dsize > gfs2_max_stuffed_size(ip))
@@ -75,7 +75,7 @@ static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct 
buffer_head *dibh,
 
memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode), dsize);
memset(kaddr + dsize, 0, PAGE_SIZE - dsize);
-   kunmap(page);
+   kunmap_thread(page);
 
SetPageUptodate(page);
}
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index 6d18d2c91add..a5d20d9b504a 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -263,9 +263,9 @@ static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t 
sector, int silent)
__free_page(page);
return -EIO;
}
-   p = kmap(page);
+   p = kmap_thread(page);
gfs2_sb_in(sdp, p);
-   kunmap(page);
+   kunmap_thread(page);
__free_page(page);
return gfs2_check_sb(sdp, silent);
 }
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 25/58] fs/reiserfs: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: Jan Kara 
Cc: "Theodore Ts'o" 
Cc: Randy Dunlap 
Cc: Alex Shi 
Signed-off-by: Ira Weiny 
---
 fs/reiserfs/journal.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
index e98f99338f8f..be8f56261e8c 100644
--- a/fs/reiserfs/journal.c
+++ b/fs/reiserfs/journal.c
@@ -4194,11 +4194,11 @@ static int do_journal_end(struct 
reiserfs_transaction_handle *th, int flags)
SB_ONDISK_JOURNAL_SIZE(sb)));
set_buffer_uptodate(tmp_bh);
page = cn->bh->b_page;
-   addr = kmap(page);
+   addr = kmap_thread(page);
memcpy(tmp_bh->b_data,
   addr + offset_in_page(cn->bh->b_data),
   cn->bh->b_size);
-   kunmap(page);
+   kunmap_thread(page);
mark_buffer_dirty(tmp_bh);
jindex++;
set_buffer_journal_dirty(cn->bh);
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 20/58] fs/jffs2: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this FS are localized to a single thread.  To avoid
the over head of global PKRS updates use the new kmap_thread() call.

Cc: David Woodhouse 
Cc: Richard Weinberger 
Signed-off-by: Ira Weiny 
---
 fs/jffs2/file.c | 4 ++--
 fs/jffs2/gc.c   | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c
index f8fb89b10227..3e6d54f9b011 100644
--- a/fs/jffs2/file.c
+++ b/fs/jffs2/file.c
@@ -88,7 +88,7 @@ static int jffs2_do_readpage_nolock (struct inode *inode, 
struct page *pg)
 
BUG_ON(!PageLocked(pg));
 
-   pg_buf = kmap(pg);
+   pg_buf = kmap_thread(pg);
/* FIXME: Can kmap fail? */
 
ret = jffs2_read_inode_range(c, f, pg_buf, pg->index << PAGE_SHIFT,
@@ -103,7 +103,7 @@ static int jffs2_do_readpage_nolock (struct inode *inode, 
struct page *pg)
}
 
flush_dcache_page(pg);
-   kunmap(pg);
+   kunmap_thread(pg);
 
jffs2_dbg(2, "readpage finished\n");
return ret;
diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c
index 373b3b7c9f44..a7259783ab84 100644
--- a/fs/jffs2/gc.c
+++ b/fs/jffs2/gc.c
@@ -1335,7 +1335,7 @@ static int jffs2_garbage_collect_dnode(struct 
jffs2_sb_info *c, struct jffs2_era
return PTR_ERR(page);
}
 
-   pg_ptr = kmap(page);
+   pg_ptr = kmap_thread(page);
mutex_lock(>sem);
 
offset = start;
@@ -1400,7 +1400,7 @@ static int jffs2_garbage_collect_dnode(struct 
jffs2_sb_info *c, struct jffs2_era
}
}
 
-   kunmap(page);
+   kunmap_thread(page);
put_page(page);
return ret;
 }
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 11/58] drivers/net: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in these drivers are localized to a single thread.  To
avoid the over head of global PKRS updates use the new kmap_thread()
call.

Cc: "David S. Miller" 
Cc: Jakub Kicinski 
Cc: Jesse Brandeburg 
Signed-off-by: Ira Weiny 
---
 drivers/net/ethernet/intel/igb/igb_ethtool.c | 4 ++--
 drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c 
b/drivers/net/ethernet/intel/igb/igb_ethtool.c
index 6e8231c1ddf0..ac9189752012 100644
--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
@@ -1794,14 +1794,14 @@ static int igb_check_lbtest_frame(struct igb_rx_buffer 
*rx_buffer,
 
frame_size >>= 1;
 
-   data = kmap(rx_buffer->page);
+   data = kmap_thread(rx_buffer->page);
 
if (data[3] != 0xFF ||
data[frame_size + 10] != 0xBE ||
data[frame_size + 12] != 0xAF)
match = false;
 
-   kunmap(rx_buffer->page);
+   kunmap_thread(rx_buffer->page);
 
return match;
 }
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
index 71ec908266a6..7d469425f8b4 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
@@ -1963,14 +1963,14 @@ static bool ixgbe_check_lbtest_frame(struct 
ixgbe_rx_buffer *rx_buffer,
 
frame_size >>= 1;
 
-   data = kmap(rx_buffer->page) + rx_buffer->page_offset;
+   data = kmap_thread(rx_buffer->page) + rx_buffer->page_offset;
 
if (data[3] != 0xFF ||
data[frame_size + 10] != 0xBE ||
data[frame_size + 12] != 0xAF)
match = false;
 
-   kunmap(rx_buffer->page);
+   kunmap_thread(rx_buffer->page);
 
return match;
 }
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 06/58] kmap: Introduce k[un]map_thread debugging

2020-10-09 Thread ira . weiny
From: Ira Weiny 

Most kmap() callers use the map within a single thread and have no need
for the protection domain to be enabled globally.

To differentiate these kmap users, new k[un]map_thread() calls were
introduced which are thread local.

To aid in debugging the new use of kmap_thread(), add a reference count,
a check on that count, and tracing to ID where mapping errors occur.

Cc: Juri Lelli 
Cc: Vincent Guittot 
Cc: Dietmar Eggemann 
Cc: Steven Rostedt 
Cc: Ben Segall 
Cc: Mel Gorman 
Signed-off-by: Ira Weiny 
---
 include/linux/highmem.h|  5 +++
 include/linux/sched.h  |  5 +++
 include/trace/events/kmap_thread.h | 56 ++
 init/init_task.c   |  3 ++
 kernel/fork.c  | 15 
 lib/Kconfig.debug  |  8 +
 mm/debug.c | 23 
 7 files changed, 115 insertions(+)
 create mode 100644 include/trace/events/kmap_thread.h

diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index ef7813544719..22d1c000802e 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -247,6 +247,10 @@ static inline void kunmap(struct page *page)
__kunmap(page, true);
 }
 
+#ifdef CONFIG_DEBUG_KMAP_THREAD
+void *kmap_thread(struct page *page);
+void kunmap_thread(struct page *page);
+#else
 static inline void *kmap_thread(struct page *page)
 {
return __kmap(page, false);
@@ -255,6 +259,7 @@ static inline void kunmap_thread(struct page *page)
 {
__kunmap(page, false);
 }
+#endif
 
 /*
  * Prevent people trying to call kunmap_atomic() as if it were kunmap()
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 25d97ab6c757..4627ea4a49e6 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1318,6 +1318,11 @@ struct task_struct {
 #ifdef CONFIG_ZONE_DEVICE_ACCESS_PROTECTION
unsigned intdev_page_access_ref;
 #endif
+
+#ifdef CONFIG_DEBUG_KMAP_THREAD
+   unsigned intkmap_thread_cnt;
+#endif
+
/*
 * New fields for task_struct should be added above here, so that
 * they are included in the randomized portion of task_struct.
diff --git a/include/trace/events/kmap_thread.h 
b/include/trace/events/kmap_thread.h
new file mode 100644
index ..e7143cfe0daf
--- /dev/null
+++ b/include/trace/events/kmap_thread.h
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
+
+/*
+ * Copyright (c) 2020 Intel Corporation.  All rights reserved.
+ *
+ */
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM kmap_thread
+
+#if !defined(_TRACE_KMAP_THREAD_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_KMAP_THREAD_H
+
+#include 
+
+DECLARE_EVENT_CLASS(kmap_thread_template,
+   TP_PROTO(struct task_struct *tsk, struct page *page,
+void *caller_addr, int cnt),
+   TP_ARGS(tsk, page, caller_addr, cnt),
+
+   TP_STRUCT__entry(
+   __field(int, pid)
+   __field(struct page *, page)
+   __field(void *, caller_addr)
+   __field(int, cnt)
+   ),
+
+   TP_fast_assign(
+   __entry->pid = tsk->pid;
+   __entry->page = page;
+   __entry->caller_addr = caller_addr;
+   __entry->cnt = cnt;
+   ),
+
+   TP_printk("PID %d; (%d) %pS %p",
+   __entry->pid,
+   __entry->cnt,
+   __entry->caller_addr,
+   __entry->page
+   )
+);
+
+DEFINE_EVENT(kmap_thread_template, kmap_thread,
+   TP_PROTO(struct task_struct *tsk, struct page *page,
+void *caller_addr, int cnt),
+   TP_ARGS(tsk, page, caller_addr, cnt));
+
+DEFINE_EVENT(kmap_thread_template, kunmap_thread,
+   TP_PROTO(struct task_struct *tsk, struct page *page,
+void *caller_addr, int cnt),
+   TP_ARGS(tsk, page, caller_addr, cnt));
+
+
+#endif /* _TRACE_KMAP_THREAD_H */
+
+#include 
diff --git a/init/init_task.c b/init/init_task.c
index 9b39f25de59b..19f09965eb34 100644
--- a/init/init_task.c
+++ b/init/init_task.c
@@ -212,6 +212,9 @@ struct task_struct init_task
 #ifdef CONFIG_ZONE_DEVICE_ACCESS_PROTECTION
.dev_page_access_ref = 0,
 #endif
+#ifdef CONFIG_DEBUG_KMAP_THREAD
+   .kmap_thread_cnt = 0,
+#endif
 };
 EXPORT_SYMBOL(init_task);
 
diff --git a/kernel/fork.c b/kernel/fork.c
index b6a3ee328a89..2c66e49b7614 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -722,6 +722,17 @@ static inline void put_signal_struct(struct signal_struct 
*sig)
free_signal_struct(sig);
 }
 
+#ifdef CONFIG_DEBUG_KMAP_THREAD
+static void check_outstanding_kmap_thread(struct task_struct *tsk)
+{
+   if (tsk->kmap_thread_cnt)
+   pr_warn(KERN_ERR "WARNING: PID %d; Failed to kunmap_thread() 
[cnt %d]\n",
+   tsk->pid, tsk->kmap_thread_cnt);
+}
+#else
+static void check_outstanding_kmap_thread(struct task_struct *tsk) { }
+#endif
+
 

[PATCH RFC PKS/PMEM 01/58] x86/pks: Add a global pkrs option

2020-10-09 Thread ira . weiny
From: Ira Weiny 

Some users, such as kmap(), sometimes requires PKS to be global.
However, updating all CPUs, and worse yet all threads is expensive.

Introduce a global PKRS state which is checked at critical times to
allow the state to enable access when global PKS is required.  To
accomplish this with minimal locking; the code is carefully designed
with the following key concepts.

1) Borrow the idea of lazy TLB invalidations from the fault handler
   code.  When enabling PKS access we anticipate that other threads are
   not yet running.  However, if they are we catch the fault and clean
   up the MSR value.

2) When disabling PKS access we force all MSR values across all CPU's.
   This is required to block access as soon as possible.[1]  However, it
   is key that we never attempt to update the per-task PKS values
   directly.  See next point.

3) Per-task PKS values never get updated with global PKS values.  This
   is key to prevent locking requirements and a nearly intractable
   problem of trying to update every task in the system.  Here are a few
   key points.

   3a) The MSR value can be updated with the global PKS value if that
   global value happened to change while the task was running.

   3b) If the task was sleeping while the global PKS was updated then
   the global value is added in when task's are scheduled.

   3c) If the global PKS value restricts access the MSR is updated as
   soon as possible[1] and the thread value is not updated which ensures
   the thread does not retain the elevated privileges after a context
   switch.

4) Follow on patches must be careful to preserve the separation of the
   thread PKRS value and the MSR value.

5) Access Disable on any individual pkey is turned into (Access Disable
   | Write Disable) to facilitate faster integration of the global value
   into the thread local MSR through a simple '&' operation.  Doing
   otherwise would result in complicated individual bit manipulation for
   each pkey.

[1] There is a race condition which is ignored which is required for
performance issues.  This potentially allows access to a thread until
the end of it's time slice.  After the context switch the global value
will be restored.

Signed-off-by: Ira Weiny 
---
 Documentation/core-api/protection-keys.rst |  11 +-
 arch/x86/entry/common.c|   7 +
 arch/x86/include/asm/pkeys.h   |   6 +-
 arch/x86/include/asm/pkeys_common.h|   8 +-
 arch/x86/kernel/process.c  |  74 +++-
 arch/x86/mm/fault.c| 189 -
 arch/x86/mm/pkeys.c|  88 --
 include/linux/pkeys.h  |   6 +-
 lib/pks/pks_test.c |  16 +-
 9 files changed, 329 insertions(+), 76 deletions(-)

diff --git a/Documentation/core-api/protection-keys.rst 
b/Documentation/core-api/protection-keys.rst
index c60366921d60..9e8a98653e13 100644
--- a/Documentation/core-api/protection-keys.rst
+++ b/Documentation/core-api/protection-keys.rst
@@ -121,9 +121,9 @@ mapping adds that mapping to the protection domain.
 int pks_key_alloc(const char * const pkey_user);
 #define PAGE_KERNEL_PKEY(pkey)
 #define _PAGE_KEY(pkey)
-void pks_mknoaccess(int pkey);
-void pks_mkread(int pkey);
-void pks_mkrdwr(int pkey);
+void pks_mknoaccess(int pkey, bool global);
+void pks_mkread(int pkey, bool global);
+void pks_mkrdwr(int pkey, bool global);
 void pks_key_free(int pkey);
 
 pks_key_alloc() allocates keys dynamically to allow better use of the limited
@@ -141,7 +141,10 @@ _PAGE_KEY().
 The pks_mk*() family of calls allows kernel users the ability to change the
 protections for the domain identified by the pkey specified.  3 states are
 available pks_mknoaccess(), pks_mkread(), and pks_mkrdwr() which set the access
-to none, read, and read/write respectively.
+to none, read, and read/write respectively.  'global' specifies that the
+protection should be set across all threads (logical CPU's) not just the
+current running thread/CPU.  This increases the overhead of PKS and lessens the
+protection so it should be used sparingly.
 
 Finally, pks_key_free() allows a user to return the key to the allocator for
 use by others.
diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c
index 324a8fd5ac10..86ad32e0095e 100644
--- a/arch/x86/entry/common.c
+++ b/arch/x86/entry/common.c
@@ -261,12 +261,19 @@ noinstr void idtentry_exit_nmi(struct pt_regs *regs, 
irqentry_state_t *irq_state
  * current running value and set the default PKRS value for the duration of the
  * exception.  Thus preventing exception handlers from having the elevated
  * access of the interrupted task.
+ *
+ * NOTE That the thread saved PKRS must be preserved separately to ensure
+ * global overrides do not 'stick' on a thread.
  */
 noinstr void irq_save_pkrs(irqentry_state_t *state)
 {
if 

[PATCH RFC PKS/PMEM 03/58] memremap: Add zone device access protection

2020-10-09 Thread ira . weiny
From: Ira Weiny 

Device managed memory exposes itself to the kernel direct map which
allows stray pointers to access these device memories.

Stray pointers to normal memory may result in a crash or other
undesirable behavior which, while unfortunate, are usually recoverable
with a reboot.  Stray access, specifically stray writes, to areas such
as non-volatile memory are permanent in nature and thus are more likely
to result in permanent user data loss vs stray access to other memory
areas.

Furthermore, we protect against reads which can help with speculative
reads to poison areas as well.  But this is a secondary reason.

Set up an infrastructure for extra device access protection. Then
implement the new protection using the new Protection Keys Supervisor
(PKS) on architectures which support it.

To enable this extra protection devices specify a flag in the pgmap to
indicate that these areas wish to use additional protection.

Kernel code which intends to access this memory can do so automatically
through the use of the kmap infrastructure calling into
dev_access_[enable|disable]() described here.  The kmap infrastructure
is implemented in a follow on patch.

In addition, users can directly enable/disable the access through
dev_access_[enable|disable]() if they have a priori knowledge of the
type of pages they are accessing.

All calls to enable/disable protection flow through
dev_access_[enable|disable]() and are nestable by the use of a per task
reference count.  This reference count does 2 things.

1) Allows a thread to nest calls to disable protection such that the
   first call to re-enable protection does not 'break' the last access of
   the pmem device memory.

2) Provides faster performance by avoiding lots of MSR writes.  For
   example, looping over a sequence of pmem pages.

In addition, we must ensure the reference count is preserved through an
exception so we add the count to irqentry_state_t and save/restore the
reference count while giving exceptions their own count should they use
a kmap call.

The following shows how this works through an exception:

...
// ref == 0
dev_access_enable()  // ref += 1 ==> disable protection
irq()
// enable protection
// ref = 0
_handler()
dev_access_enable()   // ref += 1 ==> 
disable protection
dev_access_disable()  // ref -= 1 ==> 
enable protection
// WARN_ON(ref != 0)
// disable protection
do_pmem_thing()  // all good here
dev_access_disable() // ref -= 1 ==> 0 ==> enable protection
...

Nested exceptions operate the same way with each exception storing the
interrupted exception state all the way down.

The pkey value is never free'ed as this optimizes the implementation to
be either on or off using a static branch conditional in the fast paths.

Cc: Juri Lelli 
Cc: Vincent Guittot 
Cc: Dietmar Eggemann 
Cc: Steven Rostedt 
Cc: Ben Segall 
Cc: Mel Gorman 
Signed-off-by: Ira Weiny 
---
 arch/x86/entry/common.c  | 21 +
 include/linux/entry-common.h |  3 ++
 include/linux/memremap.h |  1 +
 include/linux/mm.h   | 43 +
 include/linux/sched.h|  3 ++
 init/init_task.c |  3 ++
 kernel/fork.c|  3 ++
 mm/Kconfig   | 13 ++
 mm/memremap.c| 90 
 9 files changed, 180 insertions(+)

diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c
index 86ad32e0095e..3680724c1a4d 100644
--- a/arch/x86/entry/common.c
+++ b/arch/x86/entry/common.c
@@ -264,12 +264,27 @@ noinstr void idtentry_exit_nmi(struct pt_regs *regs, 
irqentry_state_t *irq_state
  *
  * NOTE That the thread saved PKRS must be preserved separately to ensure
  * global overrides do not 'stick' on a thread.
+ *
+ * Furthermore, Zone Device Access Protection maintains access in a re-entrant
+ * manner through a reference count which also needs to be maintained should
+ * exception handlers use those interfaces for memory access.  Here we start
+ * off the exception handler ref count to 0 and ensure it is 0 when the
+ * exception is done.  Then restore it for the interrupted task.
  */
 noinstr void irq_save_pkrs(irqentry_state_t *state)
 {
if (!cpu_feature_enabled(X86_FEATURE_PKS))
return;
 
+#ifdef CONFIG_ZONE_DEVICE_ACCESS_PROTECTION
+   /*
+* Save the ref count of the current running process and set it to 0
+* for any irq users to properly track re-entrance
+*/
+   state->pkrs_ref = current->dev_page_access_ref;
+   current->dev_page_access_ref = 0;
+#endif
+
/*
 * The thread_pkrs must be maintained separately to prevent global
 * overrides from 'sticking' on a thread.
@@ -286,6 +301,12 @@ 

[PATCH RFC PKS/PMEM 09/58] drivers/gpu: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

These kmap() calls in the gpu stack are localized to a single thread.
To avoid the over head of global PKRS updates use the new kmap_thread()
call.

Cc: David Airlie 
Cc: Daniel Vetter 
Cc: Patrik Jakobsson 
Signed-off-by: Ira Weiny 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c  | 12 ++--
 drivers/gpu/drm/gma500/gma_display.c |  4 ++--
 drivers/gpu/drm/gma500/mmu.c | 10 +-
 drivers/gpu/drm/i915/gem/i915_gem_shmem.c|  4 ++--
 .../gpu/drm/i915/gem/selftests/i915_gem_context.c|  4 ++--
 drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c   |  8 
 drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c |  4 ++--
 drivers/gpu/drm/i915/gt/intel_gtt.c  |  4 ++--
 drivers/gpu/drm/i915/gt/shmem_utils.c|  4 ++--
 drivers/gpu/drm/i915/i915_gem.c  |  8 
 drivers/gpu/drm/i915/i915_gpu_error.c|  4 ++--
 drivers/gpu/drm/i915/selftests/i915_perf.c   |  4 ++--
 drivers/gpu/drm/radeon/radeon_ttm.c  |  4 ++--
 13 files changed, 37 insertions(+), 37 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 978bae731398..bd564bccb7a3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -2437,11 +2437,11 @@ static ssize_t amdgpu_ttm_gtt_read(struct file *f, char 
__user *buf,
 
page = adev->gart.pages[p];
if (page) {
-   ptr = kmap(page);
+   ptr = kmap_thread(page);
ptr += off;
 
r = copy_to_user(buf, ptr, cur_size);
-   kunmap(adev->gart.pages[p]);
+   kunmap_thread(adev->gart.pages[p]);
} else
r = clear_user(buf, cur_size);
 
@@ -2507,9 +2507,9 @@ static ssize_t amdgpu_iomem_read(struct file *f, char 
__user *buf,
if (p->mapping != adev->mman.bdev.dev_mapping)
return -EPERM;
 
-   ptr = kmap(p);
+   ptr = kmap_thread(p);
r = copy_to_user(buf, ptr + off, bytes);
-   kunmap(p);
+   kunmap_thread(p);
if (r)
return -EFAULT;
 
@@ -2558,9 +2558,9 @@ static ssize_t amdgpu_iomem_write(struct file *f, const 
char __user *buf,
if (p->mapping != adev->mman.bdev.dev_mapping)
return -EPERM;
 
-   ptr = kmap(p);
+   ptr = kmap_thread(p);
r = copy_from_user(ptr + off, buf, bytes);
-   kunmap(p);
+   kunmap_thread(p);
if (r)
return -EFAULT;
 
diff --git a/drivers/gpu/drm/gma500/gma_display.c 
b/drivers/gpu/drm/gma500/gma_display.c
index 3df6d6e850f5..35f4e55c941f 100644
--- a/drivers/gpu/drm/gma500/gma_display.c
+++ b/drivers/gpu/drm/gma500/gma_display.c
@@ -400,9 +400,9 @@ int gma_crtc_cursor_set(struct drm_crtc *crtc,
/* Copy the cursor to cursor mem */
tmp_dst = dev_priv->vram_addr + cursor_gt->offset;
for (i = 0; i < cursor_pages; i++) {
-   tmp_src = kmap(gt->pages[i]);
+   tmp_src = kmap_thread(gt->pages[i]);
memcpy(tmp_dst, tmp_src, PAGE_SIZE);
-   kunmap(gt->pages[i]);
+   kunmap_thread(gt->pages[i]);
tmp_dst += PAGE_SIZE;
}
 
diff --git a/drivers/gpu/drm/gma500/mmu.c b/drivers/gpu/drm/gma500/mmu.c
index 505044c9a673..fba7a3a461fd 100644
--- a/drivers/gpu/drm/gma500/mmu.c
+++ b/drivers/gpu/drm/gma500/mmu.c
@@ -192,20 +192,20 @@ struct psb_mmu_pd *psb_mmu_alloc_pd(struct psb_mmu_driver 
*driver,
pd->invalid_pte = 0;
}
 
-   v = kmap(pd->dummy_pt);
+   v = kmap_thread(pd->dummy_pt);
for (i = 0; i < (PAGE_SIZE / sizeof(uint32_t)); ++i)
v[i] = pd->invalid_pte;
 
-   kunmap(pd->dummy_pt);
+   kunmap_thread(pd->dummy_pt);
 
-   v = kmap(pd->p);
+   v = kmap_thread(pd->p);
for (i = 0; i < (PAGE_SIZE / sizeof(uint32_t)); ++i)
v[i] = pd->invalid_pde;
 
-   kunmap(pd->p);
+   kunmap_thread(pd->p);
 
clear_page(kmap(pd->dummy_page));
-   kunmap(pd->dummy_page);
+   kunmap_thread(pd->dummy_page);
 
pd->tables = vmalloc_user(sizeof(struct psb_mmu_pt *) * 1024);
if (!pd->tables)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c 
b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
index 38113d3c0138..274424795fb7 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
@@ -566,9 +566,9 @@ i915_gem_object_create_shmem_from_data(struct 
drm_i915_private *dev_priv,
if (err < 0)
   

[PATCH RFC PKS/PMEM 02/58] x86/pks/test: Add testing for global option

2020-10-09 Thread ira . weiny
From: Ira Weiny 

Now that PKS can be enabled globaly (for all threads) add a test which
spawns a thread and tests the same PKS functionality.

The test enables/disables PKS in 1 thread while attempting to access the
page in another thread.  We use the same test array as in the 'local'
PKS testing.

Signed-off-by: Ira Weiny 
---
 arch/x86/mm/fault.c |   4 ++
 lib/pks/pks_test.c  | 128 +---
 2 files changed, 124 insertions(+), 8 deletions(-)

diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index 4b4ff9efa298..4c74f52fbc23 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -1108,6 +1108,10 @@ static int spurious_kernel_fault_check(unsigned long 
error_code, pte_t *pte,
if (global_pkey_is_enabled(pte, is_write, irq_state))
return 1;
 
+   /*
+* NOTE: This must be after the global_pkey_is_enabled() call
+* to allow the fixup code to be tested.
+*/
if (handle_pks_testing(error_code, irq_state))
return 1;
 
diff --git a/lib/pks/pks_test.c b/lib/pks/pks_test.c
index 286c8b8457da..dfddccbe4cb6 100644
--- a/lib/pks/pks_test.c
+++ b/lib/pks/pks_test.c
@@ -154,7 +154,8 @@ static void check_exception(irqentry_state_t *irq_state)
}
 
/* Check the exception state */
-   if (!check_pkrs(test_armed_key, PKEY_DISABLE_ACCESS)) {
+   if (!check_pkrs(test_armed_key,
+   PKEY_DISABLE_ACCESS | PKEY_DISABLE_WRITE)) {
pr_err(" FAIL: PKRS cache and MSR\n");
test_exception_ctx->pass = false;
}
@@ -308,24 +309,29 @@ static int test_it(struct pks_test_ctx *ctx, struct 
pks_access_test *test, void
return ret;
 }
 
-static int run_access_test(struct pks_test_ctx *ctx,
-  struct pks_access_test *test,
-  void *ptr)
+static void set_protection(int pkey, enum pks_access_mode mode, bool global)
 {
-   switch (test->mode) {
+   switch (mode) {
case PKS_TEST_NO_ACCESS:
-   pks_mknoaccess(ctx->pkey, false);
+   pks_mknoaccess(pkey, global);
break;
case PKS_TEST_RDWR:
-   pks_mkrdwr(ctx->pkey, false);
+   pks_mkrdwr(pkey, global);
break;
case PKS_TEST_RDONLY:
-   pks_mkread(ctx->pkey, false);
+   pks_mkread(pkey, global);
break;
default:
pr_err("BUG in test invalid mode\n");
break;
}
+}
+
+static int run_access_test(struct pks_test_ctx *ctx,
+  struct pks_access_test *test,
+  void *ptr)
+{
+   set_protection(ctx->pkey, test->mode, false);
 
return test_it(ctx, test, ptr);
 }
@@ -516,6 +522,110 @@ static void run_exception_test(void)
 pass ? "PASS" : "FAIL");
 }
 
+struct shared_data {
+   struct mutex lock;
+   struct pks_test_ctx *ctx;
+   void *kmap_addr;
+   struct pks_access_test *test;
+};
+
+static int thread_main(void *d)
+{
+   struct shared_data *data = d;
+   struct pks_test_ctx *ctx = data->ctx;
+
+   while (!kthread_should_stop()) {
+   mutex_lock(>lock);
+   /*
+* wait for the main thread to hand us the page
+* We should be spinning so hopefully we will not have gotten
+* the global value from a schedule in.
+*/
+   if (data->kmap_addr) {
+   if (test_it(ctx, data->test, data->kmap_addr))
+   ctx->pass = false;
+   data->kmap_addr = NULL;
+   }
+   mutex_unlock(>lock);
+   }
+
+   return 0;
+}
+
+static void run_thread_access_test(struct shared_data *data,
+  struct pks_test_ctx *ctx,
+  struct pks_access_test *test,
+  void *ptr)
+{
+   set_protection(ctx->pkey, test->mode, true);
+
+   pr_info("checking...  mode %s; write %s\n",
+   get_mode_str(test->mode), test->write ? "TRUE" : 
"FALSE");
+
+   mutex_lock(>lock);
+   data->test = test;
+   data->kmap_addr = ptr;
+   mutex_unlock(>lock);
+
+   while (data->kmap_addr) {
+   msleep(10);
+   }
+}
+
+static void run_global_test(void)
+{
+   struct task_struct *other_task;
+   struct pks_test_ctx *ctx;
+   struct shared_data data;
+   bool pass = true;
+   void *ptr;
+   int i;
+
+   pr_info(" * BEGIN: global pkey checking\n");
+
+   /* Set up context, data pgae, and thread */
+   ctx = alloc_ctx("global pkey test");
+   if 

[PATCH RFC PKS/PMEM 08/58] drivers/firmware_loader: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this driver are localized to a single thread.  To
avoid the over head of global PKRS updates use the new kmap_thread()
call.

Cc: Luis Chamberlain 
Signed-off-by: Ira Weiny 
---
 drivers/base/firmware_loader/fallback.c | 4 ++--
 drivers/base/firmware_loader/main.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/base/firmware_loader/fallback.c 
b/drivers/base/firmware_loader/fallback.c
index 283ca2de76d4..22dea9ba7a37 100644
--- a/drivers/base/firmware_loader/fallback.c
+++ b/drivers/base/firmware_loader/fallback.c
@@ -322,14 +322,14 @@ static void firmware_rw(struct fw_priv *fw_priv, char 
*buffer,
int page_ofs = offset & (PAGE_SIZE-1);
int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count);
 
-   page_data = kmap(fw_priv->pages[page_nr]);
+   page_data = kmap_thread(fw_priv->pages[page_nr]);
 
if (read)
memcpy(buffer, page_data + page_ofs, page_cnt);
else
memcpy(page_data + page_ofs, buffer, page_cnt);
 
-   kunmap(fw_priv->pages[page_nr]);
+   kunmap_thread(fw_priv->pages[page_nr]);
buffer += page_cnt;
offset += page_cnt;
count -= page_cnt;
diff --git a/drivers/base/firmware_loader/main.c 
b/drivers/base/firmware_loader/main.c
index 63b9714a0154..cc884c9f8742 100644
--- a/drivers/base/firmware_loader/main.c
+++ b/drivers/base/firmware_loader/main.c
@@ -409,11 +409,11 @@ static int fw_decompress_xz_pages(struct device *dev, 
struct fw_priv *fw_priv,
 
/* decompress onto the new allocated page */
page = fw_priv->pages[fw_priv->nr_pages - 1];
-   xz_buf.out = kmap(page);
+   xz_buf.out = kmap_thread(page);
xz_buf.out_pos = 0;
xz_buf.out_size = PAGE_SIZE;
xz_ret = xz_dec_run(xz_dec, _buf);
-   kunmap(page);
+   kunmap_thread(page);
fw_priv->size += xz_buf.out_pos;
/* partial decompression means either end or error */
if (xz_buf.out_pos != PAGE_SIZE)
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 04/58] kmap: Add stray access protection for device pages

2020-10-09 Thread ira . weiny
From: Ira Weiny 

Device managed pages may have additional protections.  These protections
need to be removed prior to valid use by kernel users.

Check for special treatment of device managed pages in kmap and take
action if needed.  We use kmap as an interface for generic kernel code
because under normal circumstances it would be a bug for general kernel
code to not use kmap prior to accessing kernel memory.  Therefore, this
should allow any valid kernel users to seamlessly use these pages
without issues.

Because of the critical nature of kmap it must be pointed out that the
over head on regular DRAM is carefully implemented to be as fast as
possible.  Furthermore the underlying MSR write required on device pages
when protected is better than a normal MSR write.

Specifically, WRMSR(MSR_IA32_PKRS) is not serializing but still
maintains ordering properties similar to WRPKRU.  The current SDM
section on PKRS needs updating but should be the same as that of WRPKRU.
So to quote from the WRPKRU text:

WRPKRU will never execute speculatively. Memory accesses
affected by PKRU register will not execute (even speculatively)
until all prior executions of WRPKRU have completed execution
and updated the PKRU register.

Still this will make accessing pmem more expensive from the kernel but
the overhead is minimized and many pmem users access this memory through
user page mappings which are not affected at all.

Cc: Randy Dunlap 
Signed-off-by: Ira Weiny 
---
 include/linux/highmem.h | 32 +++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index 14e6202ce47f..2a9806e3b8d2 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -8,6 +8,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 
@@ -31,6 +32,20 @@ static inline void invalidate_kernel_vmap_range(void *vaddr, 
int size)
 
 #include 
 
+static inline void dev_page_enable_access(struct page *page, bool global)
+{
+   if (!page_is_access_protected(page))
+   return;
+   dev_access_enable(global);
+}
+
+static inline void dev_page_disable_access(struct page *page, bool global)
+{
+   if (!page_is_access_protected(page))
+   return;
+   dev_access_disable(global);
+}
+
 #ifdef CONFIG_HIGHMEM
 extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot);
 extern void kunmap_atomic_high(void *kvaddr);
@@ -55,6 +70,11 @@ static inline void *kmap(struct page *page)
else
addr = kmap_high(page);
kmap_flush_tlb((unsigned long)addr);
+   /*
+* Even non-highmem pages may have additional access protections which
+* need to be checked and potentially enabled.
+*/
+   dev_page_enable_access(page, true);
return addr;
 }
 
@@ -63,6 +83,11 @@ void kunmap_high(struct page *page);
 static inline void kunmap(struct page *page)
 {
might_sleep();
+   /*
+* Even non-highmem pages may have additional access protections which
+* need to be checked and potentially disabled.
+*/
+   dev_page_disable_access(page, true);
if (!PageHighMem(page))
return;
kunmap_high(page);
@@ -85,6 +110,7 @@ static inline void *kmap_atomic_prot(struct page *page, 
pgprot_t prot)
 {
preempt_disable();
pagefault_disable();
+   dev_page_enable_access(page, false);
if (!PageHighMem(page))
return page_address(page);
return kmap_atomic_high_prot(page, prot);
@@ -137,6 +163,7 @@ static inline unsigned long totalhigh_pages(void) { return 
0UL; }
 static inline void *kmap(struct page *page)
 {
might_sleep();
+   dev_page_enable_access(page, true);
return page_address(page);
 }
 
@@ -146,6 +173,7 @@ static inline void kunmap_high(struct page *page)
 
 static inline void kunmap(struct page *page)
 {
+   dev_page_disable_access(page, true);
 #ifdef ARCH_HAS_FLUSH_ON_KUNMAP
kunmap_flush_on_unmap(page_address(page));
 #endif
@@ -155,6 +183,7 @@ static inline void *kmap_atomic(struct page *page)
 {
preempt_disable();
pagefault_disable();
+   dev_page_enable_access(page, false);
return page_address(page);
 }
 #define kmap_atomic_prot(page, prot)   kmap_atomic(page)
@@ -216,7 +245,8 @@ static inline void kmap_atomic_idx_pop(void)
 #define kunmap_atomic(addr) \
 do {\
BUILD_BUG_ON(__same_type((addr), struct page *));   \
-   kunmap_atomic_high(addr);  \
+   dev_page_disable_access(kmap_to_page(addr), false); \
+   kunmap_atomic_high(addr);   \
pagefault_enable(); \
preempt_enable();   \
 } while (0)
-- 

[PATCH RFC PKS/PMEM 00/58] PMEM: Introduce stray write protection for PMEM

2020-10-09 Thread ira . weiny
From: Ira Weiny 

Should a stray write in the kernel occur persistent memory is affected more
than regular memory.  A write to the wrong area of memory could result in
latent data corruption which will will persist after a reboot.  PKS provides a
nice way to restrict access to persistent memory kernel mappings, while
providing fast access when needed.

Since the last RFC[1] this patch set has grown quite a bit.  It now depends on
the core patches submitted separately.


https://lore.kernel.org/lkml/20201009194258.3207172-1-ira.we...@intel.com/

And contained in the git tree here:

https://github.com/weiny2/linux-kernel/tree/pks-rfc-v3

However, functionally there is only 1 major change from the last RFC.
Specifically, kmap() is most often used within a single thread in a 'map/do
something/unmap' pattern.  In fact this is the pattern used in ~90% of the
callers of kmap().  This pattern works very well for the pmem use case and the
testing which was done.  However, there were another ~20-30 kmap users which do
not follow this pattern.  Some of them seem to expect the mapping to be
'global' while others require a detailed audit to be sure.[2][3]

While we don't anticipate global mappings to pmem there is a danger in
changing the semantics of kmap().  Effectively, this would cause an unresolved
page fault with little to no information about why.

There were a number of options considered.

1) Attempt to change all the thread local kmap() calls to kmap_atomic()
2) Introduce a flags parameter to kmap() to indicate if the mapping should be
   global or not
3) Change ~20-30 call sites to 'kmap_global()' to indicate that they require a
   global mapping of the pages
4) Change ~209 call sites to 'kmap_thread()' to indicate that the mapping is to
   be used within that thread of execution only

Option 1 is simply not feasible kmap_atomic() is not the same semantic as
kmap() within a single tread.  Option 2 would require all of the call sites of
kmap() to change.  Option 3 seems like a good minimal change but there is a
danger that new code may miss the semantic change of kmap() and not get the
behavior intended for future users.  Therefore, option #4 was chosen.

To handle the global PKRS state in the most efficient manner possible.  We
lazily override the thread specific PKRS key value only when needed because we
anticipate PKS to not be needed will not be needed most of the time.  And even
when it is used 90% of the time it is a thread local call.


[1] https://lore.kernel.org/lkml/20200717072056.73134-1-ira.we...@intel.com/

[2] The following list of callers continue calling kmap() (utilizing the global
PKRS).  It would be nice if more of them could be converted to kmap_thread()

drivers/firewire/net.c: ptr = 
kmap(dev->broadcast_rcv_buffer.pages[u]);
drivers/gpu/drm/i915/gem/i915_gem_pages.c:  return 
kmap(sg_page(sgt->sgl));
drivers/gpu/drm/ttm/ttm_bo_util.c:  map->virtual = 
kmap(map->page);
drivers/infiniband/hw/qib/qib_user_sdma.c:  mpage = kmap(page);
drivers/misc/vmw_vmci/vmci_host.c:  context->notify = 
kmap(context->notify_page) + (uva & (PAGE_SIZE - 1));
drivers/misc/xilinx_sdfec.c:addr = kmap(pages[i]);
drivers/mmc/host/usdhi6rol0.c:  host->pg.mapped = 
kmap(host->pg.page);
drivers/mmc/host/usdhi6rol0.c:  host->pg.mapped = kmap(host->pg.page);
drivers/mmc/host/usdhi6rol0.c:  host->pg.mapped = kmap(host->pg.page);
drivers/nvme/target/tcp.c:  iov->iov_base = 
kmap(sg_page(sg)) + sg->offset + sg_offset;
drivers/scsi/libiscsi_tcp.c:segment->sg_mapped = 
kmap(sg_page(sg));
drivers/target/iscsi/iscsi_target.c:iov[i].iov_base = 
kmap(sg_page(sg)) + sg->offset + page_off;
drivers/target/target_core_transport.c: return 
kmap(sg_page(sg)) + sg->offset;
fs/btrfs/check-integrity.c: block_ctx->datav[i] = 
kmap(block_ctx->pagev[i]);
fs/ceph/dir.c:  cache_ctl->dentries = kmap(cache_ctl->page);
fs/ceph/inode.c:ctl->dentries = kmap(ctl->page);
fs/erofs/zpvec.h:   kmap_atomic(ctor->curr) : 
kmap(ctor->curr);
lib/scatterlist.c:  miter->addr = kmap(miter->page) + 
miter->__offset;
net/ceph/pagelist.c:pl->mapped_tail = kmap(page);
net/ceph/pagelist.c:pl->mapped_tail = kmap(page);
virt/kvm/kvm_main.c:hva = kmap(page);

[3] The following appear to follow the same pattern as ext2 which was converted
after some code audit.  So I _think_ they too could be converted to
k[un]map_thread().

fs/freevxfs/vxfs_subr.c|75| kmap(pp);
fs/jfs/jfs_metapage.c|102| kmap(page);
fs/jfs/jfs_metapage.c|156| kmap(page);
fs/minix/dir.c|72| kmap(page);
fs/nilfs2/dir.c|195| kmap(page);
fs/nilfs2/ifile.h|24| void *kaddr = 

[PATCH RFC PKS/PMEM 07/58] drivers/drbd: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in this driver are localized to a single thread.  To
avoid the over head of global PKRS updates use the new kmap_thread()
call.

Cc: Jens Axboe 
Signed-off-by: Ira Weiny 
---
 drivers/block/drbd/drbd_main.c |  4 ++--
 drivers/block/drbd/drbd_receiver.c | 12 ++--
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 573dbf6f0c31..f0d0c6b0745e 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -1532,9 +1532,9 @@ static int _drbd_no_send_page(struct drbd_peer_device 
*peer_device, struct page
int err;
 
socket = peer_device->connection->data.socket;
-   addr = kmap(page) + offset;
+   addr = kmap_thread(page) + offset;
err = drbd_send_all(peer_device->connection, socket, addr, size, 
msg_flags);
-   kunmap(page);
+   kunmap_thread(page);
if (!err)
peer_device->device->send_cnt += size >> 9;
return err;
diff --git a/drivers/block/drbd/drbd_receiver.c 
b/drivers/block/drbd/drbd_receiver.c
index 422363daa618..4704bc0564e2 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1951,13 +1951,13 @@ read_in_block(struct drbd_peer_device *peer_device, u64 
id, sector_t sector,
page = peer_req->pages;
page_chain_for_each(page) {
unsigned len = min_t(int, ds, PAGE_SIZE);
-   data = kmap(page);
+   data = kmap_thread(page);
err = drbd_recv_all_warn(peer_device->connection, data, len);
if (drbd_insert_fault(device, DRBD_FAULT_RECEIVE)) {
drbd_err(device, "Fault injection: Corrupting data on 
receive\n");
data[0] = data[0] ^ (unsigned long)-1;
}
-   kunmap(page);
+   kunmap_thread(page);
if (err) {
drbd_free_peer_req(device, peer_req);
return NULL;
@@ -1992,7 +1992,7 @@ static int drbd_drain_block(struct drbd_peer_device 
*peer_device, int data_size)
 
page = drbd_alloc_pages(peer_device, 1, 1);
 
-   data = kmap(page);
+   data = kmap_thread(page);
while (data_size) {
unsigned int len = min_t(int, data_size, PAGE_SIZE);
 
@@ -2001,7 +2001,7 @@ static int drbd_drain_block(struct drbd_peer_device 
*peer_device, int data_size)
break;
data_size -= len;
}
-   kunmap(page);
+   kunmap_thread(page);
drbd_free_pages(peer_device->device, page, 0);
return err;
 }
@@ -2033,10 +2033,10 @@ static int recv_dless_read(struct drbd_peer_device 
*peer_device, struct drbd_req
D_ASSERT(peer_device->device, sector == bio->bi_iter.bi_sector);
 
bio_for_each_segment(bvec, bio, iter) {
-   void *mapped = kmap(bvec.bv_page) + bvec.bv_offset;
+   void *mapped = kmap_thread(bvec.bv_page) + bvec.bv_offset;
expect = min_t(int, data_size, bvec.bv_len);
err = drbd_recv_all_warn(peer_device->connection, mapped, 
expect);
-   kunmap(bvec.bv_page);
+   kunmap_thread(bvec.bv_page);
if (err)
return err;
data_size -= expect;
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 05/58] kmap: Introduce k[un]map_thread

2020-10-09 Thread ira . weiny
From: Ira Weiny 

To correctly support the semantics of kmap() with Kernel protection keys
(PKS), kmap() may be required to set the protections on multiple
processors (globally).  Enabling PKS globally can be very expensive
depending on the requested operation.  Furthermore, enabling a domain
globally reduces the protection afforded by PKS.

Most kmap() (Aprox 209 of 229) callers use the map within a single thread and
have no need for the protection domain to be enabled globally.  However, the
remaining callers do not follow this pattern and, as best I can tell, expect
the mapping to be 'global' and available to any thread who may access the
mapping.[1]

We don't anticipate global mappings to pmem, however in general there is a
danger in changing the semantics of kmap().  Effectively, this would cause an
unresolved page fault with little to no information about why the failure
occurred.

To resolve this a number of options were considered.

1) Attempt to change all the thread local kmap() calls to kmap_atomic()[2]
2) Introduce a flags parameter to kmap() to indicate if the mapping should be
   global or not
3) Change ~20 call sites to 'kmap_global()' to indicate that they require a
   global enablement of the pages.
4) Change ~209 call sites to 'kmap_thread()' to indicate that the mapping is to
   be used within that thread of execution only

Option 1 is simply not feasible.  Option 2 would require all of the call sites
of kmap() to change.  Option 3 seems like a good minimal change but there is a
danger that new code may miss the semantic change of kmap() and not get the
behavior the developer intended.  Therefore, #4 was chosen.

Subsequent patches will convert most ~90% of the kmap callers to this new call
leaving about 10% of the existing kmap callers to enable PKS globally.

Cc: Randy Dunlap 
Signed-off-by: Ira Weiny 
---
 include/linux/highmem.h | 34 ++
 1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index 2a9806e3b8d2..ef7813544719 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -60,7 +60,7 @@ static inline void kmap_flush_tlb(unsigned long addr) { }
 #endif
 
 void *kmap_high(struct page *page);
-static inline void *kmap(struct page *page)
+static inline void *__kmap(struct page *page, bool global)
 {
void *addr;
 
@@ -74,20 +74,20 @@ static inline void *kmap(struct page *page)
 * Even non-highmem pages may have additional access protections which
 * need to be checked and potentially enabled.
 */
-   dev_page_enable_access(page, true);
+   dev_page_enable_access(page, global);
return addr;
 }
 
 void kunmap_high(struct page *page);
 
-static inline void kunmap(struct page *page)
+static inline void __kunmap(struct page *page, bool global)
 {
might_sleep();
/*
 * Even non-highmem pages may have additional access protections which
 * need to be checked and potentially disabled.
 */
-   dev_page_disable_access(page, true);
+   dev_page_disable_access(page, global);
if (!PageHighMem(page))
return;
kunmap_high(page);
@@ -160,10 +160,10 @@ static inline struct page *kmap_to_page(void *addr)
 
 static inline unsigned long totalhigh_pages(void) { return 0UL; }
 
-static inline void *kmap(struct page *page)
+static inline void *__kmap(struct page *page, bool global)
 {
might_sleep();
-   dev_page_enable_access(page, true);
+   dev_page_enable_access(page, global);
return page_address(page);
 }
 
@@ -171,9 +171,9 @@ static inline void kunmap_high(struct page *page)
 {
 }
 
-static inline void kunmap(struct page *page)
+static inline void __kunmap(struct page *page, bool global)
 {
-   dev_page_disable_access(page, true);
+   dev_page_disable_access(page, global);
 #ifdef ARCH_HAS_FLUSH_ON_KUNMAP
kunmap_flush_on_unmap(page_address(page));
 #endif
@@ -238,6 +238,24 @@ static inline void kmap_atomic_idx_pop(void)
 
 #endif
 
+static inline void *kmap(struct page *page)
+{
+   return __kmap(page, true);
+}
+static inline void kunmap(struct page *page)
+{
+   __kunmap(page, true);
+}
+
+static inline void *kmap_thread(struct page *page)
+{
+   return __kmap(page, false);
+}
+static inline void kunmap_thread(struct page *page)
+{
+   __kunmap(page, false);
+}
+
 /*
  * Prevent people trying to call kunmap_atomic() as if it were kunmap()
  * kunmap_atomic() should get the return value of kmap_atomic, not the page.
-- 
2.28.0.rc0.12.gb6a658bd00c9

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH RFC PKS/PMEM 10/58] drivers/rdma: Utilize new kmap_thread()

2020-10-09 Thread ira . weiny
From: Ira Weiny 

The kmap() calls in these drivers are localized to a single thread.  To
avoid the over head of global PKRS updates use the new kmap_thread()
call.

Cc: Mike Marciniszyn 
Cc: Dennis Dalessandro 
Cc: Doug Ledford 
Cc: Jason Gunthorpe 
Cc: Faisal Latif 
Cc: Shiraz Saleem 
Cc: Bernard Metzler 
Signed-off-by: Ira Weiny 
---
 drivers/infiniband/hw/hfi1/sdma.c  |  4 ++--
 drivers/infiniband/hw/i40iw/i40iw_cm.c | 10 +-
 drivers/infiniband/sw/siw/siw_qp_tx.c  | 14 +++---
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/infiniband/hw/hfi1/sdma.c 
b/drivers/infiniband/hw/hfi1/sdma.c
index 04575c9afd61..09d206e3229a 100644
--- a/drivers/infiniband/hw/hfi1/sdma.c
+++ b/drivers/infiniband/hw/hfi1/sdma.c
@@ -3130,7 +3130,7 @@ int ext_coal_sdma_tx_descs(struct hfi1_devdata *dd, 
struct sdma_txreq *tx,
}
 
if (type == SDMA_MAP_PAGE) {
-   kvaddr = kmap(page);
+   kvaddr = kmap_thread(page);
kvaddr += offset;
} else if (WARN_ON(!kvaddr)) {
__sdma_txclean(dd, tx);
@@ -3140,7 +3140,7 @@ int ext_coal_sdma_tx_descs(struct hfi1_devdata *dd, 
struct sdma_txreq *tx,
memcpy(tx->coalesce_buf + tx->coalesce_idx, kvaddr, len);
tx->coalesce_idx += len;
if (type == SDMA_MAP_PAGE)
-   kunmap(page);
+   kunmap_thread(page);
 
/* If there is more data, return */
if (tx->tlen - tx->coalesce_idx)
diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.c 
b/drivers/infiniband/hw/i40iw/i40iw_cm.c
index a3b95805c154..122d7a5642a1 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_cm.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_cm.c
@@ -3721,7 +3721,7 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct 
iw_cm_conn_param *conn_param)
ibmr->device = iwpd->ibpd.device;
iwqp->lsmm_mr = ibmr;
if (iwqp->page)
-   iwqp->sc_qp.qp_uk.sq_base = kmap(iwqp->page);
+   iwqp->sc_qp.qp_uk.sq_base = kmap_thread(iwqp->page);
dev->iw_priv_qp_ops->qp_send_lsmm(>sc_qp,
iwqp->ietf_mem.va,
(accept.size + 
conn_param->private_data_len),
@@ -3729,12 +3729,12 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct 
iw_cm_conn_param *conn_param)
 
} else {
if (iwqp->page)
-   iwqp->sc_qp.qp_uk.sq_base = kmap(iwqp->page);
+   iwqp->sc_qp.qp_uk.sq_base = kmap_thread(iwqp->page);
dev->iw_priv_qp_ops->qp_send_lsmm(>sc_qp, NULL, 0, 0);
}
 
if (iwqp->page)
-   kunmap(iwqp->page);
+   kunmap_thread(iwqp->page);
 
iwqp->cm_id = cm_id;
cm_node->cm_id = cm_id;
@@ -4102,10 +4102,10 @@ static void i40iw_cm_event_connected(struct 
i40iw_cm_event *event)
i40iw_cm_init_tsa_conn(iwqp, cm_node);
read0 = (cm_node->send_rdma0_op == SEND_RDMA_READ_ZERO);
if (iwqp->page)
-   iwqp->sc_qp.qp_uk.sq_base = kmap(iwqp->page);
+   iwqp->sc_qp.qp_uk.sq_base = kmap_thread(iwqp->page);
dev->iw_priv_qp_ops->qp_send_rtt(>sc_qp, read0);
if (iwqp->page)
-   kunmap(iwqp->page);
+   kunmap_thread(iwqp->page);
 
memset(, 0, sizeof(attr));
attr.qp_state = IB_QPS_RTS;
diff --git a/drivers/infiniband/sw/siw/siw_qp_tx.c 
b/drivers/infiniband/sw/siw/siw_qp_tx.c
index d19d8325588b..4ed37c328d02 100644
--- a/drivers/infiniband/sw/siw/siw_qp_tx.c
+++ b/drivers/infiniband/sw/siw/siw_qp_tx.c
@@ -76,7 +76,7 @@ static int siw_try_1seg(struct siw_iwarp_tx *c_tx, void 
*paddr)
if (unlikely(!p))
return -EFAULT;
 
-   buffer = kmap(p);
+   buffer = kmap_thread(p);
 
if (likely(PAGE_SIZE - off >= bytes)) {
memcpy(paddr, buffer + off, bytes);
@@ -84,7 +84,7 @@ static int siw_try_1seg(struct siw_iwarp_tx *c_tx, void 
*paddr)
unsigned long part = bytes - (PAGE_SIZE - off);
 
memcpy(paddr, buffer + off, part);
-   kunmap(p);
+   kunmap_thread(p);
 
if (!mem->is_pbl)
p = siw_get_upage(mem->umem,
@@ -96,10 +96,10 @@ static int siw_try_1seg(struct siw_iwarp_tx *c_tx, void 
*paddr)
if (unlikely(!p))
return -EFAULT;
 
-   buffer = kmap(p);
+   buffer = kmap_thread(p);
memcpy(paddr + part, buffer, 

Re: [PATCH v2 09/17] mm: Add unsafe_follow_pfn

2020-10-09 Thread Daniel Vetter
On Fri, Oct 9, 2020 at 8:01 PM Jason Gunthorpe  wrote:
>
> On Fri, Oct 09, 2020 at 07:52:05PM +0200, Daniel Vetter wrote:
>
> > > > If this is the case, the proper fix seems to have a GFP_NOT_MOVABLE
> > > > flag that it would be denying the core mm code to set __GFP_MOVABLE.
> > >
> > > We can't tell from the VMA these kinds of details..
> > >
> > > It has to go the other direction, evey mmap that might be used as a
> > > userptr here has to be found and the VMA specially created to allow
> > > its use. At least that is a kernel only change, but will need people
> > > with the HW to do this work.
> >
> > I think the only reasonable way to keep this working is:
> > - add a struct dma_buf *vma_tryget_dma_buf(struct vm_area_struct *vma);
> > - add dma-buf export support to fbdev and v4l
> > - roll this out everywhere we still need it.
>
> It seems to me there is a technical way forward to restore user
> compat, so it is really no different than RDMA/DRM pain we both
> suffered before.
>
> Thus no justification to NAK it. If media wants things to keep working
> they have to do the technical path like you outline above.
>
> > Realistically this just isn't going to happen.
>
> If your series goes ahead it will get solved. Someone will take on the
> huge project to either add DMA buf to the drivers people still care
> about, or do the work above to transparently handle in kernel.
>
> If we allow things to keep working without consequence then nobody
> will do it.
>
> The only reason we did the 4 years of work in RDMA was because Linus
> went in and broke the uABI for a security fix. It was hundreds of
> patches to fix it, so I don't have much sympathy for "it is too hard"
> here.

Oh fully agreeing with you here, I just wanted to lay out that a)
there is a solid plan to fix it and b) it's way too much work for me
to just type it as a part of a "learn me some core mm semantics"
project :-)

I was hoping that we could get away with a special marker for
problematic vma, and filter those out. But after all the digging I've
noticed that on anything remotely modern, there's just nothing left.
Device memory management has become massively more dynamic in the past
10 years.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [2/2] drm/msm: Add support for GPU cooling

2020-10-09 Thread mka
Hi Akhil,

On Thu, Oct 08, 2020 at 10:39:07PM +0530, Akhil P Oommen wrote:
> Register GPU as a devfreq cooling device so that it can be passively
> cooled by the thermal framework.
> 
> Signed-off-by: Akhil P Oommen 
> ---
>  drivers/gpu/drm/msm/msm_gpu.c | 13 -
>  drivers/gpu/drm/msm/msm_gpu.h |  2 ++
>  2 files changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
> index 55d1648..93ffd66 100644
> --- a/drivers/gpu/drm/msm/msm_gpu.c
> +++ b/drivers/gpu/drm/msm/msm_gpu.c
> @@ -14,6 +14,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  
> @@ -107,9 +108,18 @@ static void msm_devfreq_init(struct msm_gpu *gpu)
>   if (IS_ERR(gpu->devfreq.devfreq)) {
>   DRM_DEV_ERROR(>pdev->dev, "Couldn't initialize GPU 
> devfreq\n");
>   gpu->devfreq.devfreq = NULL;
> + return;
>   }
>  
>   devfreq_suspend_device(gpu->devfreq.devfreq);
> +
> + gpu->cooling = of_devfreq_cooling_register(gpu->pdev->dev.of_node,
> + gpu->devfreq.devfreq);
> + if (IS_ERR(gpu->cooling)) {
> + DRM_DEV_ERROR(>pdev->dev,
> + "Couldn't register GPU cooling device\n");
> + gpu->cooling = NULL;
> + }
>  }
>  
>  static int enable_pwrrail(struct msm_gpu *gpu)
> @@ -926,7 +936,6 @@ int msm_gpu_init(struct drm_device *drm, struct 
> platform_device *pdev,
>  
>   msm_devfreq_init(gpu);
>  
> -
>   gpu->aspace = gpu->funcs->create_address_space(gpu, pdev);
>  
>   if (gpu->aspace == NULL)
> @@ -1005,4 +1014,6 @@ void msm_gpu_cleanup(struct msm_gpu *gpu)
>   gpu->aspace->mmu->funcs->detach(gpu->aspace->mmu);
>   msm_gem_address_space_put(gpu->aspace);
>   }
> +
> + devfreq_cooling_unregister(gpu->cooling);

Resources should be released in reverse order, otherwise the cooling device
could use resources that have already been freed.
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 14/17] resource: Move devmem revoke code to resource framework

2020-10-09 Thread Dan Williams
On Fri, Oct 9, 2020 at 7:32 AM Jason Gunthorpe  wrote:
>
> On Fri, Oct 09, 2020 at 04:24:45PM +0200, Daniel Vetter wrote:
> > On Fri, Oct 9, 2020 at 2:31 PM Jason Gunthorpe  wrote:
> > >
> > > On Fri, Oct 09, 2020 at 09:59:31AM +0200, Daniel Vetter wrote:
> > >
> > > > +struct address_space *iomem_get_mapping(void)
> > > > +{
> > > > + return iomem_inode->i_mapping;
> > >
> > > This should pair an acquire with the release below
> > >
> > > > + /*
> > > > +  * Publish /dev/mem initialized.
> > > > +  * Pairs with smp_load_acquire() in revoke_iomem().
> > > > +  */
> > > > + smp_store_release(_inode, inode);
> > >
> > > However, this seems abnormal, initcalls rarely do this kind of stuff
> > > with global data..
> > >
> > > The kernel crashes if this fs_initcall is raced with
> > > iomem_get_mapping() due to the unconditional dereference, so I think
> > > it can be safely switched to a simple assignment.
> >
> > Ah yes I checked this all, but forgot to correctly annotate the
> > iomem_get_mapping access. For reference, see b34e7e298d7a ("/dev/mem:
> > Add missing memory barriers for devmem_inode").
>
> Oh yikes, so revoke_iomem can run concurrently during early boot,
> tricky.

It runs early because request_mem_region() can run before fs_initcall.
Rather than add an unnecessary lock just arrange for the revoke to be
skipped before the inode is initialized. The expectation is that any
early resource reservations will block future userspace mapping
attempts.
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v1 0/4] Add support for Keem Bay VPU DRM driver

2020-10-09 Thread kuhanh . murugasen . krishnan
From: "Murugasen Krishnan, Kuhanh" 

This is a new DRM media codec driver for Intel's Keem Bay SOC which
integrates the Verisilicon's Hantro Video Processor Unit (VPU) IP.
The SoC couples an ARM Cortex A53 CPU with an Intel Movidius VPU.

Hantro VPU IP is a series of video decoder and encoder semiconductor IP cores,
which can be flexibly configured for video surveillance, multimedia consumer
products, Internet of Things, cloud service products, data centers, aerial
photography and recorders, thereby providing video transcoding and multi-channel
HD video encoding and decoding.

Hantro VPU IP consists of Hantro VC8000D for decoder and Hantro VC8000E for 
encoder.

Hantro VC8000D allows 4K decoding with a minimal silicon single-core solution 
that
supports HEVC and H.264 video formats, key features:
* HEVC Main10 and Main Profiles up to Level 5.2
* HEVC Main Still Profile
* H.264 Main and High Profiles up to Level 5.2
* HEVC, H.264 and JPEG decoding up to 4K@60fps
* 8 channels 1080p@30fps decoding

Hantro VC8000E allows 4K encoding with a minimal silicon single-core solution 
that
supports HEVC and H.264 video formats, key features:
* HEVC Main10, Main and Main Still Profile, level 5.1
* H.264 Baseline, Main and High, High10 level 5.2
* JPEG encoder 16Kx16K max resolution
* HEVC/H264 Support up to 4K@60fps performance single-core
* 8 channels 1080p@30fps encoding
* B-frame support for higher compression rates
* Reference Frame Compression

This driver is tested with the Keem Bay EVM board which is the reference baord
for Keem Bay SOC.

Device tree patches are under review here:
https://lore.kernel.org/linux-arm-kernel/20200708175020.194436-1-daniele.alessandre...@linux.intel.com/T/

Murugasen Krishnan, Kuhanh (4):
  drm: Add Keem Bay VPU codec DRM
  drm: hantro: Keem Bay VPU DRM encoder
  drm: hantro: Keem Bay VPU DRM decoder
  drm: hantro: Keem Bay VPU DRM build files

 drivers/gpu/drm/Kconfig  |2 +
 drivers/gpu/drm/Makefile |1 +
 drivers/gpu/drm/hantro/Kconfig   |   21 +
 drivers/gpu/drm/hantro/Makefile  |6 +
 drivers/gpu/drm/hantro/hantro_dec.c  | 1441 +
 drivers/gpu/drm/hantro/hantro_dec.h  |   59 ++
 drivers/gpu/drm/hantro/hantro_drm.c  | 1673 ++
 drivers/gpu/drm/hantro/hantro_drm.h  |  208 
 drivers/gpu/drm/hantro/hantro_dwl_defs.h |  101 ++
 drivers/gpu/drm/hantro/hantro_enc.c  |  738 +
 drivers/gpu/drm/hantro/hantro_enc.h  |   66 ++
 drivers/gpu/drm/hantro/hantro_fence.c|  284 +
 drivers/gpu/drm/hantro/hantro_priv.h |  106 ++
 13 files changed, 4706 insertions(+)
 create mode 100644 drivers/gpu/drm/hantro/Kconfig
 create mode 100644 drivers/gpu/drm/hantro/Makefile
 create mode 100644 drivers/gpu/drm/hantro/hantro_dec.c
 create mode 100644 drivers/gpu/drm/hantro/hantro_dec.h
 create mode 100644 drivers/gpu/drm/hantro/hantro_drm.c
 create mode 100644 drivers/gpu/drm/hantro/hantro_drm.h
 create mode 100644 drivers/gpu/drm/hantro/hantro_dwl_defs.h
 create mode 100644 drivers/gpu/drm/hantro/hantro_enc.c
 create mode 100644 drivers/gpu/drm/hantro/hantro_enc.h
 create mode 100644 drivers/gpu/drm/hantro/hantro_fence.c
 create mode 100644 drivers/gpu/drm/hantro/hantro_priv.h

-- 
1.9.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v1 3/4] drm: hantro: Keem Bay VPU DRM decoder

2020-10-09 Thread kuhanh . murugasen . krishnan
From: "Murugasen Krishnan, Kuhanh" 

Hantro VC8000D allows 4K decoding with a minimal silicon single-core solution 
that
supports HEVC and H.264 video formats, key features:
* HEVC Main10 and Main Profiles up to Level 5.2
* HEVC Main Still Profile
* H.264 Main and High Profiles up to Level 5.2
* HEVC, H.264 and JPEG decoding up to 4K@60fps
* 8 channels 1080p@30fps decoding

Signed-off-by: Murugasen Krishnan, Kuhanh 
---
 drivers/gpu/drm/hantro/hantro_dec.c  | 1441 ++
 drivers/gpu/drm/hantro/hantro_dec.h  |   59 ++
 drivers/gpu/drm/hantro/hantro_dwl_defs.h |  101 +++
 3 files changed, 1601 insertions(+)
 create mode 100644 drivers/gpu/drm/hantro/hantro_dec.c
 create mode 100644 drivers/gpu/drm/hantro/hantro_dec.h
 create mode 100644 drivers/gpu/drm/hantro/hantro_dwl_defs.h

diff --git a/drivers/gpu/drm/hantro/hantro_dec.c 
b/drivers/gpu/drm/hantro/hantro_dec.c
new file mode 100644
index 000..ac501f3
--- /dev/null
+++ b/drivers/gpu/drm/hantro/hantro_dec.c
@@ -0,0 +1,1441 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *Hantro decoder hardware driver.
+ *
+ *Copyright (c) 2017 - 2020, VeriSilicon Inc.
+ *Copyright (c) 2020 Intel Corporation
+ */
+
+#include "hantro_dec.h"
+#include "hantro_dwl_defs.h"
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+static const int dec_hwid[] = {
+   0x8001 /* VDEC */
+};
+
+ulong multicorebase[HXDEC_MAX_CORES] = {
+   SOCLE_LOGIC_0_BASE,
+   SOCLE_LOGIC_1_BASE
+};
+
+int irq[HXDEC_MAX_CORES] = {
+   DEC_IRQ_0,
+   DEC_IRQ_1
+};
+
+unsigned int iosize[HXDEC_MAX_CORES] = {
+   DEC_IO_SIZE_0,
+   DEC_IO_SIZE_1
+};
+
+/* KMB page lookup table */
+static unsigned long page_lut_read = KMB_VC8000D_PAGE_LUT;
+static u8 *page_lut_regs_read;
+
+/*
+ * Because one core may contain multi-pipeline,
+ * so multicore base may be changed
+ */
+unsigned long multicorebase_actual[HXDEC_MAX_CORES];
+int elements = 2;
+static struct device *parent_dev;
+
+struct hantrodec_t {
+   char *buffer;
+   unsigned int iosize[HXDEC_MAX_CORES];
+   u8 *hwregs[HXDEC_MAX_CORES];
+   int irq[HXDEC_MAX_CORES];
+   int hw_id[HXDEC_MAX_CORES];
+   int cores;
+   struct fasync_struct *async_queue_dec;
+   struct fasync_struct *async_queue_pp;
+};
+
+struct core_cfg {
+   /* indicate the supported format */
+   u32 cfg[HXDEC_MAX_CORES];
+   /* back up of cfg */
+   u32 cfg_backup[HXDEC_MAX_CORES];
+   /* indicate if main core exist */
+   int its_main_core_id[HXDEC_MAX_CORES];
+   /* indicate if aux core exist */
+   int its_aux_core_id[HXDEC_MAX_CORES];
+};
+
+static struct hantrodec_t hantrodec_data;
+static int reserve_io(void);
+static void release_io(void);
+static void reset_asic(struct hantrodec_t *dev);
+
+#ifdef HANTRODEC_DEBUG
+static void dump_regs(struct hantrodec_t *dev);
+#endif
+
+/* IRQ handler */
+static irqreturn_t hantrodec_isr(int irq, void *dev_id);
+static u32 dec_regs[HXDEC_MAX_CORES][DEC_IO_SIZE_MAX / 4];
+struct semaphore dec_core_sem;
+struct semaphore pp_core_sem;
+static int dec_irq;
+static int pp_irq;
+
+atomic_t irq_rx = ATOMIC_INIT(0);
+atomic_t irq_tx = ATOMIC_INIT(0);
+
+static struct file *dec_owner[HXDEC_MAX_CORES];
+static struct file *pp_owner[HXDEC_MAX_CORES];
+static int core_has_format(const u32 *cfg, int core, u32 format);
+
+static DEFINE_SPINLOCK(owner_lock);
+static DECLARE_WAIT_QUEUE_HEAD(dec_wait_queue);
+static DECLARE_WAIT_QUEUE_HEAD(pp_wait_queue);
+static DECLARE_WAIT_QUEUE_HEAD(hw_queue);
+
+static struct core_cfg config;
+static u32 timeout;
+
+static struct clk *hantro_clk_xin_vdec;
+static struct clk *hantro_clk_vdec;
+
+static int hantro_clk_enable(void)
+{
+   clk_prepare_enable(hantro_clk_xin_vdec);
+   clk_prepare_enable(hantro_clk_vdec);
+
+   return 0;
+}
+
+static int hantro_clk_disable(void)
+{
+   if (hantro_clk_xin_vdec)
+   clk_disable_unprepare(hantro_clk_xin_vdec);
+
+   if (hantro_clk_vdec)
+   clk_disable_unprepare(hantro_clk_vdec);
+
+   return 0;
+}
+
+u32 hantrodec_readbandwidth(int is_read_bw)
+{
+   int i;
+   u32 bandwidth = 0;
+   struct hantrodec_t *dev = _data;
+
+   for (i = 0; i < hantrodec_data.cores; i++) {
+   if (is_read_bw)
+   bandwidth +=
+   ioread32((void *)(dev->hwregs[i] +
+ HANTRO_VC8KD_REG_BWREAD * 4));
+   else
+   bandwidth += ioread32
+   ((void *)(dev->hwregs[i] +
+HANTRO_VC8KD_REG_BWWRITE * 4));
+   }
+
+   return bandwidth * VC8KD_BURSTWIDTH;
+}
+
+static void 

[PATCH v1 4/4] drm: hantro: Keem Bay VPU DRM build files

2020-10-09 Thread kuhanh . murugasen . krishnan
From: "Murugasen Krishnan, Kuhanh" 

Signed-off-by: Murugasen Krishnan, Kuhanh 
---
 drivers/gpu/drm/Kconfig |  2 ++
 drivers/gpu/drm/Makefile|  1 +
 drivers/gpu/drm/hantro/Kconfig  | 21 +
 drivers/gpu/drm/hantro/Makefile |  6 ++
 4 files changed, 30 insertions(+)
 create mode 100644 drivers/gpu/drm/hantro/Kconfig
 create mode 100644 drivers/gpu/drm/hantro/Makefile

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 147d61b..723aa68 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -275,6 +275,8 @@ source "drivers/gpu/drm/nouveau/Kconfig"
 
 source "drivers/gpu/drm/i915/Kconfig"
 
+source "drivers/gpu/drm/hantro/Kconfig"
+
 config DRM_VGEM
tristate "Virtual GEM provider"
depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 2f31579..d79d1fc 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
 obj-$(CONFIG_DRM_MGA)  += mga/
 obj-$(CONFIG_DRM_I810) += i810/
 obj-$(CONFIG_DRM_I915) += i915/
+obj-$(CONFIG_DRM_HANTRO)  += hantro/
 obj-$(CONFIG_DRM_MGAG200) += mgag200/
 obj-$(CONFIG_DRM_V3D)  += v3d/
 obj-$(CONFIG_DRM_VC4)  += vc4/
diff --git a/drivers/gpu/drm/hantro/Kconfig b/drivers/gpu/drm/hantro/Kconfig
new file mode 100644
index 000..cbf6d99
--- /dev/null
+++ b/drivers/gpu/drm/hantro/Kconfig
@@ -0,0 +1,21 @@
+# SPDX-License-Identifier: GPL-2.0-only
+config DRM_HANTRO
+   tristate "Hantro DRM"
+   depends on DRM
+   depends on ARM64
+   select DRM_PANEL
+   select DRM_KMS_HELPER
+   help
+ Choose this option if you have a system that has "Keem
+ Bay VPU" hardware which supports Verisilicon's Hantro
+ Video Processor Unit (VPU) IP, a series of video decoder
+ and encoder semiconductor IP cores which can be flexibly
+ configured for video surveillance, multimedia consumer
+ products, Internet of Things, cloud service products, data
+ centers, aerial photography and recorders, thereby providing
+ video transconding and multi-channel HD video encoding and
+ decoding.
+
+ Hantro VC8000D allows 4K decoding that supports H264 and HEVC
+ video formats. Hantro VC8000E allows 4K encoding that supports
+ H264 and HEVC video formats.
diff --git a/drivers/gpu/drm/hantro/Makefile b/drivers/gpu/drm/hantro/Makefile
new file mode 100644
index 000..ade521e7
--- /dev/null
+++ b/drivers/gpu/drm/hantro/Makefile
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Makefile for the Hantro DRM media codec driver. This driver provides
+# support for Keem Bay Hantro VPU IP.
+hantro-objs := hantro_drm.o hantro_enc.o hantro_dec.o hantro_fence.o
+obj-$(CONFIG_DRM_HANTRO) += hantro.o
-- 
1.9.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v1 1/4] drm: Add Keem Bay VPU codec DRM

2020-10-09 Thread kuhanh . murugasen . krishnan
From: "Murugasen Krishnan, Kuhanh" 

This is a new DRM media codec driver for Intel's Keem Bay SOC which
integrates the Verisilicon's Hantro Video Processor Unit (VPU) IP.
The SoC couples an ARM Cortex A53 CPU with an Intel Movidius VPU.

Hantro VPU IP is a series of video decoder and encoder semiconductor IP cores,
which can be flexibly configured for video surveillance, multimedia consumer
products, Internet of Things, cloud service products, data centers, aerial
photography and recorders, thereby providing video transcoding and multi-channel
HD video encoding and decoding.

Hantro VPU IP consists of Hantro VC8000D for decoder and Hantro VC8000E for 
encoder.

Signed-off-by: Murugasen Krishnan, Kuhanh 
Acked-by: Mark, Gross 
---
 drivers/gpu/drm/hantro/hantro_drm.c   | 1673 +
 drivers/gpu/drm/hantro/hantro_drm.h   |  208 
 drivers/gpu/drm/hantro/hantro_fence.c |  284 ++
 drivers/gpu/drm/hantro/hantro_priv.h  |  106 +++
 4 files changed, 2271 insertions(+)
 create mode 100644 drivers/gpu/drm/hantro/hantro_drm.c
 create mode 100644 drivers/gpu/drm/hantro/hantro_drm.h
 create mode 100644 drivers/gpu/drm/hantro/hantro_fence.c
 create mode 100644 drivers/gpu/drm/hantro/hantro_priv.h

diff --git a/drivers/gpu/drm/hantro/hantro_drm.c 
b/drivers/gpu/drm/hantro/hantro_drm.c
new file mode 100644
index 000..50ccddf
--- /dev/null
+++ b/drivers/gpu/drm/hantro/hantro_drm.c
@@ -0,0 +1,1673 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *Hantro driver main DRM file
+ *
+ *Copyright (c) 2017 - 2020, VeriSilicon Inc.
+ *Copyright (c) 2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+/* hantro header */
+#include "hantro_priv.h"
+#include "hantro_enc.h"
+#include "hantro_dec.h"
+/* for dynamic ddr */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct hantro_device_handle hantro_dev;
+
+/* struct used for dynamic ddr allocations */
+struct hantro_mem ddr1;
+struct device *ddr_dev;
+
+static u32 hantro_vblank_no_hw_counter(struct drm_device *dev,
+  unsigned int pipe)
+{
+   return 0;
+}
+
+static int hantro_recordmem(struct drm_file *priv, void *obj, int size)
+{
+   int ret;
+   struct idr *list = (struct idr *)priv->driver_priv;
+
+   ret = idr_alloc(list, obj, 1, 0, GFP_KERNEL);
+
+   return (ret > 0 ? 0 : -ENOMEM);
+}
+
+static void hantro_unrecordmem(struct drm_file *priv, void *obj)
+{
+   int id;
+   struct idr *list = (struct idr *)priv->driver_priv;
+   void *gemobj;
+
+   idr_for_each_entry(list, gemobj, id) {
+   if (gemobj == obj) {
+   idr_remove(list, id);
+   break;
+   }
+   }
+}
+
+static void hantro_drm_fb_destroy(struct drm_framebuffer *fb)
+{
+   struct hantro_drm_fb *vsi_fb = (struct hantro_drm_fb *)fb;
+   int i;
+
+   for (i = 0; i < 4; i++)
+   hantro_unref_drmobj(vsi_fb->obj[i]);
+
+   drm_framebuffer_cleanup(fb);
+   kfree(vsi_fb);
+}
+
+static int hantro_drm_fb_create_handle(struct drm_framebuffer *fb,
+  struct drm_file *file_priv,
+  unsigned int *handle)
+{
+   struct hantro_drm_fb *vsi_fb = (struct hantro_drm_fb *)fb;
+
+   return drm_gem_handle_create(file_priv, vsi_fb->obj[0], handle);
+}
+
+static int hantro_drm_fb_dirty(struct drm_framebuffer *fb,
+  struct drm_file *file, unsigned int flags,
+  unsigned int color, struct drm_clip_rect *clips,
+  unsigned int num_clips)
+{
+   return 0;
+}
+
+static const struct drm_framebuffer_funcs hantro_drm_fb_funcs = {
+   .destroy = hantro_drm_fb_destroy,
+   .create_handle = hantro_drm_fb_create_handle,
+   .dirty = hantro_drm_fb_dirty,
+};
+
+static int hantro_gem_dumb_create_internal(struct drm_file *file_priv,
+  struct drm_device *dev,
+  struct drm_mode_create_dumb *args)
+{
+   int ret = 0;
+   int in_size, out_size;
+   struct drm_gem_hantro_object *cma_obj;
+   int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
+   struct drm_gem_object *obj;
+
+   if (mutex_lock_interruptible(>struct_mutex))
+   return -EBUSY;
+   cma_obj = kzalloc(sizeof(*cma_obj), GFP_KERNEL);
+   if (!cma_obj) {
+   ret = -ENOMEM;
+   goto out;
+   }
+   obj = _obj->base;
+   out_size = sizeof(*args);
+   in_size = sizeof(*args);
+   args->pitch = ALIGN(min_pitch, 64);
+   args->size = (__u64)args->pitch * (__u64)args->height;
+   args->size = (args->size + PAGE_SIZE - 1) / PAGE_SIZE * PAGE_SIZE;
+
+   

[PATCH v1 2/4] drm: hantro: Keem Bay VPU DRM encoder

2020-10-09 Thread kuhanh . murugasen . krishnan
From: "Murugasen Krishnan, Kuhanh" 

Hantro VC8000E allows 4K encoding with a minimal silicon single-core solution 
that
supports HEVC and H.264 video formats, key features:
* HEVC Main10, Main and Main Still Profile, level 5.1
* H.264 Baseline, Main and High, High10 level 5.2
* JPEG encoder 16Kx16K max resolution
* HEVC/H264 Support up to 4K@60fps performance single-core
* 8 channels 1080p@30fps encoding
* B-frame support for higher compression rates
* Reference Frame Compression

Signed-off-by: Murugasen Krishnan, Kuhanh 
---
 drivers/gpu/drm/hantro/hantro_enc.c | 738 
 drivers/gpu/drm/hantro/hantro_enc.h |  66 
 2 files changed, 804 insertions(+)
 create mode 100644 drivers/gpu/drm/hantro/hantro_enc.c
 create mode 100644 drivers/gpu/drm/hantro/hantro_enc.h

diff --git a/drivers/gpu/drm/hantro/hantro_enc.c 
b/drivers/gpu/drm/hantro/hantro_enc.c
new file mode 100644
index 000..35d1153
--- /dev/null
+++ b/drivers/gpu/drm/hantro/hantro_enc.c
@@ -0,0 +1,738 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *Hantro encoder hardware driver.
+ *
+ *Copyright (c) 2017 - 2020, VeriSilicon Inc.
+ *Copyright (c) 2020 Intel Corporation
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "hantro_enc.h"
+#include 
+#include 
+
+struct semaphore enc_core_sem;
+static DECLARE_WAIT_QUEUE_HEAD(enc_hw_queue);
+static DEFINE_SPINLOCK(enc_owner_lock);
+static DECLARE_WAIT_QUEUE_HEAD(enc_wait_queue);
+
+/* for all cores, the core info should be listed here for subsequent use */
+/* base_addr, iosize, irq, resource_shared */
+struct enc_core enc_core_array[] = {
+   { CORE_0_IO_ADDR, CORE_0_IO_SIZE, INT_PIN_CORE_0,
+ RESOURCE_SHARED_INTER_CORES }, /* core_0, hevc and avc */
+   { CORE_1_IO_ADDR, CORE_1_IO_SIZE, INT_PIN_CORE_1,
+ RESOURCE_SHARED_INTER_CORES } /* core_1, jpeg */
+};
+
+/* Interrupt Pin Name */
+const char *core_irq_names[] = {
+   "irq_hantro_videoencoder",   /* core_0, hevc and avc */
+   "irq_hantro_jpegencoder"/* core_1, jpeg */
+};
+
+/* KMB VC8000E page lookup table */
+static unsigned long page_lut_read = KMB_VC8000E_PAGE_LUT;
+static u8 *page_lut_regs_read;
+
+static struct clk *hantro_clk_xin_venc;
+static struct clk *hantro_clk_xin_jpeg;
+static struct clk *hantro_clk_venc;
+static struct clk *hantro_clk_jpeg;
+
+static int hantro_clk_enable(void)
+{
+   clk_prepare_enable(hantro_clk_xin_venc);
+   clk_prepare_enable(hantro_clk_xin_jpeg);
+   clk_prepare_enable(hantro_clk_venc);
+   clk_prepare_enable(hantro_clk_jpeg);
+
+   return 0;
+}
+
+static int hantro_clk_disable(void)
+{
+   if (hantro_clk_xin_venc)
+   clk_disable_unprepare(hantro_clk_xin_venc);
+
+   if (hantro_clk_venc)
+   clk_disable_unprepare(hantro_clk_venc);
+
+   if (hantro_clk_xin_jpeg)
+   clk_disable_unprepare(hantro_clk_xin_jpeg);
+
+   if (hantro_clk_jpeg)
+   clk_disable_unprepare(hantro_clk_jpeg);
+
+   return 0;
+}
+
+/***TYPE AND FUNCTION DECLARATION/
+struct hantroenc_t {
+   struct enc_core core_cfg;   //config of each core,such as base 
addr, irq,etc
+   u32 hw_id;  //hw id to indicate project
+   u32 core_id;//core id for driver and sw internal use
+   u32 is_valid;   //indicate this core is hantro's core or not
+   u32 is_reserved;//indicate this core is occupied by user or not
+   int pid;//indicate which process is occupying the core
+   u32 irq_received;   //indicate this core receives irq
+   u32 irq_status;
+   char *buffer;
+   unsigned int buffsize;
+   u8 *hwregs;
+   struct fasync_struct *async_queue;
+};
+
+static int reserve_io(void);
+static void release_io(void);
+static void reset_asic(struct hantroenc_t *dev);
+static int check_core_occupation(struct hantroenc_t *dev);
+static void release_encoder(struct hantroenc_t *dev, u32 *core_info);
+
+#ifdef hantroenc_DEBUG
+static void dump_regs(unsigned long data);
+#endif
+
+/* IRQ handler */
+static irqreturn_t hantroenc_isr(int irq, void *dev_id);
+
+/*local variable declaration*/
+unsigned long sram_base;
+unsigned int sram_size;
+/* and this is our MAJOR; use 0 for dynamic allocation (recommended) */
+static int hantroenc_major;
+static int total_core_num;
+/* dynamic allocation */
+static struct hantroenc_t *hantroenc_data;
+
+/**/
+static int check_enc_irq(struct hantroenc_t *dev, u32 *core_info, u32 
*irq_status)
+{
+   unsigned long flags;
+   int rdy = 0;
+   u32 i = 0;
+   u8 core_mapping = 0;
+
+   core_mapping = (u8)(*core_info & 

RE: [Intel-gfx] [PATCH] drm/i915/ehl: Remove require_force_probe protection

2020-10-09 Thread Pandey, Hariom
Hi Srinivas,

Take Sunil's help who has recently validated RC6 on EHL DRM tip and found to be 
passing. If the WA were sporadically failing and if you confirm that RC6 is 
passing, this patch can be proceeded with. 

Thanks
Hariom Pandey

-Original Message-
From: Vivi, Rodrigo  
Sent: Friday, October 9, 2020 7:09 PM
To: K, SrinivasX 
Cc: Souza, Jose ; ch...@chris-wilson.co.uk; Ausmus, James 
; Nikula, Jani ; Pandey, Hariom 
; Roper, Matthew D ; 
intel-...@lists.freedesktop.org; dri-devel@lists.freedesktop.org; Surendrakumar 
Upadhyay, TejaskumarX 
Subject: Re: [Intel-gfx] [PATCH] drm/i915/ehl: Remove require_force_probe 
protection



> On Oct 9, 2020, at 1:31 AM, K, SrinivasX  wrote:
> 
> Hi Rodrigo,
> 
> How do we get W/A and rc6 changes in, do you have any details?

I told based on what I was seeing on 
https://intel-gfx-ci.01.org/tree/drm-tip/drmtip-alt.html?
focusing on the issues that are exclusively for ehl and not happening on other 
platforms.

It looks like workarounds are fine there now. so I'm not sure if it was 
sporadic thing that day.

for the rc6 there are a few testcases failing around it:
https://intel-gfx-ci.01.org/tree/drm-tip/drmtip_675/fi-ehl-1/igt@i915_pm_rc6_reside...@rc6-fence.html
https://intel-gfx-ci.01.org/tree/drm-tip/drmtip_675/fi-ehl-1/igt@i915_pm_rc6_reside...@rc6-idle.html
https://intel-gfx-ci.01.org/tree/drm-tip/drmtip_675/fi-ehl-1/igt@i915_selftest@live@gt_pm.html#dmesg-warnings415

> 
> Thanks,
> Srinivas
> 
> -Original Message-
> From: Souza, Jose 
> Sent: 06 October 2020 23:33
> To: Vivi, Rodrigo ; ch...@chris-wilson.co.uk
> Cc: Ausmus, James ; Nikula, Jani 
> ; Pandey, Hariom ; 
> Roper, Matthew D ; 
> intel-...@lists.freedesktop.org; dri-devel@lists.freedesktop.org; K, 
> SrinivasX ; Surendrakumar Upadhyay, TejaskumarX 
> 
> Subject: Re: [Intel-gfx] [PATCH] drm/i915/ehl: Remove 
> require_force_probe protection
> 
> On Tue, 2020-10-06 at 10:55 -0700, Vivi, Rodrigo wrote:
>> 
>>> On Oct 6, 2020, at 10:48 AM, Chris Wilson  wrote:
>>> 
>>> Quoting Souza, Jose (2020-10-06 18:46:45)
 +Rodrigo and Jani
 
 On Tue, 2020-10-06 at 14:56 +, Kamati Srinivas wrote:
> Removing force probe protection from EHL platform. Did not observe 
> warnings, errors, flickering or any visual defects while doing 
> ordinary tasks like browsing and editing documents in a two 
> monitor setup.
 
 One of the requirements was also to have CI BAT all green and 
 shards as green is possible but EHL don't show up in CI results, we 
 actually have one single EHL machine in CI but I guess it is not able to 
 run all tests that shards do:
 https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9097/filelist.html
>>> 
>>> https://intel-gfx-ci.01.org/tree/drm-tip/drmtip-alt.html
>> 
>> we are really close to that point. We just need to fix some w/a and
>> rc6 issues before applying this change.
>> 
>>> -Chris
>> 
> 
> Huum okay we have drm-tip results for EHL but if someone sends a patch that 
> breaks EHL it will not be caught in pre-merge testing.
> 


___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 09/17] mm: Add unsafe_follow_pfn

2020-10-09 Thread Daniel Vetter
On Fri, Oct 9, 2020 at 2:48 PM Jason Gunthorpe  wrote:
>
> On Fri, Oct 09, 2020 at 02:37:23PM +0200, Mauro Carvalho Chehab wrote:
>
> > I'm not a mm/ expert, but, from what I understood from Daniel's patch
> > description is that this is unsafe *only if*  __GFP_MOVABLE is used.
>
> No, it is unconditionally unsafe. The CMA movable mappings are
> specific VMAs that will have bad issues here, but there are other
> types too.
>
> The only way to do something at a VMA level is to have a list of OK
> VMAs, eg because they were creatd via a special mmap helper from the
> media subsystem.
>
> > Well, no drivers inside the media subsystem uses such flag, although
> > they may rely on some infrastructure that could be using it behind
> > the bars.
>
> It doesn't matter, nothing prevents the user from calling media APIs
> on mmaps it gets from other subsystems.

I think a good first step would be to disable userptr of non struct
page backed storage going forward for any new hw support. Even on
existing drivers. dma-buf sharing has been around for long enough now
that this shouldn't be a problem. Unfortunately right now this doesn't
seem to exist, so the entire problem keeps getting perpetuated.

> > If this is the case, the proper fix seems to have a GFP_NOT_MOVABLE
> > flag that it would be denying the core mm code to set __GFP_MOVABLE.
>
> We can't tell from the VMA these kinds of details..
>
> It has to go the other direction, evey mmap that might be used as a
> userptr here has to be found and the VMA specially created to allow
> its use. At least that is a kernel only change, but will need people
> with the HW to do this work.

I think the only reasonable way to keep this working is:
- add a struct dma_buf *vma_tryget_dma_buf(struct vm_area_struct *vma);
- add dma-buf export support to fbdev and v4l
- roll this out everywhere we still need it.

Realistically this just isn't going to happen. And anything else just
reimplements half of dma-buf, which is kinda pointless (you need
minimally refcounting and some way to get at a promise of a permanent
sg list for dma. Plus probably the vmap for kernel cpu access.

> > Please let address the issue on this way, instead of broken an
> > userspace API that it is there since 1991.
>
> It has happened before :( It took 4 years for RDMA to undo the uAPI
> breakage caused by a security fix for something that was a 15 years
> old bug.

Yeah we have a bunch of these on the drm side too. Some of them are
really just "you have to upgrade userspace", and there's no real fix
for the security nightmare without that.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


(Cc: drm-misc/intel maintainers) Re: [PATCH 1/2] drm/i915/dpcd_bl: uncheck PWM_PIN_CAP when detect eDP backlight capabilities

2020-10-09 Thread Lyude Paul
For the whole series:

For the whole series:

Reviewed-by: Lyude Paul 

I'm going to add a Cc for stable so that it can be backported, and I'll push it
to drm-intel-next-queued once I get the OK from drm-misc/i915 folks

On Fri, 2020-10-09 at 16:57 +0800, Aaron Ma wrote:
> BOE panel with ID 2270 claims both PWM_PIN_CAP and AUX_SET_CAP backlight
> control bits, but default chip backlight failed to control brightness.
> 
> Check AUX_SET_CAP and proceed to check quirks or VBT backlight type.
> DPCD can control the brightness of this pannel.
> 
> Signed-off-by: Aaron Ma 
> ---
>  drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> index acbd7eb66cbe..308b14159b7c 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> @@ -334,8 +334,7 @@ intel_dp_aux_display_control_capable(struct
> intel_connector *connector)
>* the panel can support backlight control over the aux channel
>*/
>   if (intel_dp->edp_dpcd[1] & DP_EDP_TCON_BACKLIGHT_ADJUSTMENT_CAP &&
> - (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_BRIGHTNESS_AUX_SET_CAP) &&
> - !(intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_BRIGHTNESS_PWM_PIN_CAP))
> {
> + (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_BRIGHTNESS_AUX_SET_CAP)) {
>   drm_dbg_kms(>drm, "AUX Backlight Control Supported!\n");
>   return true;
>   }
-- 
Sincerely,
  Lyude Paul (she/her)
  Software Engineer at Red Hat

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [git pull] drm amdgpu fixes for 5.9 final

2020-10-09 Thread pr-tracker-bot
The pull request you sent on Fri, 9 Oct 2020 14:29:16 +1000:

> git://anongit.freedesktop.org/drm/drm tags/drm-fixes-2020-10-09

has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/fd330b1bc2f5840d68cbfa61c60573b4250bf14f

Thank you!

-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/prtracker.html
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 06/17] media: videobuf2: Move frame_vector into media subsystem

2020-10-09 Thread Daniel Vetter
On Fri, Oct 09, 2020 at 12:14:17PM +0200, Mauro Carvalho Chehab wrote:
> Em Fri,  9 Oct 2020 09:59:23 +0200
> Daniel Vetter  escreveu:
> 
> > It's the only user. This also garbage collects the CONFIG_FRAME_VECTOR
> > symbol from all over the tree (well just one place, somehow omap media
> > driver still had this in its Kconfig, despite not using it).
> > 
> > Reviewed-by: John Hubbard 
> > Signed-off-by: Daniel Vetter 
> > Cc: Jason Gunthorpe 
> > Cc: Pawel Osciak 
> > Cc: Marek Szyprowski 
> > Cc: Kyungmin Park 
> > Cc: Tomasz Figa 
> > Cc: Mauro Carvalho Chehab 
> > Cc: Andrew Morton 
> > Cc: John Hubbard 
> > Cc: Jérôme Glisse 
> > Cc: Jan Kara 
> > Cc: Dan Williams 
> > Cc: linux...@kvack.org
> > Cc: linux-arm-ker...@lists.infradead.org
> > Cc: linux-samsung-...@vger.kernel.org
> > Cc: linux-me...@vger.kernel.org
> > Cc: Daniel Vetter 
> > ---
> >  drivers/media/common/videobuf2/Kconfig|  1 -
> >  drivers/media/common/videobuf2/Makefile   |  1 +
> >  .../media/common/videobuf2}/frame_vector.c|  2 +
> >  drivers/media/platform/omap/Kconfig   |  1 -
> >  include/linux/mm.h| 42 ---
> >  include/media/videobuf2-core.h| 42 +++
> >  mm/Kconfig|  3 --
> >  mm/Makefile   |  1 -
> >  8 files changed, 45 insertions(+), 48 deletions(-)
> >  rename {mm => drivers/media/common/videobuf2}/frame_vector.c (99%)
> > 
> > diff --git a/drivers/media/common/videobuf2/Kconfig 
> > b/drivers/media/common/videobuf2/Kconfig
> > index edbc99ebba87..d2223a12c95f 100644
> > --- a/drivers/media/common/videobuf2/Kconfig
> > +++ b/drivers/media/common/videobuf2/Kconfig
> > @@ -9,7 +9,6 @@ config VIDEOBUF2_V4L2
> >  
> >  config VIDEOBUF2_MEMOPS
> > tristate
> > -   select FRAME_VECTOR
> >  
> >  config VIDEOBUF2_DMA_CONTIG
> > tristate
> > diff --git a/drivers/media/common/videobuf2/Makefile 
> > b/drivers/media/common/videobuf2/Makefile
> > index 77bebe8b202f..54306f8d096c 100644
> > --- a/drivers/media/common/videobuf2/Makefile
> > +++ b/drivers/media/common/videobuf2/Makefile
> > @@ -1,5 +1,6 @@
> >  # SPDX-License-Identifier: GPL-2.0
> >  videobuf2-common-objs := videobuf2-core.o
> > +videobuf2-common-objs += frame_vector.o
> >  
> >  ifeq ($(CONFIG_TRACEPOINTS),y)
> >videobuf2-common-objs += vb2-trace.o
> > diff --git a/mm/frame_vector.c 
> > b/drivers/media/common/videobuf2/frame_vector.c
> > similarity index 99%
> > rename from mm/frame_vector.c
> > rename to drivers/media/common/videobuf2/frame_vector.c
> > index d44779e56313..2b0b97761d15 100644
> > --- a/mm/frame_vector.c
> > +++ b/drivers/media/common/videobuf2/frame_vector.c
> > @@ -8,6 +8,8 @@
> >  #include 
> >  #include 
> >  
> > +#include 
> > +
> 
> See my comment below...
> 
> >  /**
> >   * get_vaddr_frames() - map virtual addresses to pfns
> >   * @start: starting user address
> > diff --git a/drivers/media/platform/omap/Kconfig 
> > b/drivers/media/platform/omap/Kconfig
> > index f73b5893220d..de16de46c0f4 100644
> > --- a/drivers/media/platform/omap/Kconfig
> > +++ b/drivers/media/platform/omap/Kconfig
> > @@ -12,6 +12,5 @@ config VIDEO_OMAP2_VOUT
> > depends on VIDEO_V4L2
> > select VIDEOBUF2_DMA_CONTIG
> > select OMAP2_VRFB if ARCH_OMAP2 || ARCH_OMAP3
> > -   select FRAME_VECTOR
> > help
> >   V4L2 Display driver support for OMAP2/3 based boards.
> > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > index 16b799a0522c..acd60fbf1a5a 100644
> > --- a/include/linux/mm.h
> > +++ b/include/linux/mm.h
> > @@ -1743,48 +1743,6 @@ int account_locked_vm(struct mm_struct *mm, unsigned 
> > long pages, bool inc);
> >  int __account_locked_vm(struct mm_struct *mm, unsigned long pages, bool 
> > inc,
> > struct task_struct *task, bool bypass_rlim);
> >  
> > -/* Container for pinned pfns / pages */
> > -struct frame_vector {
> > -   unsigned int nr_allocated;  /* Number of frames we have space for */
> > -   unsigned int nr_frames; /* Number of frames stored in ptrs array */
> > -   bool got_ref;   /* Did we pin pages by getting page ref? */
> > -   bool is_pfns;   /* Does array contain pages or pfns? */
> > -   void *ptrs[];   /* Array of pinned pfns / pages. Use
> > -* pfns_vector_pages() or pfns_vector_pfns()
> > -* for access */
> > -};
> > -
> > -struct frame_vector *frame_vector_create(unsigned int nr_frames);
> > -void frame_vector_destroy(struct frame_vector *vec);
> > -int get_vaddr_frames(unsigned long start, unsigned int nr_pfns,
> > -unsigned int gup_flags, struct frame_vector *vec);
> > -void put_vaddr_frames(struct frame_vector *vec);
> > -int frame_vector_to_pages(struct frame_vector *vec);
> > -void frame_vector_to_pfns(struct frame_vector *vec);
> > -
> > -static inline unsigned int frame_vector_count(struct frame_vector *vec)
> > 

Re: [PATCH 1/2] arm64: dts: qcom: sc7180: Add gpu cooling support

2020-10-09 Thread Matthias Kaehlcke
On Fri, Oct 09, 2020 at 08:05:10AM -0700, Doug Anderson wrote:
> Hi,
> 
> On Thu, Oct 8, 2020 at 10:10 AM Akhil P Oommen  wrote:
> >
> > Add cooling-cells property and the cooling maps for the gpu tzones
> > to support GPU cooling.
> >
> > Signed-off-by: Akhil P Oommen 
> > ---
> >  arch/arm64/boot/dts/qcom/sc7180.dtsi | 29 ++---
> >  1 file changed, 22 insertions(+), 7 deletions(-)
> >
> > diff --git a/arch/arm64/boot/dts/qcom/sc7180.dtsi 
> > b/arch/arm64/boot/dts/qcom/sc7180.dtsi
> > index d46b383..40d6a28 100644
> > --- a/arch/arm64/boot/dts/qcom/sc7180.dtsi
> > +++ b/arch/arm64/boot/dts/qcom/sc7180.dtsi
> > @@ -2,7 +2,7 @@
> >  /*
> >   * SC7180 SoC device tree source
> >   *
> > - * Copyright (c) 2019, The Linux Foundation. All rights reserved.
> > + * Copyright (c) 2019-20, The Linux Foundation. All rights reserved.
> >   */
> >
> >  #include 
> > @@ -1885,6 +1885,7 @@
> > iommus = <_smmu 0>;
> > operating-points-v2 = <_opp_table>;
> > qcom,gmu = <>;
> > +   #cooling-cells = <2>;
> 
> Presumably we should add this to the devicetree bindings, too?
> 
> 
> > interconnects = <_noc MASTER_GFX3D _virt 
> > SLAVE_EBI1>;
> > interconnect-names = "gfx-mem";
> > @@ -3825,16 +3826,16 @@
> > };
> >
> > gpuss0-thermal {
> > -   polling-delay-passive = <0>;
> > +   polling-delay-passive = <100>;
> 
> Why did you make this change?  I'm pretty sure that we _don't_ want
> this since we're using interrupts for the thermal sensor.  See commit
> 22337b91022d ("arm64: dts: qcom: sc7180: Changed polling mode in
> Thermal-zones node").

I was going to ask the same, this shouldn't be needed.

> > polling-delay = <0>;
> >
> > thermal-sensors = < 13>;
> >
> > trips {
> > gpuss0_alert0: trip-point0 {
> > -   temperature = <9>;
> > +   temperature = <95000>;
> > hysteresis = <2000>;
> > -   type = "hot";
> > +   type = "passive";
> 
> Matthias probably knows better, but I wonder if we should be making
> two passive trip levels like we do with CPU.  IIRC this is important
> if someone wants to be able to use this with IPA.

Yes, please introduce a second trip point and make both of them
'passive'.

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] MAINTAINERS: Add myself as a maintainer for vc4

2020-10-09 Thread Eric Anholt
Reviewed-by: Eric Anholt 

I'd be fine with retiring from being maintainer, too.  I'm definitely
not active.

On Fri, Oct 9, 2020 at 12:50 AM Maxime Ripard  wrote:
>
> Eric isn't working on vc4 anymore and I've been working on it, as well as
> merging patches for it, recently so let's make it official so I don't miss
> patches.
>
> Signed-off-by: Maxime Ripard 
> ---
>  MAINTAINERS | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 91d46806e511..a248e3a2b537 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -5957,6 +5957,7 @@ F:include/uapi/drm/v3d_drm.h
>
>  DRM DRIVERS FOR VC4
>  M: Eric Anholt 
> +M: Maxime Ripard 
>  S: Supported
>  T: git git://github.com/anholt/linux
>  T: git git://anongit.freedesktop.org/drm/drm-misc
> --
> 2.26.2
>
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 6/6] drm/prime: document that use the page array is deprecated v2

2020-10-09 Thread Daniel Vetter
On Fri, Oct 9, 2020 at 6:24 PM Daniel Vetter  wrote:
>
> On Fri, Oct 09, 2020 at 05:03:42PM +0200, Christian König wrote:
> > We have reoccurring requests on this so better document that
> > this approach doesn't work and dma_buf_mmap() needs to be used instead.
> >
> > v2: split it into two functions
> >
> > Signed-off-by: Christian König 
>
> Patches 3-5:
>
> Acked-by: Daniel Vetter 
>
> This one looks good, but you have it on a strange baseline. This doesn't
> contain the sg walking fixes from Marek, so reintroduces the bugs.
> Probably need to request a backmerge chain, first of -rc8 into drm-next,
> and then that into drm-misc-next.

Marek's patch is in drm-next, so just needs a backmerge into drm-misc-next.

Thomas, can you pls do that? We need 0552daac2d18f

I'll wait for the next round for patches 1&2 since Jason seems to have
found a small issue with them.
-Daniel

>
> Everything else in here lgtm.
> -Daniel
>
>
>
> > ---
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c |  9 ++-
> >  drivers/gpu/drm/drm_prime.c | 67 +++--
> >  drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c |  3 +-
> >  drivers/gpu/drm/msm/msm_gem.c   |  2 +-
> >  drivers/gpu/drm/nouveau/nouveau_bo.c|  5 +-
> >  drivers/gpu/drm/radeon/radeon_ttm.c |  9 ++-
> >  drivers/gpu/drm/vgem/vgem_drv.c |  3 +-
> >  drivers/gpu/drm/vkms/vkms_gem.c |  2 +-
> >  drivers/gpu/drm/xen/xen_drm_front_gem.c |  4 +-
> >  include/drm/drm_prime.h |  7 ++-
> >  10 files changed, 69 insertions(+), 42 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> > index ac463e706b19..6a65490de391 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> > @@ -1011,8 +1011,8 @@ static int amdgpu_ttm_tt_pin_userptr(struct 
> > ttm_bo_device *bdev,
> >   goto release_sg;
> >
> >   /* convert SG to linear array of pages and dma addresses */
> > - drm_prime_sg_to_page_addr_arrays(ttm->sg, NULL, gtt->ttm.dma_address,
> > -  ttm->num_pages);
> > + drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address,
> > +ttm->num_pages);
> >
> >   return 0;
> >
> > @@ -1345,9 +1345,8 @@ static int amdgpu_ttm_tt_populate(struct 
> > ttm_bo_device *bdev,
> >   ttm->sg = sgt;
> >   }
> >
> > - drm_prime_sg_to_page_addr_arrays(ttm->sg, NULL,
> > -  gtt->ttm.dma_address,
> > -  ttm->num_pages);
> > + drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address,
> > +ttm->num_pages);
> >   ttm_tt_set_populated(ttm);
> >   return 0;
> >   }
> > diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> > index 4910c446db83..8b750c074494 100644
> > --- a/drivers/gpu/drm/drm_prime.c
> > +++ b/drivers/gpu/drm/drm_prime.c
> > @@ -954,27 +954,25 @@ struct drm_gem_object *drm_gem_prime_import(struct 
> > drm_device *dev,
> >  EXPORT_SYMBOL(drm_gem_prime_import);
> >
> >  /**
> > - * drm_prime_sg_to_page_addr_arrays - convert an sg table into a page array
> > + * drm_prime_sg_to_page_array - convert an sg table into a page array
> >   * @sgt: scatter-gather table to convert
> > - * @pages: optional array of page pointers to store the page array in
> > - * @addrs: optional array to store the dma bus address of each page
> > - * @max_entries: size of both the passed-in arrays
> > + * @pages: array of page pointers to store the pages in
> > + * @max_entries: size of the passed-in array
> >   *
> > - * Exports an sg table into an array of pages and addresses. This is 
> > currently
> > - * required by the TTM driver in order to do correct fault handling.
> > + * Exports an sg table into an array of pages.
> >   *
> > - * Drivers can use this in their _driver.gem_prime_import_sg_table
> > - * implementation.
> > + * This function is deprecated and strongly discouraged to be used.
> > + * The page array is only useful for page faults and those can corrupt 
> > fields
> > + * in the struct page if they are not handled by the exporting driver.
> >   */
> > -int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page 
> > **pages,
> > -  dma_addr_t *addrs, int max_entries)
> > +int __deprecated drm_prime_sg_to_page_array(struct sg_table *sgt,
> > + struct page **pages,
> > + int max_entries)
> >  {
> >   unsigned count;
> >   struct scatterlist *sg;
> >   struct page *page;
> >   u32 page_len, page_index;
> > - dma_addr_t addr;
> > - u32 dma_len, dma_index;
> >
> >   /*
> >* Scatterlist elements 

Re: [PATCH 6/6] drm/prime: document that use the page array is deprecated v2

2020-10-09 Thread Daniel Vetter
On Fri, Oct 09, 2020 at 05:03:42PM +0200, Christian König wrote:
> We have reoccurring requests on this so better document that
> this approach doesn't work and dma_buf_mmap() needs to be used instead.
> 
> v2: split it into two functions
> 
> Signed-off-by: Christian König 

Patches 3-5:

Acked-by: Daniel Vetter 

This one looks good, but you have it on a strange baseline. This doesn't
contain the sg walking fixes from Marek, so reintroduces the bugs.
Probably need to request a backmerge chain, first of -rc8 into drm-next,
and then that into drm-misc-next.

Everything else in here lgtm.
-Daniel



> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c |  9 ++-
>  drivers/gpu/drm/drm_prime.c | 67 +++--
>  drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c |  3 +-
>  drivers/gpu/drm/msm/msm_gem.c   |  2 +-
>  drivers/gpu/drm/nouveau/nouveau_bo.c|  5 +-
>  drivers/gpu/drm/radeon/radeon_ttm.c |  9 ++-
>  drivers/gpu/drm/vgem/vgem_drv.c |  3 +-
>  drivers/gpu/drm/vkms/vkms_gem.c |  2 +-
>  drivers/gpu/drm/xen/xen_drm_front_gem.c |  4 +-
>  include/drm/drm_prime.h |  7 ++-
>  10 files changed, 69 insertions(+), 42 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index ac463e706b19..6a65490de391 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -1011,8 +1011,8 @@ static int amdgpu_ttm_tt_pin_userptr(struct 
> ttm_bo_device *bdev,
>   goto release_sg;
>  
>   /* convert SG to linear array of pages and dma addresses */
> - drm_prime_sg_to_page_addr_arrays(ttm->sg, NULL, gtt->ttm.dma_address,
> -  ttm->num_pages);
> + drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address,
> +ttm->num_pages);
>  
>   return 0;
>  
> @@ -1345,9 +1345,8 @@ static int amdgpu_ttm_tt_populate(struct ttm_bo_device 
> *bdev,
>   ttm->sg = sgt;
>   }
>  
> - drm_prime_sg_to_page_addr_arrays(ttm->sg, NULL,
> -  gtt->ttm.dma_address,
> -  ttm->num_pages);
> + drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address,
> +ttm->num_pages);
>   ttm_tt_set_populated(ttm);
>   return 0;
>   }
> diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> index 4910c446db83..8b750c074494 100644
> --- a/drivers/gpu/drm/drm_prime.c
> +++ b/drivers/gpu/drm/drm_prime.c
> @@ -954,27 +954,25 @@ struct drm_gem_object *drm_gem_prime_import(struct 
> drm_device *dev,
>  EXPORT_SYMBOL(drm_gem_prime_import);
>  
>  /**
> - * drm_prime_sg_to_page_addr_arrays - convert an sg table into a page array
> + * drm_prime_sg_to_page_array - convert an sg table into a page array
>   * @sgt: scatter-gather table to convert
> - * @pages: optional array of page pointers to store the page array in
> - * @addrs: optional array to store the dma bus address of each page
> - * @max_entries: size of both the passed-in arrays
> + * @pages: array of page pointers to store the pages in
> + * @max_entries: size of the passed-in array
>   *
> - * Exports an sg table into an array of pages and addresses. This is 
> currently
> - * required by the TTM driver in order to do correct fault handling.
> + * Exports an sg table into an array of pages.
>   *
> - * Drivers can use this in their _driver.gem_prime_import_sg_table
> - * implementation.
> + * This function is deprecated and strongly discouraged to be used.
> + * The page array is only useful for page faults and those can corrupt fields
> + * in the struct page if they are not handled by the exporting driver.
>   */
> -int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page 
> **pages,
> -  dma_addr_t *addrs, int max_entries)
> +int __deprecated drm_prime_sg_to_page_array(struct sg_table *sgt,
> + struct page **pages,
> + int max_entries)
>  {
>   unsigned count;
>   struct scatterlist *sg;
>   struct page *page;
>   u32 page_len, page_index;
> - dma_addr_t addr;
> - u32 dma_len, dma_index;
>  
>   /*
>* Scatterlist elements contains both pages and DMA addresses, but
> @@ -984,14 +982,11 @@ int drm_prime_sg_to_page_addr_arrays(struct sg_table 
> *sgt, struct page **pages,
>* described by the sg_dma_address(sg).
>*/
>   page_index = 0;
> - dma_index = 0;
>   for_each_sg(sgt->sgl, sg, sgt->nents, count) {
>   page_len = sg->length;
>   page = sg_page(sg);
> - dma_len = sg_dma_len(sg);
> - addr = sg_dma_address(sg);
>  
> - while 

Re: [Intel-gfx] [PATCH] drm/vgem: Replace vgem_object_funcs with the common drm shmem helper

2020-10-09 Thread Daniel Vetter
On Fri, Oct 9, 2020 at 12:21 PM Chris Wilson  wrote:
>
> vgem is a minimalistic driver that provides shmemfs objects to
> userspace that may then be used as an in-memory surface and transported
> across dma-buf to other drivers. Since it's introduction,
> drm_gem_shmem_helper now provides the same shmemfs facilities and so we
> can trim vgem to wrap the helper.
>
> Signed-off-by: Chris Wilson 
> ---
>  drivers/gpu/drm/Kconfig |   1 +
>  drivers/gpu/drm/vgem/vgem_drv.c | 281 ++--
>  drivers/gpu/drm/vgem/vgem_drv.h |  11 --
>  3 files changed, 13 insertions(+), 280 deletions(-)

Nice diffstat :-)

Reviewed-by: Daniel Vetter 

>
> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
> index 147d61b9674e..db2ff76638cd 100644
> --- a/drivers/gpu/drm/Kconfig
> +++ b/drivers/gpu/drm/Kconfig
> @@ -278,6 +278,7 @@ source "drivers/gpu/drm/i915/Kconfig"
>  config DRM_VGEM
> tristate "Virtual GEM provider"
> depends on DRM
> +   select DRM_GEM_SHMEM_HELPER
> help
>   Choose this option to get a virtual graphics memory manager,
>   as used by Mesa's software renderer for enhanced performance.
> diff --git a/drivers/gpu/drm/vgem/vgem_drv.c b/drivers/gpu/drm/vgem/vgem_drv.c
> index fa54a6d1403d..73cb17c4f7a8 100644
> --- a/drivers/gpu/drm/vgem/vgem_drv.c
> +++ b/drivers/gpu/drm/vgem/vgem_drv.c
> @@ -38,6 +38,7 @@
>
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -50,87 +51,11 @@
>  #define DRIVER_MAJOR   1
>  #define DRIVER_MINOR   0
>
> -static const struct drm_gem_object_funcs vgem_gem_object_funcs;
> -
>  static struct vgem_device {
> struct drm_device drm;
> struct platform_device *platform;
>  } *vgem_device;
>
> -static void vgem_gem_free_object(struct drm_gem_object *obj)
> -{
> -   struct drm_vgem_gem_object *vgem_obj = to_vgem_bo(obj);
> -
> -   kvfree(vgem_obj->pages);
> -   mutex_destroy(_obj->pages_lock);
> -
> -   if (obj->import_attach)
> -   drm_prime_gem_destroy(obj, vgem_obj->table);
> -
> -   drm_gem_object_release(obj);
> -   kfree(vgem_obj);
> -}
> -
> -static vm_fault_t vgem_gem_fault(struct vm_fault *vmf)
> -{
> -   struct vm_area_struct *vma = vmf->vma;
> -   struct drm_vgem_gem_object *obj = vma->vm_private_data;
> -   /* We don't use vmf->pgoff since that has the fake offset */
> -   unsigned long vaddr = vmf->address;
> -   vm_fault_t ret = VM_FAULT_SIGBUS;
> -   loff_t num_pages;
> -   pgoff_t page_offset;
> -   page_offset = (vaddr - vma->vm_start) >> PAGE_SHIFT;
> -
> -   num_pages = DIV_ROUND_UP(obj->base.size, PAGE_SIZE);
> -
> -   if (page_offset >= num_pages)
> -   return VM_FAULT_SIGBUS;
> -
> -   mutex_lock(>pages_lock);
> -   if (obj->pages) {
> -   get_page(obj->pages[page_offset]);
> -   vmf->page = obj->pages[page_offset];
> -   ret = 0;
> -   }
> -   mutex_unlock(>pages_lock);
> -   if (ret) {
> -   struct page *page;
> -
> -   page = shmem_read_mapping_page(
> -   file_inode(obj->base.filp)->i_mapping,
> -   page_offset);
> -   if (!IS_ERR(page)) {
> -   vmf->page = page;
> -   ret = 0;
> -   } else switch (PTR_ERR(page)) {
> -   case -ENOSPC:
> -   case -ENOMEM:
> -   ret = VM_FAULT_OOM;
> -   break;
> -   case -EBUSY:
> -   ret = VM_FAULT_RETRY;
> -   break;
> -   case -EFAULT:
> -   case -EINVAL:
> -   ret = VM_FAULT_SIGBUS;
> -   break;
> -   default:
> -   WARN_ON(PTR_ERR(page));
> -   ret = VM_FAULT_SIGBUS;
> -   break;
> -   }
> -
> -   }
> -   return ret;
> -}
> -
> -static const struct vm_operations_struct vgem_gem_vm_ops = {
> -   .fault = vgem_gem_fault,
> -   .open = drm_gem_vm_open,
> -   .close = drm_gem_vm_close,
> -};
> -
>  static int vgem_open(struct drm_device *dev, struct drm_file *file)
>  {
> struct vgem_file *vfile;
> @@ -159,41 +84,25 @@ static void vgem_postclose(struct drm_device *dev, 
> struct drm_file *file)
> kfree(vfile);
>  }
>
> -static struct drm_vgem_gem_object *__vgem_gem_create(struct drm_device *dev,
> +static struct drm_gem_shmem_object *__vgem_gem_create(struct drm_device *dev,
> unsigned long size)
>  {
> -   struct drm_vgem_gem_object *obj;
> -   int ret;
> -
> -   obj = kzalloc(sizeof(*obj), GFP_KERNEL);
> -   if (!obj)
> -

Re: [PATCH] drm/panfrost: increase readl_relaxed_poll_timeout values

2020-10-09 Thread Steven Price

On 08/10/2020 15:17, Christian Hewitt wrote:

Amlogic SoC devices report the following errors frequently causing excessive
dmesg log spam and early log rotataion, although the errors appear to be
harmless as everything works fine:

[7.202702] panfrost ffe4.gpu: error powering up gpu L2
[7.203760] panfrost ffe4.gpu: error powering up gpu shader

ARM staff have advised increasing the timeout values to eliminate the errors
in most normal scenarios, and testing with several different G31/G52 devices
shows 2 to be a reliable value.

Fixes: f3ba91228e8e ("drm/panfrost: Add initial panfrost driver")
Suggested-by: Steven Price 
Signed-off-by: Christian Hewitt 


Reviewed-by: Steven Price 

I'll push this to drm-misc-next-fixes so it should coincide with the 
Bifrost support already in drm-misc-next.


Steve


---
  drivers/gpu/drm/panfrost/panfrost_gpu.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/panfrost/panfrost_gpu.c 
b/drivers/gpu/drm/panfrost/panfrost_gpu.c
index e1b2a3376624..2aae636f1cf5 100644
--- a/drivers/gpu/drm/panfrost/panfrost_gpu.c
+++ b/drivers/gpu/drm/panfrost/panfrost_gpu.c
@@ -325,13 +325,13 @@ void panfrost_gpu_power_on(struct panfrost_device *pfdev)
/* Just turn on everything for now */
gpu_write(pfdev, L2_PWRON_LO, pfdev->features.l2_present);
ret = readl_relaxed_poll_timeout(pfdev->iomem + L2_READY_LO,
-   val, val == pfdev->features.l2_present, 100, 1000);
+   val, val == pfdev->features.l2_present, 100, 2);
if (ret)
dev_err(pfdev->dev, "error powering up gpu L2");
  
  	gpu_write(pfdev, SHADER_PWRON_LO, pfdev->features.shader_present);

ret = readl_relaxed_poll_timeout(pfdev->iomem + SHADER_READY_LO,
-   val, val == pfdev->features.shader_present, 100, 1000);
+   val, val == pfdev->features.shader_present, 100, 2);
if (ret)
dev_err(pfdev->dev, "error powering up gpu shader");
  



___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re:

2020-10-09 Thread Alex Deucher
On Fri, Oct 9, 2020 at 3:51 AM Thomas Zimmermann  wrote:
>
> Hi
>
> Am 09.10.20 um 09:38 schrieb Sandeep Raghuraman:
> >
> >
> > On 10/9/20 12:44 PM, Thomas Zimmermann wrote:
> >> Hi
> >>
> >> Am 09.10.20 um 08:47 schrieb Thomas Zimmermann:
> >>> NACK for the entire lack of any form of commit description.
> >>
> >> Please see the documentation at [1] on how to describe the changes and
> >> getting your patches merged.
> >
> > Yes, I tried to use git send-email to send patches this time, and it 
> > resulted in this disaster. I'll stick to sending them through Thunderbird.
>
> What's the problem with send-email?
>
> A typical call for your patchset would look like
>
>   git send-mail ...HEAD --cover-letter --annotate
> --to=... --cc=...
>
> That allows you to write the cover letter and have it sent out. IIRC you
> need ot set $EDITOR to your favorite text editor; and configure the SMTP
> server in ~/.gitconfig, under [sendemail].
>

You can also do `git format-patch -3 --cover-letter` and manually edit
the coverletter as needed then send them with git send-email.

Alex

> Best regards
> Thomas
>
> >
> >>
> >> Best regards
> >> Thomas
> >>
> >> [1]
> > ___
> > dri-devel mailing list
> > dri-devel@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/dri-devel
> >
>
> --
> Thomas Zimmermann
> Graphics Driver Developer
> SUSE Software Solutions Germany GmbH
> Maxfeldstr. 5, 90409 Nürnberg, Germany
> (HRB 36809, AG Nürnberg)
> Geschäftsführer: Felix Imendörffer
>
> ___
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v9 3/5] drm/kmb: Add support for KeemBay Display

2020-10-09 Thread Daniel Vetter
On Thu, Oct 08, 2020 at 06:04:01PM -0700, Anitha Chrisanthus wrote:
> This is a basic KMS atomic modesetting display driver for KeemBay family of
> SOCs. Driver has no 2D or 3D graphics.It calls into the ADV bridge
> driver at the connector level.
> 
> Single CRTC with LCD controller->mipi DSI-> ADV bridge
> 
> Only 1080p resolution and single plane is supported at this time.
> 
> v2: moved extern to .h, removed license text
> use drm_dev_init, upclassed dev_private, removed HAVE_IRQ.(Sam)
> 
> v3: Squashed all 59 commits to one
> 
> v4: review changes from Sam Ravnborg
>   renamed dev_p to kmb
>   moved clocks under kmb_clock, consolidated clk initializations
>   use drmm functions
>   use DRM_GEM_CMA_DRIVER_OPS_VMAP
> 
> v5: corrected spellings
> v6: corrected checkpatch warnings
> v7: review changes Sam Ravnborg and Thomas Zimmerman
>   removed kmb_crtc.h kmb_crtc_cleanup (Thomas)
>   renamed mode_set, kmb_load, inlined unload (Thomas)
>   moved remaining logging to drm_*(Thomas)
>   re-orged driver initialization (Thomas)
>   moved plane_status to drm_private (Sam)
>   removed unnecessary logs and defines and ifdef codes (Sam)
>   call helper_check in plane_atomic_check (Sam)
>   renamed set to get for bpp and format functions(Sam)
>   use drm helper functions for reset, duplicate/destroy state instead
>   of kmb functions (Sam)
>   removed kmb_priv from kmb_plane and removed kmb_plane_state (Sam)
> v8: get clk_pll0 from display node in dt
> v9: moved csc_coef_lcd to plane.c (Daniel Vetter)
> call drm_atomic_helper_shutdown in remove (Daniel V)
> use drm_crtc_handle_vblank (Daniel V)
> renamed kmb_dsi_hw_init to kmb_dsi_mode_set (Daniel V)
> complimentary changes to device tree changes (Rob)
> 
> Cc: Sam Ravnborg 
> Signed-off-by: Anitha Chrisanthus 
> Reviewed-by: Bob Paauwe 
> ---
>  drivers/gpu/drm/kmb/kmb_crtc.c  | 224 +
>  drivers/gpu/drm/kmb/kmb_drv.c   | 676 
> 
>  drivers/gpu/drm/kmb/kmb_drv.h   | 170 ++
>  drivers/gpu/drm/kmb/kmb_plane.c | 488 +
>  drivers/gpu/drm/kmb/kmb_plane.h | 102 ++
>  5 files changed, 1660 insertions(+)
>  create mode 100644 drivers/gpu/drm/kmb/kmb_crtc.c
>  create mode 100644 drivers/gpu/drm/kmb/kmb_drv.c
>  create mode 100644 drivers/gpu/drm/kmb/kmb_drv.h
>  create mode 100644 drivers/gpu/drm/kmb/kmb_plane.c
>  create mode 100644 drivers/gpu/drm/kmb/kmb_plane.h
> 
> diff --git a/drivers/gpu/drm/kmb/kmb_crtc.c b/drivers/gpu/drm/kmb/kmb_crtc.c
> new file mode 100644
> index 000..72dcbdf
> --- /dev/null
> +++ b/drivers/gpu/drm/kmb/kmb_crtc.c
> @@ -0,0 +1,224 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright © 2018-2020 Intel Corporation
> + */
> +
> +#include 
> +#include 
> +#include 
> +
> +#include 
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#include "kmb_drv.h"
> +#include "kmb_dsi.h"
> +#include "kmb_plane.h"
> +#include "kmb_regs.h"
> +
> +struct kmb_crtc_timing {
> + u32 vfront_porch;
> + u32 vback_porch;
> + u32 vsync_len;
> + u32 hfront_porch;
> + u32 hback_porch;
> + u32 hsync_len;
> +};
> +
> +static int kmb_crtc_enable_vblank(struct drm_crtc *crtc)
> +{
> + struct drm_device *dev = crtc->dev;
> + struct kmb_drm_private *kmb = to_kmb(dev);
> +
> + /* Clear interrupt */
> + kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
> + /* Set which interval to generate vertical interrupt */
> + kmb_write_lcd(kmb, LCD_VSTATUS_COMPARE,
> +   LCD_VSTATUS_COMPARE_VSYNC);
> + /* Enable vertical interrupt */
> + kmb_set_bitmask_lcd(kmb, LCD_INT_ENABLE,
> + LCD_INT_VERT_COMP);
> + return 0;
> +}
> +
> +static void kmb_crtc_disable_vblank(struct drm_crtc *crtc)
> +{
> + struct drm_device *dev = crtc->dev;
> + struct kmb_drm_private *kmb = to_kmb(dev);
> +
> + /* Clear interrupt */
> + kmb_write_lcd(kmb, LCD_INT_CLEAR, LCD_INT_VERT_COMP);
> + /* Disable vertical interrupt */
> + kmb_clr_bitmask_lcd(kmb, LCD_INT_ENABLE,
> + LCD_INT_VERT_COMP);
> +}
> +
> +static const struct drm_crtc_funcs kmb_crtc_funcs = {
> + .destroy = drm_crtc_cleanup,
> + .set_config = drm_atomic_helper_set_config,
> + .page_flip = drm_atomic_helper_page_flip,
> + .reset = drm_atomic_helper_crtc_reset,
> + .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
> + .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
> + .enable_vblank = kmb_crtc_enable_vblank,
> + .disable_vblank = kmb_crtc_disable_vblank,
> +};
> +
> +static void kmb_crtc_set_mode(struct drm_crtc *crtc)
> +{
> + struct drm_device *dev = crtc->dev;
> + struct drm_display_mode *m = >state->adjusted_mode;
> 

  1   2   3   >