From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751921AbcDTTUd (ORCPT ); Wed, 20 Apr 2016 15:20:33 -0400 Received: from smtp.domeneshop.no ([194.63.252.55]:33985 "EHLO smtp.domeneshop.no" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751029AbcDTTUc (ORCPT ); Wed, 20 Apr 2016 15:20:32 -0400 Subject: Re: [PATCH 8/8] drm/udl: Use drm_fb_helper deferred_io support To: dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, laurent.pinchart@ideasonboard.com, tomi.valkeinen@ti.com, linux-kernel@vger.kernel.org References: <1461165929-11344-1-git-send-email-noralf@tronnes.org> <1461165929-11344-9-git-send-email-noralf@tronnes.org> <20160420175903.GS2510@phenom.ffwll.local> From: =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= Message-ID: <5717D679.5070809@tronnes.org> Date: Wed, 20 Apr 2016 21:20:25 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <20160420175903.GS2510@phenom.ffwll.local> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Den 20.04.2016 19:59, skrev Daniel Vetter: > On Wed, Apr 20, 2016 at 05:25:29PM +0200, Noralf Trønnes wrote: >> Use the fbdev deferred io support in drm_fb_helper. >> The (struct fb_ops *)->fb_{fillrect,copyarea,imageblit} functions will >> now be deferred in the same way that mmap damage is, instead of being >> flushed directly. >> The deferred mmap functionality is kept disabled by default, because of the >> list corruption problems mentioned in commit 677d23b70bf9 >> ("drm/udl: disable fb_defio by default"). >> This patch has only been compile tested. >> >> Signed-off-by: Noralf Trønnes >> --- >> drivers/gpu/drm/udl/udl_drv.h | 2 - >> drivers/gpu/drm/udl/udl_fb.c | 152 ++++-------------------------------------- >> 2 files changed, 12 insertions(+), 142 deletions(-) >> >> diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h >> index 4a064ef..0b03d34 100644 >> --- a/drivers/gpu/drm/udl/udl_drv.h >> +++ b/drivers/gpu/drm/udl/udl_drv.h >> @@ -81,8 +81,6 @@ struct udl_framebuffer { >> struct drm_framebuffer base; >> struct udl_gem_object *obj; >> bool active_16; /* active on the 16-bit channel */ >> - int x1, y1, x2, y2; /* dirty rect */ >> - spinlock_t dirty_lock; >> }; >> >> #define to_udl_fb(x) container_of(x, struct udl_framebuffer, base) >> diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c >> index a52de2f..b44d4a7 100644 >> --- a/drivers/gpu/drm/udl/udl_fb.c >> +++ b/drivers/gpu/drm/udl/udl_fb.c >> @@ -77,68 +77,6 @@ static uint16_t rgb16(uint32_t col) >> } >> #endif >> >> -/* >> - * NOTE: fb_defio.c is holding info->fbdefio.mutex >> - * Touching ANY framebuffer memory that triggers a page fault >> - * in fb_defio will cause a deadlock, when it also tries to >> - * grab the same mutex. >> - */ >> -static void udlfb_dpy_deferred_io(struct fb_info *info, >> - struct list_head *pagelist) >> -{ >> - struct page *cur; >> - struct fb_deferred_io *fbdefio = info->fbdefio; >> - struct udl_fbdev *ufbdev = info->par; >> - struct drm_device *dev = ufbdev->ufb.base.dev; >> - struct udl_device *udl = dev->dev_private; >> - struct urb *urb; >> - char *cmd; >> - cycles_t start_cycles, end_cycles; >> - int bytes_sent = 0; >> - int bytes_identical = 0; >> - int bytes_rendered = 0; >> - >> - if (!fb_defio) >> - return; >> - >> - start_cycles = get_cycles(); >> - >> - urb = udl_get_urb(dev); >> - if (!urb) >> - return; >> - >> - cmd = urb->transfer_buffer; >> - >> - /* walk the written page list and render each to device */ >> - list_for_each_entry(cur, &fbdefio->pagelist, lru) { >> - >> - if (udl_render_hline(dev, (ufbdev->ufb.base.bits_per_pixel / 8), >> - &urb, (char *) info->fix.smem_start, >> - &cmd, cur->index << PAGE_SHIFT, >> - cur->index << PAGE_SHIFT, >> - PAGE_SIZE, &bytes_identical, &bytes_sent)) >> - goto error; >> - bytes_rendered += PAGE_SIZE; >> - } >> - >> - if (cmd > (char *) urb->transfer_buffer) { >> - /* Send partial buffer remaining before exiting */ >> - int len = cmd - (char *) urb->transfer_buffer; >> - udl_submit_urb(dev, urb, len); >> - bytes_sent += len; >> - } else >> - udl_urb_completion(urb); >> - >> -error: >> - atomic_add(bytes_sent, &udl->bytes_sent); >> - atomic_add(bytes_identical, &udl->bytes_identical); >> - atomic_add(bytes_rendered, &udl->bytes_rendered); >> - end_cycles = get_cycles(); >> - atomic_add(((unsigned int) ((end_cycles - start_cycles) >> - >> 10)), /* Kcycles */ >> - &udl->cpu_kcycles_used); >> -} >> - >> int udl_handle_damage(struct udl_framebuffer *fb, int x, int y, >> int width, int height) >> { >> @@ -152,9 +90,6 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y, >> struct urb *urb; >> int aligned_x; >> int bpp = (fb->base.bits_per_pixel / 8); >> - int x2, y2; >> - bool store_for_later = false; >> - unsigned long flags; >> >> if (!fb->active_16) >> return 0; >> @@ -180,38 +115,6 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y, >> (y + height > fb->base.height)) >> return -EINVAL; >> >> - /* if we are in atomic just store the info >> - can't test inside spin lock */ >> - if (in_atomic()) >> - store_for_later = true; >> - >> - x2 = x + width - 1; >> - y2 = y + height - 1; >> - >> - spin_lock_irqsave(&fb->dirty_lock, flags); >> - >> - if (fb->y1 < y) >> - y = fb->y1; >> - if (fb->y2 > y2) >> - y2 = fb->y2; >> - if (fb->x1 < x) >> - x = fb->x1; >> - if (fb->x2 > x2) >> - x2 = fb->x2; >> - >> - if (store_for_later) { >> - fb->x1 = x; >> - fb->x2 = x2; >> - fb->y1 = y; >> - fb->y2 = y2; >> - spin_unlock_irqrestore(&fb->dirty_lock, flags); >> - return 0; >> - } >> - >> - fb->x1 = fb->y1 = INT_MAX; >> - fb->x2 = fb->y2 = 0; >> - >> - spin_unlock_irqrestore(&fb->dirty_lock, flags); >> start_cycles = get_cycles(); >> >> urb = udl_get_urb(dev); >> @@ -219,14 +122,14 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y, >> return 0; >> cmd = urb->transfer_buffer; >> >> - for (i = y; i <= y2 ; i++) { >> + for (i = y; i < height ; i++) { >> const int line_offset = fb->base.pitches[0] * i; >> const int byte_offset = line_offset + (x * bpp); >> const int dev_byte_offset = (fb->base.width * bpp * i) + (x * bpp); >> if (udl_render_hline(dev, bpp, &urb, >> (char *) fb->obj->vmapping, >> &cmd, byte_offset, dev_byte_offset, >> - (x2 - x + 1) * bpp, >> + width * bpp, >> &bytes_identical, &bytes_sent)) >> goto error; >> } >> @@ -283,36 +186,6 @@ static int udl_fb_mmap(struct fb_info *info, struct vm_area_struct *vma) >> return 0; >> } >> >> -static void udl_fb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) >> -{ >> - struct udl_fbdev *ufbdev = info->par; >> - >> - sys_fillrect(info, rect); >> - >> - udl_handle_damage(&ufbdev->ufb, rect->dx, rect->dy, rect->width, >> - rect->height); >> -} >> - >> -static void udl_fb_copyarea(struct fb_info *info, const struct fb_copyarea *region) >> -{ >> - struct udl_fbdev *ufbdev = info->par; >> - >> - sys_copyarea(info, region); >> - >> - udl_handle_damage(&ufbdev->ufb, region->dx, region->dy, region->width, >> - region->height); >> -} >> - >> -static void udl_fb_imageblit(struct fb_info *info, const struct fb_image *image) >> -{ >> - struct udl_fbdev *ufbdev = info->par; >> - >> - sys_imageblit(info, image); >> - >> - udl_handle_damage(&ufbdev->ufb, image->dx, image->dy, image->width, >> - image->height); >> -} >> - >> /* >> * It's common for several clients to have framebuffer open simultaneously. >> * e.g. both fbcon and X. Makes things interesting. >> @@ -330,20 +203,20 @@ static int udl_fb_open(struct fb_info *info, int user) >> >> ufbdev->fb_count++; >> >> - if (fb_defio && (info->fbdefio == NULL)) { >> - /* enable defio at last moment if not disabled by client */ >> + if (!info->fbdefio) { >> + /* enable defio at last moment */ >> >> struct fb_deferred_io *fbdefio; >> >> fbdefio = kmalloc(sizeof(struct fb_deferred_io), GFP_KERNEL); >> - >> if (fbdefio) { >> fbdefio->delay = DL_DEFIO_WRITE_DELAY; >> - fbdefio->deferred_io = udlfb_dpy_deferred_io; >> + fbdefio->deferred_io = drm_fb_helper_deferred_io; > Why all these changes here? I figured just exchanging the deferred_io > pointer should be all that's really needed in the setup code? Because we always need to initialize deferred_io since we use it's worker to handle fb_{fillrect,copyarea,imageblit} damage in drm_fb_helper. The previous code didn't use deferred_io to handle these, it just handled the damage directly unless it was running in atomic context, in which case it just recorded the damage and returned, leaving it to the next call to push the changes. And in the following code I fixed a null pointer problem as well, maybe I shouldn't have packed it in here. If fbdefio allocation fails == NULL, fb_deferred_io_init() will trigger a BUG(). > -Daniel > >> + info->fbdefio = fbdefio; >> + fb_deferred_io_init(info); >> + if (!fb_defio) /* see commit 677d23b */ >> + info->fbops->fb_mmap = udl_fb_mmap; >> } >> - >> - info->fbdefio = fbdefio; >> - fb_deferred_io_init(info); >> } >> >> pr_notice("open /dev/fb%d user=%d fb_info=%p count=%d\n", >> @@ -379,9 +252,9 @@ static struct fb_ops udlfb_ops = { >> .owner = THIS_MODULE, >> .fb_check_var = drm_fb_helper_check_var, >> .fb_set_par = drm_fb_helper_set_par, >> - .fb_fillrect = udl_fb_fillrect, >> - .fb_copyarea = udl_fb_copyarea, >> - .fb_imageblit = udl_fb_imageblit, >> + .fb_fillrect = drm_fb_helper_sys_fillrect, >> + .fb_copyarea = drm_fb_helper_sys_copyarea, >> + .fb_imageblit = drm_fb_helper_sys_imageblit, >> .fb_pan_display = drm_fb_helper_pan_display, >> .fb_blank = drm_fb_helper_blank, >> .fb_setcmap = drm_fb_helper_setcmap, >> @@ -458,7 +331,6 @@ udl_framebuffer_init(struct drm_device *dev, >> { >> int ret; >> >> - spin_lock_init(&ufb->dirty_lock); >> ufb->obj = obj; >> drm_helper_mode_fill_fb_struct(&ufb->base, mode_cmd); >> ret = drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs); >> -- >> 2.2.2 >> From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= Date: Wed, 20 Apr 2016 19:20:25 +0000 Subject: Re: [PATCH 8/8] drm/udl: Use drm_fb_helper deferred_io support Message-Id: <5717D679.5070809@tronnes.org> List-Id: References: <1461165929-11344-1-git-send-email-noralf@tronnes.org> <1461165929-11344-9-git-send-email-noralf@tronnes.org> <20160420175903.GS2510@phenom.ffwll.local> In-Reply-To: <20160420175903.GS2510@phenom.ffwll.local> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, laurent.pinchart@ideasonboard.com, tomi.valkeinen@ti.com, linux-kernel@vger.kernel.org Den 20.04.2016 19:59, skrev Daniel Vetter: > On Wed, Apr 20, 2016 at 05:25:29PM +0200, Noralf Tr=F8nnes wrote: >> Use the fbdev deferred io support in drm_fb_helper. >> The (struct fb_ops *)->fb_{fillrect,copyarea,imageblit} functions will >> now be deferred in the same way that mmap damage is, instead of being >> flushed directly. >> The deferred mmap functionality is kept disabled by default, because of = the >> list corruption problems mentioned in commit 677d23b70bf9 >> ("drm/udl: disable fb_defio by default"). >> This patch has only been compile tested. >> >> Signed-off-by: Noralf Tr=F8nnes >> --- >> drivers/gpu/drm/udl/udl_drv.h | 2 - >> drivers/gpu/drm/udl/udl_fb.c | 152 ++++------------------------------= -------- >> 2 files changed, 12 insertions(+), 142 deletions(-) >> >> diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv= .h >> index 4a064ef..0b03d34 100644 >> --- a/drivers/gpu/drm/udl/udl_drv.h >> +++ b/drivers/gpu/drm/udl/udl_drv.h >> @@ -81,8 +81,6 @@ struct udl_framebuffer { >> struct drm_framebuffer base; >> struct udl_gem_object *obj; >> bool active_16; /* active on the 16-bit channel */ >> - int x1, y1, x2, y2; /* dirty rect */ >> - spinlock_t dirty_lock; >> }; >> =20 >> #define to_udl_fb(x) container_of(x, struct udl_framebuffer, base) >> diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c >> index a52de2f..b44d4a7 100644 >> --- a/drivers/gpu/drm/udl/udl_fb.c >> +++ b/drivers/gpu/drm/udl/udl_fb.c >> @@ -77,68 +77,6 @@ static uint16_t rgb16(uint32_t col) >> } >> #endif >> =20 >> -/* >> - * NOTE: fb_defio.c is holding info->fbdefio.mutex >> - * Touching ANY framebuffer memory that triggers a page fault >> - * in fb_defio will cause a deadlock, when it also tries to >> - * grab the same mutex. >> - */ >> -static void udlfb_dpy_deferred_io(struct fb_info *info, >> - struct list_head *pagelist) >> -{ >> - struct page *cur; >> - struct fb_deferred_io *fbdefio =3D info->fbdefio; >> - struct udl_fbdev *ufbdev =3D info->par; >> - struct drm_device *dev =3D ufbdev->ufb.base.dev; >> - struct udl_device *udl =3D dev->dev_private; >> - struct urb *urb; >> - char *cmd; >> - cycles_t start_cycles, end_cycles; >> - int bytes_sent =3D 0; >> - int bytes_identical =3D 0; >> - int bytes_rendered =3D 0; >> - >> - if (!fb_defio) >> - return; >> - >> - start_cycles =3D get_cycles(); >> - >> - urb =3D udl_get_urb(dev); >> - if (!urb) >> - return; >> - >> - cmd =3D urb->transfer_buffer; >> - >> - /* walk the written page list and render each to device */ >> - list_for_each_entry(cur, &fbdefio->pagelist, lru) { >> - >> - if (udl_render_hline(dev, (ufbdev->ufb.base.bits_per_pixel / 8), >> - &urb, (char *) info->fix.smem_start, >> - &cmd, cur->index << PAGE_SHIFT, >> - cur->index << PAGE_SHIFT, >> - PAGE_SIZE, &bytes_identical, &bytes_sent)) >> - goto error; >> - bytes_rendered +=3D PAGE_SIZE; >> - } >> - >> - if (cmd > (char *) urb->transfer_buffer) { >> - /* Send partial buffer remaining before exiting */ >> - int len =3D cmd - (char *) urb->transfer_buffer; >> - udl_submit_urb(dev, urb, len); >> - bytes_sent +=3D len; >> - } else >> - udl_urb_completion(urb); >> - >> -error: >> - atomic_add(bytes_sent, &udl->bytes_sent); >> - atomic_add(bytes_identical, &udl->bytes_identical); >> - atomic_add(bytes_rendered, &udl->bytes_rendered); >> - end_cycles =3D get_cycles(); >> - atomic_add(((unsigned int) ((end_cycles - start_cycles) >> - >> 10)), /* Kcycles */ >> - &udl->cpu_kcycles_used); >> -} >> - >> int udl_handle_damage(struct udl_framebuffer *fb, int x, int y, >> int width, int height) >> { >> @@ -152,9 +90,6 @@ int udl_handle_damage(struct udl_framebuffer *fb, int= x, int y, >> struct urb *urb; >> int aligned_x; >> int bpp =3D (fb->base.bits_per_pixel / 8); >> - int x2, y2; >> - bool store_for_later =3D false; >> - unsigned long flags; >> =20 >> if (!fb->active_16) >> return 0; >> @@ -180,38 +115,6 @@ int udl_handle_damage(struct udl_framebuffer *fb, i= nt x, int y, >> (y + height > fb->base.height)) >> return -EINVAL; >> =20 >> - /* if we are in atomic just store the info >> - can't test inside spin lock */ >> - if (in_atomic()) >> - store_for_later =3D true; >> - >> - x2 =3D x + width - 1; >> - y2 =3D y + height - 1; >> - >> - spin_lock_irqsave(&fb->dirty_lock, flags); >> - >> - if (fb->y1 < y) >> - y =3D fb->y1; >> - if (fb->y2 > y2) >> - y2 =3D fb->y2; >> - if (fb->x1 < x) >> - x =3D fb->x1; >> - if (fb->x2 > x2) >> - x2 =3D fb->x2; >> - >> - if (store_for_later) { >> - fb->x1 =3D x; >> - fb->x2 =3D x2; >> - fb->y1 =3D y; >> - fb->y2 =3D y2; >> - spin_unlock_irqrestore(&fb->dirty_lock, flags); >> - return 0; >> - } >> - >> - fb->x1 =3D fb->y1 =3D INT_MAX; >> - fb->x2 =3D fb->y2 =3D 0; >> - >> - spin_unlock_irqrestore(&fb->dirty_lock, flags); >> start_cycles =3D get_cycles(); >> =20 >> urb =3D udl_get_urb(dev); >> @@ -219,14 +122,14 @@ int udl_handle_damage(struct udl_framebuffer *fb, = int x, int y, >> return 0; >> cmd =3D urb->transfer_buffer; >> =20 >> - for (i =3D y; i <=3D y2 ; i++) { >> + for (i =3D y; i < height ; i++) { >> const int line_offset =3D fb->base.pitches[0] * i; >> const int byte_offset =3D line_offset + (x * bpp); >> const int dev_byte_offset =3D (fb->base.width * bpp * i) + (x * bpp); >> if (udl_render_hline(dev, bpp, &urb, >> (char *) fb->obj->vmapping, >> &cmd, byte_offset, dev_byte_offset, >> - (x2 - x + 1) * bpp, >> + width * bpp, >> &bytes_identical, &bytes_sent)) >> goto error; >> } >> @@ -283,36 +186,6 @@ static int udl_fb_mmap(struct fb_info *info, struct= vm_area_struct *vma) >> return 0; >> } >> =20 >> -static void udl_fb_fillrect(struct fb_info *info, const struct fb_fillr= ect *rect) >> -{ >> - struct udl_fbdev *ufbdev =3D info->par; >> - >> - sys_fillrect(info, rect); >> - >> - udl_handle_damage(&ufbdev->ufb, rect->dx, rect->dy, rect->width, >> - rect->height); >> -} >> - >> -static void udl_fb_copyarea(struct fb_info *info, const struct fb_copya= rea *region) >> -{ >> - struct udl_fbdev *ufbdev =3D info->par; >> - >> - sys_copyarea(info, region); >> - >> - udl_handle_damage(&ufbdev->ufb, region->dx, region->dy, region->width, >> - region->height); >> -} >> - >> -static void udl_fb_imageblit(struct fb_info *info, const struct fb_imag= e *image) >> -{ >> - struct udl_fbdev *ufbdev =3D info->par; >> - >> - sys_imageblit(info, image); >> - >> - udl_handle_damage(&ufbdev->ufb, image->dx, image->dy, image->width, >> - image->height); >> -} >> - >> /* >> * It's common for several clients to have framebuffer open simultaneo= usly. >> * e.g. both fbcon and X. Makes things interesting. >> @@ -330,20 +203,20 @@ static int udl_fb_open(struct fb_info *info, int u= ser) >> =20 >> ufbdev->fb_count++; >> =20 >> - if (fb_defio && (info->fbdefio =3D NULL)) { >> - /* enable defio at last moment if not disabled by client */ >> + if (!info->fbdefio) { >> + /* enable defio at last moment */ >> =20 >> struct fb_deferred_io *fbdefio; >> =20 >> fbdefio =3D kmalloc(sizeof(struct fb_deferred_io), GFP_KERNEL); >> - >> if (fbdefio) { >> fbdefio->delay =3D DL_DEFIO_WRITE_DELAY; >> - fbdefio->deferred_io =3D udlfb_dpy_deferred_io; >> + fbdefio->deferred_io =3D drm_fb_helper_deferred_io; > Why all these changes here? I figured just exchanging the deferred_io > pointer should be all that's really needed in the setup code? Because we always need to initialize deferred_io since we use it's worker to handle fb_{fillrect,copyarea,imageblit} damage in drm_fb_helper. The previous code didn't use deferred_io to handle these, it just handled the damage directly unless it was running in atomic context, in which case it just recorded the damage and returned, leaving it to the next call to push the changes. And in the following code I fixed a null pointer problem as well, maybe I shouldn't have packed it in here. If fbdefio allocation fails =3D NULL, fb_deferred_io_init() will trigger a BUG(). > -Daniel > >> + info->fbdefio =3D fbdefio; >> + fb_deferred_io_init(info); >> + if (!fb_defio) /* see commit 677d23b */ >> + info->fbops->fb_mmap =3D udl_fb_mmap; >> } >> - >> - info->fbdefio =3D fbdefio; >> - fb_deferred_io_init(info); >> } >> =20 >> pr_notice("open /dev/fb%d user=3D%d fb_info=3D%p count=3D%d\n", >> @@ -379,9 +252,9 @@ static struct fb_ops udlfb_ops =3D { >> .owner =3D THIS_MODULE, >> .fb_check_var =3D drm_fb_helper_check_var, >> .fb_set_par =3D drm_fb_helper_set_par, >> - .fb_fillrect =3D udl_fb_fillrect, >> - .fb_copyarea =3D udl_fb_copyarea, >> - .fb_imageblit =3D udl_fb_imageblit, >> + .fb_fillrect =3D drm_fb_helper_sys_fillrect, >> + .fb_copyarea =3D drm_fb_helper_sys_copyarea, >> + .fb_imageblit =3D drm_fb_helper_sys_imageblit, >> .fb_pan_display =3D drm_fb_helper_pan_display, >> .fb_blank =3D drm_fb_helper_blank, >> .fb_setcmap =3D drm_fb_helper_setcmap, >> @@ -458,7 +331,6 @@ udl_framebuffer_init(struct drm_device *dev, >> { >> int ret; >> =20 >> - spin_lock_init(&ufb->dirty_lock); >> ufb->obj =3D obj; >> drm_helper_mode_fill_fb_struct(&ufb->base, mode_cmd); >> ret =3D drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs); >> --=20 >> 2.2.2 >> From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= Subject: Re: [PATCH 8/8] drm/udl: Use drm_fb_helper deferred_io support Date: Wed, 20 Apr 2016 21:20:25 +0200 Message-ID: <5717D679.5070809@tronnes.org> References: <1461165929-11344-1-git-send-email-noralf@tronnes.org> <1461165929-11344-9-git-send-email-noralf@tronnes.org> <20160420175903.GS2510@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from smtp.domeneshop.no (smtp.domeneshop.no [IPv6:2a01:5b40:0:3005::1]) by gabe.freedesktop.org (Postfix) with ESMTPS id 62E846EAF4 for ; Wed, 20 Apr 2016 19:20:32 +0000 (UTC) In-Reply-To: <20160420175903.GS2510@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org, laurent.pinchart@ideasonboard.com, tomi.valkeinen@ti.com, linux-kernel@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org CkRlbiAyMC4wNC4yMDE2IDE5OjU5LCBza3JldiBEYW5pZWwgVmV0dGVyOgo+IE9uIFdlZCwgQXBy IDIwLCAyMDE2IGF0IDA1OjI1OjI5UE0gKzAyMDAsIE5vcmFsZiBUcsO4bm5lcyB3cm90ZToKPj4g VXNlIHRoZSBmYmRldiBkZWZlcnJlZCBpbyBzdXBwb3J0IGluIGRybV9mYl9oZWxwZXIuCj4+IFRo ZSAoc3RydWN0IGZiX29wcyAqKS0+ZmJfe2ZpbGxyZWN0LGNvcHlhcmVhLGltYWdlYmxpdH0gZnVu Y3Rpb25zIHdpbGwKPj4gbm93IGJlIGRlZmVycmVkIGluIHRoZSBzYW1lIHdheSB0aGF0IG1tYXAg ZGFtYWdlIGlzLCBpbnN0ZWFkIG9mIGJlaW5nCj4+IGZsdXNoZWQgZGlyZWN0bHkuCj4+IFRoZSBk ZWZlcnJlZCBtbWFwIGZ1bmN0aW9uYWxpdHkgaXMga2VwdCBkaXNhYmxlZCBieSBkZWZhdWx0LCBi ZWNhdXNlIG9mIHRoZQo+PiBsaXN0IGNvcnJ1cHRpb24gcHJvYmxlbXMgbWVudGlvbmVkIGluIGNv bW1pdCA2NzdkMjNiNzBiZjkKPj4gKCJkcm0vdWRsOiBkaXNhYmxlIGZiX2RlZmlvIGJ5IGRlZmF1 bHQiKS4KPj4gVGhpcyBwYXRjaCBoYXMgb25seSBiZWVuIGNvbXBpbGUgdGVzdGVkLgo+Pgo+PiBT aWduZWQtb2ZmLWJ5OiBOb3JhbGYgVHLDuG5uZXMgPG5vcmFsZkB0cm9ubmVzLm9yZz4KPj4gLS0t Cj4+ICAgZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZHJ2LmggfCAgIDIgLQo+PiAgIGRyaXZlcnMv Z3B1L2RybS91ZGwvdWRsX2ZiLmMgIHwgMTUyICsrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQo+PiAgIDIgZmlsZXMgY2hhbmdlZCwgMTIgaW5zZXJ0aW9ucygrKSwgMTQy IGRlbGV0aW9ucygtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxf ZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9kcnYuaAo+PiBpbmRleCA0YTA2NGVmLi4w YjAzZDM0IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9kcnYuaAo+PiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9kcnYuaAo+PiBAQCAtODEsOCArODEsNiBAQCBz dHJ1Y3QgdWRsX2ZyYW1lYnVmZmVyIHsKPj4gICAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciBiYXNl Owo+PiAgIAlzdHJ1Y3QgdWRsX2dlbV9vYmplY3QgKm9iajsKPj4gICAJYm9vbCBhY3RpdmVfMTY7 IC8qIGFjdGl2ZSBvbiB0aGUgMTYtYml0IGNoYW5uZWwgKi8KPj4gLQlpbnQgeDEsIHkxLCB4Miwg eTI7IC8qIGRpcnR5IHJlY3QgKi8KPj4gLQlzcGlubG9ja190IGRpcnR5X2xvY2s7Cj4+ICAgfTsK Pj4gICAKPj4gICAjZGVmaW5lIHRvX3VkbF9mYih4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IHVk bF9mcmFtZWJ1ZmZlciwgYmFzZSkKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS91ZGwv dWRsX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9mYi5jCj4+IGluZGV4IGE1MmRlMmYu LmI0NGQ0YTcgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX2ZiLmMKPj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZmIuYwo+PiBAQCAtNzcsNjggKzc3LDYgQEAg c3RhdGljIHVpbnQxNl90IHJnYjE2KHVpbnQzMl90IGNvbCkKPj4gICB9Cj4+ICAgI2VuZGlmCj4+ ICAgCj4+IC0vKgo+PiAtICogTk9URTogZmJfZGVmaW8uYyBpcyBob2xkaW5nIGluZm8tPmZiZGVm aW8ubXV0ZXgKPj4gLSAqICAgVG91Y2hpbmcgQU5ZIGZyYW1lYnVmZmVyIG1lbW9yeSB0aGF0IHRy aWdnZXJzIGEgcGFnZSBmYXVsdAo+PiAtICogICBpbiBmYl9kZWZpbyB3aWxsIGNhdXNlIGEgZGVh ZGxvY2ssIHdoZW4gaXQgYWxzbyB0cmllcyB0bwo+PiAtICogICBncmFiIHRoZSBzYW1lIG11dGV4 Lgo+PiAtICovCj4+IC1zdGF0aWMgdm9pZCB1ZGxmYl9kcHlfZGVmZXJyZWRfaW8oc3RydWN0IGZi X2luZm8gKmluZm8sCj4+IC0JCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlbGlzdCkKPj4gLXsK Pj4gLQlzdHJ1Y3QgcGFnZSAqY3VyOwo+PiAtCXN0cnVjdCBmYl9kZWZlcnJlZF9pbyAqZmJkZWZp byA9IGluZm8tPmZiZGVmaW87Cj4+IC0Jc3RydWN0IHVkbF9mYmRldiAqdWZiZGV2ID0gaW5mby0+ cGFyOwo+PiAtCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSB1ZmJkZXYtPnVmYi5iYXNlLmRldjsK Pj4gLQlzdHJ1Y3QgdWRsX2RldmljZSAqdWRsID0gZGV2LT5kZXZfcHJpdmF0ZTsKPj4gLQlzdHJ1 Y3QgdXJiICp1cmI7Cj4+IC0JY2hhciAqY21kOwo+PiAtCWN5Y2xlc190IHN0YXJ0X2N5Y2xlcywg ZW5kX2N5Y2xlczsKPj4gLQlpbnQgYnl0ZXNfc2VudCA9IDA7Cj4+IC0JaW50IGJ5dGVzX2lkZW50 aWNhbCA9IDA7Cj4+IC0JaW50IGJ5dGVzX3JlbmRlcmVkID0gMDsKPj4gLQo+PiAtCWlmICghZmJf ZGVmaW8pCj4+IC0JCXJldHVybjsKPj4gLQo+PiAtCXN0YXJ0X2N5Y2xlcyA9IGdldF9jeWNsZXMo KTsKPj4gLQo+PiAtCXVyYiA9IHVkbF9nZXRfdXJiKGRldik7Cj4+IC0JaWYgKCF1cmIpCj4+IC0J CXJldHVybjsKPj4gLQo+PiAtCWNtZCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwo+PiAtCj4+IC0J Lyogd2FsayB0aGUgd3JpdHRlbiBwYWdlIGxpc3QgYW5kIHJlbmRlciBlYWNoIHRvIGRldmljZSAq Lwo+PiAtCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyLCAmZmJkZWZpby0+cGFnZWxpc3QsIGxydSkg ewo+PiAtCj4+IC0JCWlmICh1ZGxfcmVuZGVyX2hsaW5lKGRldiwgKHVmYmRldi0+dWZiLmJhc2Uu Yml0c19wZXJfcGl4ZWwgLyA4KSwKPj4gLQkJCQkgICAgICZ1cmIsIChjaGFyICopIGluZm8tPmZp eC5zbWVtX3N0YXJ0LAo+PiAtCQkJCSAgICAgJmNtZCwgY3VyLT5pbmRleCA8PCBQQUdFX1NISUZU LAo+PiAtCQkJCSAgICAgY3VyLT5pbmRleCA8PCBQQUdFX1NISUZULAo+PiAtCQkJCSAgICAgUEFH RV9TSVpFLCAmYnl0ZXNfaWRlbnRpY2FsLCAmYnl0ZXNfc2VudCkpCj4+IC0JCQlnb3RvIGVycm9y Owo+PiAtCQlieXRlc19yZW5kZXJlZCArPSBQQUdFX1NJWkU7Cj4+IC0JfQo+PiAtCj4+IC0JaWYg KGNtZCA+IChjaGFyICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyKSB7Cj4+IC0JCS8qIFNlbmQgcGFy dGlhbCBidWZmZXIgcmVtYWluaW5nIGJlZm9yZSBleGl0aW5nICovCj4+IC0JCWludCBsZW4gPSBj bWQgLSAoY2hhciAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKPj4gLQkJdWRsX3N1Ym1pdF91cmIo ZGV2LCB1cmIsIGxlbik7Cj4+IC0JCWJ5dGVzX3NlbnQgKz0gbGVuOwo+PiAtCX0gZWxzZQo+PiAt CQl1ZGxfdXJiX2NvbXBsZXRpb24odXJiKTsKPj4gLQo+PiAtZXJyb3I6Cj4+IC0JYXRvbWljX2Fk ZChieXRlc19zZW50LCAmdWRsLT5ieXRlc19zZW50KTsKPj4gLQlhdG9taWNfYWRkKGJ5dGVzX2lk ZW50aWNhbCwgJnVkbC0+Ynl0ZXNfaWRlbnRpY2FsKTsKPj4gLQlhdG9taWNfYWRkKGJ5dGVzX3Jl bmRlcmVkLCAmdWRsLT5ieXRlc19yZW5kZXJlZCk7Cj4+IC0JZW5kX2N5Y2xlcyA9IGdldF9jeWNs ZXMoKTsKPj4gLQlhdG9taWNfYWRkKCgodW5zaWduZWQgaW50KSAoKGVuZF9jeWNsZXMgLSBzdGFy dF9jeWNsZXMpCj4+IC0JCSAgICA+PiAxMCkpLCAvKiBLY3ljbGVzICovCj4+IC0JCSAgICZ1ZGwt PmNwdV9rY3ljbGVzX3VzZWQpOwo+PiAtfQo+PiAtCj4+ICAgaW50IHVkbF9oYW5kbGVfZGFtYWdl KHN0cnVjdCB1ZGxfZnJhbWVidWZmZXIgKmZiLCBpbnQgeCwgaW50IHksCj4+ICAgCQkgICAgICBp bnQgd2lkdGgsIGludCBoZWlnaHQpCj4+ICAgewo+PiBAQCAtMTUyLDkgKzkwLDYgQEAgaW50IHVk bF9oYW5kbGVfZGFtYWdlKHN0cnVjdCB1ZGxfZnJhbWVidWZmZXIgKmZiLCBpbnQgeCwgaW50IHks Cj4+ICAgCXN0cnVjdCB1cmIgKnVyYjsKPj4gICAJaW50IGFsaWduZWRfeDsKPj4gICAJaW50IGJw cCA9IChmYi0+YmFzZS5iaXRzX3Blcl9waXhlbCAvIDgpOwo+PiAtCWludCB4MiwgeTI7Cj4+IC0J Ym9vbCBzdG9yZV9mb3JfbGF0ZXIgPSBmYWxzZTsKPj4gLQl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ PiAgIAo+PiAgIAlpZiAoIWZiLT5hY3RpdmVfMTYpCj4+ICAgCQlyZXR1cm4gMDsKPj4gQEAgLTE4 MCwzOCArMTE1LDYgQEAgaW50IHVkbF9oYW5kbGVfZGFtYWdlKHN0cnVjdCB1ZGxfZnJhbWVidWZm ZXIgKmZiLCBpbnQgeCwgaW50IHksCj4+ICAgCSAgICAoeSArIGhlaWdodCA+IGZiLT5iYXNlLmhl aWdodCkpCj4+ICAgCQlyZXR1cm4gLUVJTlZBTDsKPj4gICAKPj4gLQkvKiBpZiB3ZSBhcmUgaW4g YXRvbWljIGp1c3Qgc3RvcmUgdGhlIGluZm8KPj4gLQkgICBjYW4ndCB0ZXN0IGluc2lkZSBzcGlu IGxvY2sgKi8KPj4gLQlpZiAoaW5fYXRvbWljKCkpCj4+IC0JCXN0b3JlX2Zvcl9sYXRlciA9IHRy dWU7Cj4+IC0KPj4gLQl4MiA9IHggKyB3aWR0aCAtIDE7Cj4+IC0JeTIgPSB5ICsgaGVpZ2h0IC0g MTsKPj4gLQo+PiAtCXNwaW5fbG9ja19pcnFzYXZlKCZmYi0+ZGlydHlfbG9jaywgZmxhZ3MpOwo+ PiAtCj4+IC0JaWYgKGZiLT55MSA8IHkpCj4+IC0JCXkgPSBmYi0+eTE7Cj4+IC0JaWYgKGZiLT55 MiA+IHkyKQo+PiAtCQl5MiA9IGZiLT55MjsKPj4gLQlpZiAoZmItPngxIDwgeCkKPj4gLQkJeCA9 IGZiLT54MTsKPj4gLQlpZiAoZmItPngyID4geDIpCj4+IC0JCXgyID0gZmItPngyOwo+PiAtCj4+ IC0JaWYgKHN0b3JlX2Zvcl9sYXRlcikgewo+PiAtCQlmYi0+eDEgPSB4Owo+PiAtCQlmYi0+eDIg PSB4MjsKPj4gLQkJZmItPnkxID0geTsKPj4gLQkJZmItPnkyID0geTI7Cj4+IC0JCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmZiLT5kaXJ0eV9sb2NrLCBmbGFncyk7Cj4+IC0JCXJldHVybiAwOwo+ PiAtCX0KPj4gLQo+PiAtCWZiLT54MSA9IGZiLT55MSA9IElOVF9NQVg7Cj4+IC0JZmItPngyID0g ZmItPnkyID0gMDsKPj4gLQo+PiAtCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiLT5kaXJ0eV9s b2NrLCBmbGFncyk7Cj4+ICAgCXN0YXJ0X2N5Y2xlcyA9IGdldF9jeWNsZXMoKTsKPj4gICAKPj4g ICAJdXJiID0gdWRsX2dldF91cmIoZGV2KTsKPj4gQEAgLTIxOSwxNCArMTIyLDE0IEBAIGludCB1 ZGxfaGFuZGxlX2RhbWFnZShzdHJ1Y3QgdWRsX2ZyYW1lYnVmZmVyICpmYiwgaW50IHgsIGludCB5 LAo+PiAgIAkJcmV0dXJuIDA7Cj4+ICAgCWNtZCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwo+PiAg IAo+PiAtCWZvciAoaSA9IHk7IGkgPD0geTIgOyBpKyspIHsKPj4gKwlmb3IgKGkgPSB5OyBpIDwg aGVpZ2h0IDsgaSsrKSB7Cj4+ICAgCQljb25zdCBpbnQgbGluZV9vZmZzZXQgPSBmYi0+YmFzZS5w aXRjaGVzWzBdICogaTsKPj4gICAJCWNvbnN0IGludCBieXRlX29mZnNldCA9IGxpbmVfb2Zmc2V0 ICsgKHggKiBicHApOwo+PiAgIAkJY29uc3QgaW50IGRldl9ieXRlX29mZnNldCA9IChmYi0+YmFz ZS53aWR0aCAqIGJwcCAqIGkpICsgKHggKiBicHApOwo+PiAgIAkJaWYgKHVkbF9yZW5kZXJfaGxp bmUoZGV2LCBicHAsICZ1cmIsCj4+ICAgCQkJCSAgICAgKGNoYXIgKikgZmItPm9iai0+dm1hcHBp bmcsCj4+ICAgCQkJCSAgICAgJmNtZCwgYnl0ZV9vZmZzZXQsIGRldl9ieXRlX29mZnNldCwKPj4g LQkJCQkgICAgICh4MiAtIHggKyAxKSAqIGJwcCwKPj4gKwkJCQkgICAgIHdpZHRoICogYnBwLAo+ PiAgIAkJCQkgICAgICZieXRlc19pZGVudGljYWwsICZieXRlc19zZW50KSkKPj4gICAJCQlnb3Rv IGVycm9yOwo+PiAgIAl9Cj4+IEBAIC0yODMsMzYgKzE4Niw2IEBAIHN0YXRpYyBpbnQgdWRsX2Zi X21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQo+ PiAgIAlyZXR1cm4gMDsKPj4gICB9Cj4+ICAgCj4+IC1zdGF0aWMgdm9pZCB1ZGxfZmJfZmlsbHJl Y3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkK Pj4gLXsKPj4gLQlzdHJ1Y3QgdWRsX2ZiZGV2ICp1ZmJkZXYgPSBpbmZvLT5wYXI7Cj4+IC0KPj4g LQlzeXNfZmlsbHJlY3QoaW5mbywgcmVjdCk7Cj4+IC0KPj4gLQl1ZGxfaGFuZGxlX2RhbWFnZSgm dWZiZGV2LT51ZmIsIHJlY3QtPmR4LCByZWN0LT5keSwgcmVjdC0+d2lkdGgsCj4+IC0JCQkgIHJl Y3QtPmhlaWdodCk7Cj4+IC19Cj4+IC0KPj4gLXN0YXRpYyB2b2lkIHVkbF9mYl9jb3B5YXJlYShz dHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pCj4+ IC17Cj4+IC0Jc3RydWN0IHVkbF9mYmRldiAqdWZiZGV2ID0gaW5mby0+cGFyOwo+PiAtCj4+IC0J c3lzX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7Cj4+IC0KPj4gLQl1ZGxfaGFuZGxlX2RhbWFnZSgm dWZiZGV2LT51ZmIsIHJlZ2lvbi0+ZHgsIHJlZ2lvbi0+ZHksIHJlZ2lvbi0+d2lkdGgsCj4+IC0J CQkgIHJlZ2lvbi0+aGVpZ2h0KTsKPj4gLX0KPj4gLQo+PiAtc3RhdGljIHZvaWQgdWRsX2ZiX2lt YWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFn ZSkKPj4gLXsKPj4gLQlzdHJ1Y3QgdWRsX2ZiZGV2ICp1ZmJkZXYgPSBpbmZvLT5wYXI7Cj4+IC0K Pj4gLQlzeXNfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKPj4gLQo+PiAtCXVkbF9oYW5kbGVfZGFt YWdlKCZ1ZmJkZXYtPnVmYiwgaW1hZ2UtPmR4LCBpbWFnZS0+ZHksIGltYWdlLT53aWR0aCwKPj4g LQkJCSAgaW1hZ2UtPmhlaWdodCk7Cj4+IC19Cj4+IC0KPj4gICAvKgo+PiAgICAqIEl0J3MgY29t bW9uIGZvciBzZXZlcmFsIGNsaWVudHMgdG8gaGF2ZSBmcmFtZWJ1ZmZlciBvcGVuIHNpbXVsdGFu ZW91c2x5Lgo+PiAgICAqIGUuZy4gYm90aCBmYmNvbiBhbmQgWC4gTWFrZXMgdGhpbmdzIGludGVy ZXN0aW5nLgo+PiBAQCAtMzMwLDIwICsyMDMsMjAgQEAgc3RhdGljIGludCB1ZGxfZmJfb3Blbihz dHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCj4+ICAgCj4+ICAgCXVmYmRldi0+ZmJfY291 bnQrKzsKPj4gICAKPj4gLQlpZiAoZmJfZGVmaW8gJiYgKGluZm8tPmZiZGVmaW8gPT0gTlVMTCkp IHsKPj4gLQkJLyogZW5hYmxlIGRlZmlvIGF0IGxhc3QgbW9tZW50IGlmIG5vdCBkaXNhYmxlZCBi eSBjbGllbnQgKi8KPj4gKwlpZiAoIWluZm8tPmZiZGVmaW8pIHsKPj4gKwkJLyogZW5hYmxlIGRl ZmlvIGF0IGxhc3QgbW9tZW50ICovCj4+ICAgCj4+ICAgCQlzdHJ1Y3QgZmJfZGVmZXJyZWRfaW8g KmZiZGVmaW87Cj4+ICAgCj4+ICAgCQlmYmRlZmlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZi X2RlZmVycmVkX2lvKSwgR0ZQX0tFUk5FTCk7Cj4+IC0KPj4gICAJCWlmIChmYmRlZmlvKSB7Cj4+ ICAgCQkJZmJkZWZpby0+ZGVsYXkgPSBETF9ERUZJT19XUklURV9ERUxBWTsKPj4gLQkJCWZiZGVm aW8tPmRlZmVycmVkX2lvID0gdWRsZmJfZHB5X2RlZmVycmVkX2lvOwo+PiArCQkJZmJkZWZpby0+ ZGVmZXJyZWRfaW8gPSBkcm1fZmJfaGVscGVyX2RlZmVycmVkX2lvOwo+IFdoeSBhbGwgdGhlc2Ug Y2hhbmdlcyBoZXJlPyBJIGZpZ3VyZWQganVzdCBleGNoYW5naW5nIHRoZSBkZWZlcnJlZF9pbwo+ IHBvaW50ZXIgc2hvdWxkIGJlIGFsbCB0aGF0J3MgcmVhbGx5IG5lZWRlZCBpbiB0aGUgc2V0dXAg Y29kZT8KCkJlY2F1c2Ugd2UgYWx3YXlzIG5lZWQgdG8gaW5pdGlhbGl6ZSBkZWZlcnJlZF9pbyBz aW5jZSB3ZSB1c2UgaXQncyB3b3JrZXIKdG8gaGFuZGxlIGZiX3tmaWxscmVjdCxjb3B5YXJlYSxp bWFnZWJsaXR9IGRhbWFnZSBpbiBkcm1fZmJfaGVscGVyLgoKVGhlIHByZXZpb3VzIGNvZGUgZGlk bid0IHVzZSBkZWZlcnJlZF9pbyB0byBoYW5kbGUgdGhlc2UsIGl0IGp1c3QgaGFuZGxlZAp0aGUg ZGFtYWdlIGRpcmVjdGx5IHVubGVzcyBpdCB3YXMgcnVubmluZyBpbiBhdG9taWMgY29udGV4dCwg aW4gd2hpY2ggY2FzZQppdCBqdXN0IHJlY29yZGVkIHRoZSBkYW1hZ2UgYW5kIHJldHVybmVkLCBs ZWF2aW5nIGl0IHRvIHRoZSBuZXh0IGNhbGwgdG8KcHVzaCB0aGUgY2hhbmdlcy4KCkFuZCBpbiB0 aGUgZm9sbG93aW5nIGNvZGUgSSBmaXhlZCBhIG51bGwgcG9pbnRlciBwcm9ibGVtIGFzIHdlbGws IG1heWJlIEkKc2hvdWxkbid0IGhhdmUgcGFja2VkIGl0IGluIGhlcmUuIElmIGZiZGVmaW8gYWxs b2NhdGlvbiBmYWlscyA9PSBOVUxMLApmYl9kZWZlcnJlZF9pb19pbml0KCkgd2lsbCB0cmlnZ2Vy IGEgQlVHKCkuCgo+IC1EYW5pZWwKPgo+PiArCQkJaW5mby0+ZmJkZWZpbyA9IGZiZGVmaW87Cj4+ ICsJCQlmYl9kZWZlcnJlZF9pb19pbml0KGluZm8pOwo+PiArCQkJaWYgKCFmYl9kZWZpbykgLyog c2VlIGNvbW1pdCA2NzdkMjNiICovCj4+ICsJCQkJaW5mby0+ZmJvcHMtPmZiX21tYXAgPSB1ZGxf ZmJfbW1hcDsKPj4gICAJCX0KPj4gLQo+PiAtCQlpbmZvLT5mYmRlZmlvID0gZmJkZWZpbzsKPj4g LQkJZmJfZGVmZXJyZWRfaW9faW5pdChpbmZvKTsKPj4gICAJfQo+PiAgIAo+PiAgIAlwcl9ub3Rp Y2UoIm9wZW4gL2Rldi9mYiVkIHVzZXI9JWQgZmJfaW5mbz0lcCBjb3VudD0lZFxuIiwKPj4gQEAg LTM3OSw5ICsyNTIsOSBAQCBzdGF0aWMgc3RydWN0IGZiX29wcyB1ZGxmYl9vcHMgPSB7Cj4+ICAg CS5vd25lciA9IFRISVNfTU9EVUxFLAo+PiAgIAkuZmJfY2hlY2tfdmFyID0gZHJtX2ZiX2hlbHBl cl9jaGVja192YXIsCj4+ICAgCS5mYl9zZXRfcGFyID0gZHJtX2ZiX2hlbHBlcl9zZXRfcGFyLAo+ PiAtCS5mYl9maWxscmVjdCA9IHVkbF9mYl9maWxscmVjdCwKPj4gLQkuZmJfY29weWFyZWEgPSB1 ZGxfZmJfY29weWFyZWEsCj4+IC0JLmZiX2ltYWdlYmxpdCA9IHVkbF9mYl9pbWFnZWJsaXQsCj4+ ICsJLmZiX2ZpbGxyZWN0ID0gZHJtX2ZiX2hlbHBlcl9zeXNfZmlsbHJlY3QsCj4+ICsJLmZiX2Nv cHlhcmVhID0gZHJtX2ZiX2hlbHBlcl9zeXNfY29weWFyZWEsCj4+ICsJLmZiX2ltYWdlYmxpdCA9 IGRybV9mYl9oZWxwZXJfc3lzX2ltYWdlYmxpdCwKPj4gICAJLmZiX3Bhbl9kaXNwbGF5ID0gZHJt X2ZiX2hlbHBlcl9wYW5fZGlzcGxheSwKPj4gICAJLmZiX2JsYW5rID0gZHJtX2ZiX2hlbHBlcl9i bGFuaywKPj4gICAJLmZiX3NldGNtYXAgPSBkcm1fZmJfaGVscGVyX3NldGNtYXAsCj4+IEBAIC00 NTgsNyArMzMxLDYgQEAgdWRsX2ZyYW1lYnVmZmVyX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRl diwKPj4gICB7Cj4+ICAgCWludCByZXQ7Cj4+ICAgCj4+IC0Jc3Bpbl9sb2NrX2luaXQoJnVmYi0+ ZGlydHlfbG9jayk7Cj4+ICAgCXVmYi0+b2JqID0gb2JqOwo+PiAgIAlkcm1faGVscGVyX21vZGVf ZmlsbF9mYl9zdHJ1Y3QoJnVmYi0+YmFzZSwgbW9kZV9jbWQpOwo+PiAgIAlyZXQgPSBkcm1fZnJh bWVidWZmZXJfaW5pdChkZXYsICZ1ZmItPmJhc2UsICZ1ZGxmYl9mdW5jcyk7Cj4+IC0tIAo+PiAy LjIuMgo+PgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K ZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0 dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==