drivers/video/fbdev/core/fb_defio.c
Source file repositories/reference/linux-study-clean/drivers/video/fbdev/core/fb_defio.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/video/fbdev/core/fb_defio.c- Extension
.c- Size
- 12553 bytes
- Lines
- 480
- Domain
- Driver Families
- Bucket
- drivers/video
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/module.hlinux/kernel.hlinux/errno.hlinux/export.hlinux/string.hlinux/mm.hlinux/vmalloc.hlinux/delay.hlinux/interrupt.hlinux/fb.hlinux/list.hlinux/rmap.hlinux/pagemap.h
Detected Declarations
struct address_spacestruct fb_deferred_io_statefunction fb_deferred_io_state_releasefunction fb_deferred_io_state_getfunction __fb_deferred_io_state_releasefunction fb_deferred_io_state_putfunction fb_deferred_io_vm_openfunction fb_deferred_io_vm_closefunction fb_deferred_io_pageref_lookupfunction fb_deferred_io_pageref_putfunction fb_deferred_io_faultfunction fb_deferred_io_fsyncfunction fb_deferred_io_track_pagefunction fb_deferred_io_page_mkwritefunction fb_deferred_io_mkwritefunction fb_deferred_io_mmapfunction fb_deferred_io_workfunction fb_deferred_io_initfunction fb_deferred_io_openfunction fb_deferred_io_lastclosefunction fb_deferred_io_releasefunction fb_deferred_io_cleanupexport fb_deferred_io_fsyncexport fb_deferred_io_mmapexport fb_deferred_io_initexport fb_deferred_io_openexport fb_deferred_io_releaseexport fb_deferred_io_cleanup
Annotated Snippet
struct fb_deferred_io_state {
struct kref ref;
int open_count; /* number of opened files; protected by fb_info lock */
struct address_space *mapping; /* page cache object for fb device */
struct mutex lock; /* mutex that protects the pageref list */
/* fields protected by lock */
struct fb_info *info;
struct list_head pagereflist; /* list of pagerefs for touched pages */
unsigned long npagerefs;
struct fb_deferred_io_pageref *pagerefs;
};
static struct fb_deferred_io_state *fb_deferred_io_state_alloc(unsigned long len)
{
struct fb_deferred_io_state *fbdefio_state;
struct fb_deferred_io_pageref *pagerefs;
unsigned long npagerefs;
fbdefio_state = kzalloc_obj(*fbdefio_state);
if (!fbdefio_state)
return NULL;
npagerefs = DIV_ROUND_UP(len, PAGE_SIZE);
/* alloc a page ref for each page of the display memory */
pagerefs = kvzalloc_objs(*pagerefs, npagerefs);
if (!pagerefs)
goto err_kfree;
fbdefio_state->npagerefs = npagerefs;
fbdefio_state->pagerefs = pagerefs;
kref_init(&fbdefio_state->ref);
mutex_init(&fbdefio_state->lock);
INIT_LIST_HEAD(&fbdefio_state->pagereflist);
return fbdefio_state;
err_kfree:
kfree(fbdefio_state);
return NULL;
}
static void fb_deferred_io_state_release(struct fb_deferred_io_state *fbdefio_state)
{
WARN_ON(!list_empty(&fbdefio_state->pagereflist));
mutex_destroy(&fbdefio_state->lock);
kvfree(fbdefio_state->pagerefs);
kfree(fbdefio_state);
}
static void fb_deferred_io_state_get(struct fb_deferred_io_state *fbdefio_state)
{
kref_get(&fbdefio_state->ref);
}
static void __fb_deferred_io_state_release(struct kref *ref)
{
struct fb_deferred_io_state *fbdefio_state =
container_of(ref, struct fb_deferred_io_state, ref);
fb_deferred_io_state_release(fbdefio_state);
}
static void fb_deferred_io_state_put(struct fb_deferred_io_state *fbdefio_state)
{
kref_put(&fbdefio_state->ref, __fb_deferred_io_state_release);
}
/*
* struct vm_operations_struct
*/
static void fb_deferred_io_vm_open(struct vm_area_struct *vma)
{
struct fb_deferred_io_state *fbdefio_state = vma->vm_private_data;
WARN_ON_ONCE(!try_module_get(THIS_MODULE));
fb_deferred_io_state_get(fbdefio_state);
}
static void fb_deferred_io_vm_close(struct vm_area_struct *vma)
{
struct fb_deferred_io_state *fbdefio_state = vma->vm_private_data;
fb_deferred_io_state_put(fbdefio_state);
module_put(THIS_MODULE);
Annotation
- Immediate include surface: `linux/module.h`, `linux/kernel.h`, `linux/errno.h`, `linux/export.h`, `linux/string.h`, `linux/mm.h`, `linux/vmalloc.h`, `linux/delay.h`.
- Detected declarations: `struct address_space`, `struct fb_deferred_io_state`, `function fb_deferred_io_state_release`, `function fb_deferred_io_state_get`, `function __fb_deferred_io_state_release`, `function fb_deferred_io_state_put`, `function fb_deferred_io_vm_open`, `function fb_deferred_io_vm_close`, `function fb_deferred_io_pageref_lookup`, `function fb_deferred_io_pageref_put`.
- Atlas domain: Driver Families / drivers/video.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.