Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

fbdev: defio: Move pageref array to struct fb_deferred_io_state

The pageref array stores all pageref structures for a device's defio
helpers. Move it into struct fb_deferred_io_state to not expose it to
drivers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Helge Deller <deller@gmx.de>

authored by

Thomas Zimmermann and committed by
Helge Deller
02fe86e5 648bfb62

+27 -30
+27 -28
drivers/video/fbdev/core/fb_defio.c
··· 41 41 /* fields protected by lock */ 42 42 struct fb_info *info; 43 43 struct list_head pagereflist; /* list of pagerefs for touched pages */ 44 + unsigned long npagerefs; 45 + struct fb_deferred_io_pageref *pagerefs; 44 46 }; 45 47 46 - static struct fb_deferred_io_state *fb_deferred_io_state_alloc(void) 48 + static struct fb_deferred_io_state *fb_deferred_io_state_alloc(unsigned long len) 47 49 { 48 50 struct fb_deferred_io_state *fbdefio_state; 51 + struct fb_deferred_io_pageref *pagerefs; 52 + unsigned long npagerefs; 49 53 50 54 fbdefio_state = kzalloc_obj(*fbdefio_state); 51 55 if (!fbdefio_state) 52 56 return NULL; 57 + 58 + npagerefs = DIV_ROUND_UP(len, PAGE_SIZE); 59 + 60 + /* alloc a page ref for each page of the display memory */ 61 + pagerefs = kvzalloc_objs(*pagerefs, npagerefs); 62 + if (!pagerefs) 63 + goto err_kfree; 64 + fbdefio_state->npagerefs = npagerefs; 65 + fbdefio_state->pagerefs = pagerefs; 53 66 54 67 kref_init(&fbdefio_state->ref); 55 68 mutex_init(&fbdefio_state->lock); ··· 70 57 INIT_LIST_HEAD(&fbdefio_state->pagereflist); 71 58 72 59 return fbdefio_state; 60 + 61 + err_kfree: 62 + kfree(fbdefio_state); 63 + return NULL; 73 64 } 74 65 75 66 static void fb_deferred_io_state_release(struct fb_deferred_io_state *fbdefio_state) 76 67 { 77 68 WARN_ON(!list_empty(&fbdefio_state->pagereflist)); 78 69 mutex_destroy(&fbdefio_state->lock); 70 + kvfree(fbdefio_state->pagerefs); 79 71 80 72 kfree(fbdefio_state); 81 73 } ··· 143 125 return page; 144 126 } 145 127 146 - static struct fb_deferred_io_pageref *fb_deferred_io_pageref_lookup(struct fb_info *info, 147 - unsigned long offset, 148 - struct page *page) 128 + static struct fb_deferred_io_pageref * 129 + fb_deferred_io_pageref_lookup(struct fb_deferred_io_state *fbdefio_state, unsigned long offset, 130 + struct page *page) 149 131 { 132 + struct fb_info *info = fbdefio_state->info; 150 133 unsigned long pgoff = offset >> PAGE_SHIFT; 151 134 struct fb_deferred_io_pageref *pageref; 152 135 153 - if (fb_WARN_ON_ONCE(info, pgoff >= info->npagerefs)) 136 + if (fb_WARN_ON_ONCE(info, pgoff >= fbdefio_state->npagerefs)) 154 137 return NULL; /* incorrect allocation size */ 155 138 156 139 /* 1:1 mapping between pageref and page offset */ 157 - pageref = &info->pagerefs[pgoff]; 140 + pageref = &fbdefio_state->pagerefs[pgoff]; 158 141 159 142 if (pageref->page) 160 143 goto out; ··· 179 160 struct list_head *pos = &fbdefio_state->pagereflist; 180 161 struct fb_deferred_io_pageref *pageref, *cur; 181 162 182 - pageref = fb_deferred_io_pageref_lookup(info, offset, page); 163 + pageref = fb_deferred_io_pageref_lookup(fbdefio_state, offset, page); 183 164 if (!pageref) 184 165 return NULL; 185 166 ··· 416 397 { 417 398 struct fb_deferred_io *fbdefio = info->fbdefio; 418 399 struct fb_deferred_io_state *fbdefio_state; 419 - struct fb_deferred_io_pageref *pagerefs; 420 - unsigned long npagerefs; 421 - int ret; 422 400 423 401 BUG_ON(!fbdefio); 424 402 425 403 if (WARN_ON(!info->fix.smem_len)) 426 404 return -EINVAL; 427 405 428 - fbdefio_state = fb_deferred_io_state_alloc(); 406 + fbdefio_state = fb_deferred_io_state_alloc(info->fix.smem_len); 429 407 if (!fbdefio_state) 430 408 return -ENOMEM; 431 409 fbdefio_state->info = info; ··· 431 415 if (fbdefio->delay == 0) /* set a default of 1 s */ 432 416 fbdefio->delay = HZ; 433 417 434 - npagerefs = DIV_ROUND_UP(info->fix.smem_len, PAGE_SIZE); 435 - 436 - /* alloc a page ref for each page of the display memory */ 437 - pagerefs = kvzalloc_objs(*pagerefs, npagerefs); 438 - if (!pagerefs) { 439 - ret = -ENOMEM; 440 - goto err; 441 - } 442 - info->npagerefs = npagerefs; 443 - info->pagerefs = pagerefs; 444 - 445 418 info->fbdefio_state = fbdefio_state; 446 419 447 420 return 0; 448 - 449 - err: 450 - fb_deferred_io_state_release(fbdefio_state); 451 - return ret; 452 421 } 453 422 EXPORT_SYMBOL_GPL(fb_deferred_io_init); 454 423 ··· 476 475 mutex_unlock(&fbdefio_state->lock); 477 476 478 477 fb_deferred_io_state_put(fbdefio_state); 479 - 480 - kvfree(info->pagerefs); 481 478 } 482 479 EXPORT_SYMBOL_GPL(fb_deferred_io_cleanup);
-2
include/linux/fb.h
··· 482 482 483 483 #ifdef CONFIG_FB_DEFERRED_IO 484 484 struct delayed_work deferred_work; 485 - unsigned long npagerefs; 486 - struct fb_deferred_io_pageref *pagerefs; 487 485 struct fb_deferred_io *fbdefio; 488 486 struct fb_deferred_io_state *fbdefio_state; 489 487 #endif