aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/Kbuild
Commit message (Expand)AuthorAge
* fanotify: allow fanotify to be builtEric Paris2010-10-28
* Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6Linus Torvalds2010-10-28
|\
| * Merge 'staging-next' to Linus's treeGreg Kroah-Hartman2010-10-28
| |\
| | * smbfs: move to drivers/stagingArnd Bergmann2010-10-05
* | | Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git...Linus Torvalds2010-10-28
|\ \ \ | |/ / |/| |
| * | V4L/DVB: videotext: remove this obsolete APIHans Verkuil2010-10-20
* | | Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/ne...David S. Miller2010-10-21
|\| |
| * | fanotify: disable fanotify syscallsEric Paris2010-10-11
| |/
* / RDS: Add rds.h to exported headers listAndy Grover2010-09-08
|/
* include: replace unifdef-y with header-ySam Ravnborg2010-08-14
* Merge branch 'for-2.6.36' of git://git.kernel.dk/linux-2.6-blockLinus Torvalds2010-08-10
|\
| * block: fix missing export of blk_types.hJens Axboe2010-08-07
* | Merge branch 'for-linus' of git://git.infradead.org/users/eparis/notifyLinus Torvalds2010-08-10
|\ \
| * | fanotify: fscking all notification systemEric Paris2010-07-28
| |/
* / l2tp: fix export of header file for userspaceJames Chapman2010-08-03
|/
* X25: Add if_x25.h and x25 to device identifiersAndrew Hendry2010-04-22
* Merge branch 'for-linus' of git://gitorious.org/linux-omap-dss2/linuxLinus Torvalds2010-03-02
|\
| * OMAP: DSS2: OMAPFB: install omapfb.hVille Syrjälä2010-03-01
* | Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6Linus Torvalds2010-03-02
|\ \
| * | vhost_net: a kernel-level virtio serverMichael S. Tsirkin2010-01-15
| |/
* / cciss: export linux/cciss_defs.h headerdann frazier2010-02-23
|/
* net: add net_tstamp.h to headers_installJie Zhang2009-12-12
* tty: esp: remove broken driverAlan Cox2009-12-11
* Merge branch 'master' into nextJames Morris2009-12-03
|\
| * virtio: let header files include virtio_ids.hChristian Borntraeger2009-10-22
| * perf_events: Make ABI definitions available to userspaceChuck Ebbert2009-10-06
* | define convenient securebits masks for prctl users (v2)Serge E. Hallyn2009-10-29
|/
* KVM: export kvm_para.hMichael S. Tsirkin2009-09-10
* dm raid1: add userspace logJonthan Brassow2009-06-22
* LinuxPPS: core supportRodolfo Giometti2009-06-18
* Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds...David S. Miller2009-06-15
|\
| * fs/qnx4: sanitize includesAl Viro2009-06-11
* | rfkill: rewriteJohannes Berg2009-06-03
|/
* romfs: cleanup romfs_fs.hChristoph Hellwig2009-05-09
* add fiemap.h to header-yEric Sandeen2009-04-02
* V4L/DVB (10870a): remove all references for video_decoder.hMauro Carvalho Chehab2009-03-30
* V4L/DVB(10738a): remove include/linux/video_encoder.hMauro Carvalho Chehab2009-03-30
* Network Drop Monitor: Adding Build changes to enable drop monitorNeil Horman2009-03-13
* net headers: export dcbnl.hChris Leech2009-03-01
* Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds...David S. Miller2009-02-03
|\
| * include/linux: Add bsg.h to the Kernel exported headersBoaz Harrosh2009-01-30
* | net: Fix userland breakage wrt. linux/if_tunnel.hDavid S. Miller2009-02-02
|/
* wimax: export linux/wimax.h and linux/wimax/i2400m.h with headers_installInaky Perez-Gonzalez2009-01-07
* byteorder: remove the now unused byteorder.hHarvey Harrison2009-01-06
* quota: Unexport dqblk_v1.h and dqblk_v2.hJan Kara2009-01-05
* quota: Move quotaio_v[12].h from include/linux/ to fs/Jan Kara2009-01-05
* sparse irqs: add irqnr.h to the user headers listIngo Molnar2008-12-12
* byteorder: add new headers for make headers-installHarvey Harrison2008-10-20
* Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dto...Linus Torvalds2008-10-16
|\
| * Merge branch 'next' into for-linusDmitry Torokhov2008-10-15
| |\
> spin_unlock_irqrestore(&zone->lru_lock, flags); } free_hot_cold_page(page, 0); } static void put_compound_page(struct page *page) { page = compound_head(page); if (put_page_testzero(page)) { compound_page_dtor *dtor; dtor = get_compound_page_dtor(page); (*dtor)(page); } } void put_page(struct page *page) { if (unlikely(PageCompound(page))) put_compound_page(page); else if (put_page_testzero(page)) __page_cache_release(page); } EXPORT_SYMBOL(put_page); /** * put_pages_list() - release a list of pages * @pages: list of pages threaded on page->lru * * Release a list of pages which are strung together on page.lru. Currently * used by read_cache_pages() and related error recovery code. */ void put_pages_list(struct list_head *pages) { while (!list_empty(pages)) { struct page *victim; victim = list_entry(pages->prev, struct page, lru); list_del(&victim->lru); page_cache_release(victim); } } EXPORT_SYMBOL(put_pages_list); /* * pagevec_move_tail() must be called with IRQ disabled. * Otherwise this may cause nasty races. */ static void pagevec_move_tail(struct pagevec *pvec) { int i; int pgmoved = 0; struct zone *zone = NULL; for (i = 0; i < pagevec_count(pvec); i++) { struct page *page = pvec->pages[i]; struct zone *pagezone = page_zone(page); if (pagezone != zone) { if (zone) spin_unlock(&zone->lru_lock); zone = pagezone; spin_lock(&zone->lru_lock); } if (PageLRU(page) && !PageActive(page) && !PageUnevictable(page)) { int lru = page_lru_base_type(page); list_move_tail(&page->lru, &zone->lru[lru].list); pgmoved++; } } if (zone) spin_unlock(&zone->lru_lock); __count_vm_events(PGROTATED, pgmoved); release_pages(pvec->pages, pvec->nr, pvec->cold); pagevec_reinit(pvec); } /* * Writeback is about to end against a page which has been marked for immediate * reclaim. If it still appears to be reclaimable, move it to the tail of the * inactive list. */ void rotate_reclaimable_page(struct page *page) { if (!PageLocked(page) && !PageDirty(page) && !PageActive(page) && !PageUnevictable(page) && PageLRU(page)) { struct pagevec *pvec; unsigned long flags; page_cache_get(page); local_irq_save(flags); pvec = &__get_cpu_var(lru_rotate_pvecs); if (!pagevec_add(pvec, page)) pagevec_move_tail(pvec); local_irq_restore(flags); } } static void update_page_reclaim_stat(struct zone *zone, struct page *page, int file, int rotated) { struct zone_reclaim_stat *reclaim_stat = &zone->reclaim_stat; struct zone_reclaim_stat *memcg_reclaim_stat; memcg_reclaim_stat = mem_cgroup_get_reclaim_stat_from_page(page); reclaim_stat->recent_scanned[file]++; if (rotated) reclaim_stat->recent_rotated[file]++; if (!memcg_reclaim_stat) return; memcg_reclaim_stat->recent_scanned[file]++; if (rotated) memcg_reclaim_stat->recent_rotated[file]++; } /* * FIXME: speed this up? */ void activate_page(struct page *page) { struct zone *zone = page_zone(page); spin_lock_irq(&zone->lru_lock); if (PageLRU(page) && !PageActive(page) && !PageUnevictable(page)) { int file = page_is_file_cache(page); int lru = page_lru_base_type(page); del_page_from_lru_list(zone, page, lru); SetPageActive(page); lru += LRU_ACTIVE; add_page_to_lru_list(zone, page, lru); __count_vm_event(PGACTIVATE); update_page_reclaim_stat(zone, page, file, 1); } spin_unlock_irq(&zone->lru_lock); } /* * Mark a page as having seen activity. * * inactive,unreferenced -> inactive,referenced * inactive,referenced -> active,unreferenced * active,unreferenced -> active,referenced */ void mark_page_accessed(struct page *page) { if (!PageActive(page) && !PageUnevictable(page) && PageReferenced(page) && PageLRU(page)) { activate_page(page); ClearPageReferenced(page); } else if (!PageReferenced(page)) { SetPageReferenced(page); } } EXPORT_SYMBOL(mark_page_accessed); void __lru_cache_add(struct page *page, enum lru_list lru) { struct pagevec *pvec = &get_cpu_var(lru_add_pvecs)[lru]; page_cache_get(page); if (!pagevec_add(pvec, page)) ____pagevec_lru_add(pvec, lru); put_cpu_var(lru_add_pvecs); } /** * lru_cache_add_lru - add a page to a page list * @page: the page to be added to the LRU. * @lru: the LRU list to which the page is added. */ void lru_cache_add_lru(struct page *page, enum lru_list lru) { if (PageActive(page)) { VM_BUG_ON(PageUnevictable(page)); ClearPageActive(page); } else if (PageUnevictable(page)) { VM_BUG_ON(PageActive(page)); ClearPageUnevictable(page); } VM_BUG_ON(PageLRU(page) || PageActive(page) || PageUnevictable(page)); __lru_cache_add(page, lru); } /** * add_page_to_unevictable_list - add a page to the unevictable list * @page: the page to be added to the unevictable list * * Add page directly to its zone's unevictable list. To avoid races with * tasks that might be making the page evictable, through eg. munlock, * munmap or exit, while it's not on the lru, we want to add the page * while it's locked or otherwise "invisible" to other tasks. This is * difficult to do when using the pagevec cache, so bypass that. */ void add_page_to_unevictable_list(struct page *page) { struct zone *zone = page_zone(page); spin_lock_irq(&zone->lru_lock); SetPageUnevictable(page); SetPageLRU(page); add_page_to_lru_list(zone, page, LRU_UNEVICTABLE); spin_unlock_irq(&zone->lru_lock); } /* * Drain pages out of the cpu's pagevecs. * Either "cpu" is the current CPU, and preemption has already been * disabled; or "cpu" is being hot-unplugged, and is already dead. */ static void drain_cpu_pagevecs(int cpu) { struct pagevec *pvecs = per_cpu(lru_add_pvecs, cpu); struct pagevec *pvec; int lru; for_each_lru(lru) { pvec = &pvecs[lru - LRU_BASE]; if (pagevec_count(pvec)) ____pagevec_lru_add(pvec, lru); } pvec = &per_cpu(lru_rotate_pvecs, cpu); if (pagevec_count(pvec)) { unsigned long flags; /* No harm done if a racing interrupt already did this */ local_irq_save(flags); pagevec_move_tail(pvec); local_irq_restore(flags); } } void lru_add_drain(void) { drain_cpu_pagevecs(get_cpu()); put_cpu(); } static void lru_add_drain_per_cpu(struct work_struct *dummy) { lru_add_drain(); } /* * Returns 0 for success */ int lru_add_drain_all(void) { return schedule_on_each_cpu(lru_add_drain_per_cpu); } /* * Batched page_cache_release(). Decrement the reference count on all the * passed pages. If it fell to zero then remove the page from the LRU and * free it. * * Avoid taking zone->lru_lock if possible, but if it is taken, retain it * for the remainder of the operation. * * The locking in this function is against shrink_inactive_list(): we recheck * the page count inside the lock to see whether shrink_inactive_list() * grabbed the page via the LRU. If it did, give up: shrink_inactive_list() * will free it. */ void release_pages(struct page **pages, int nr, int cold) { int i; struct pagevec pages_to_free; struct zone *zone = NULL; unsigned long uninitialized_var(flags); pagevec_init(&pages_to_free, cold); for (i = 0; i < nr; i++) { struct page *page = pages[i]; if (unlikely(PageCompound(page))) { if (zone) { spin_unlock_irqrestore(&zone->lru_lock, flags); zone = NULL; } put_compound_page(page); continue; } if (!put_page_testzero(page)) continue; if (PageLRU(page)) { struct zone *pagezone = page_zone(page); if (pagezone != zone) { if (zone) spin_unlock_irqrestore(&zone->lru_lock, flags); zone = pagezone; spin_lock_irqsave(&zone->lru_lock, flags); } VM_BUG_ON(!PageLRU(page)); __ClearPageLRU(page); del_page_from_lru(zone, page); } if (!pagevec_add(&pages_to_free, page)) { if (zone) { spin_unlock_irqrestore(&zone->lru_lock, flags); zone = NULL; } __pagevec_free(&pages_to_free); pagevec_reinit(&pages_to_free); } } if (zone) spin_unlock_irqrestore(&zone->lru_lock, flags); pagevec_free(&pages_to_free); } /* * The pages which we're about to release may be in the deferred lru-addition * queues. That would prevent them from really being freed right now. That's * OK from a correctness point of view but is inefficient - those pages may be * cache-warm and we want to give them back to the page allocator ASAP. * * So __pagevec_release() will drain those queues here. __pagevec_lru_add() * and __pagevec_lru_add_active() call release_pages() directly to avoid * mutual recursion. */ void __pagevec_release(struct pagevec *pvec) { lru_add_drain(); release_pages(pvec->pages, pagevec_count(pvec), pvec->cold); pagevec_reinit(pvec); } EXPORT_SYMBOL(__pagevec_release); /* * Add the passed pages to the LRU, then drop the caller's refcount * on them. Reinitialises the caller's pagevec. */ void ____pagevec_lru_add(struct pagevec *pvec, enum lru_list lru) { int i; struct zone *zone = NULL; VM_BUG_ON(is_unevictable_lru(lru)); for (i = 0; i < pagevec_count(pvec); i++) { struct page *page = pvec->pages[i]; struct zone *pagezone = page_zone(page); int file; int active; if (pagezone != zone) { if (zone) spin_unlock_irq(&zone->lru_lock); zone = pagezone; spin_lock_irq(&zone->lru_lock); } VM_BUG_ON(PageActive(page)); VM_BUG_ON(PageUnevictable(page)); VM_BUG_ON(PageLRU(page)); SetPageLRU(page); active = is_active_lru(lru); file = is_file_lru(lru); if (active) SetPageActive(page); update_page_reclaim_stat(zone, page, file, active); add_page_to_lru_list(zone, page, lru); } if (zone) spin_unlock_irq(&zone->lru_lock); release_pages(pvec->pages, pvec->nr, pvec->cold); pagevec_reinit(pvec); } EXPORT_SYMBOL(____pagevec_lru_add); /* * Try to drop buffers from the pages in a pagevec */ void pagevec_strip(struct pagevec *pvec) { int i; for (i = 0; i < pagevec_count(pvec); i++) { struct page *page = pvec->pages[i]; if (page_has_private(page) && trylock_page(page)) { if (page_has_private(page)) try_to_release_page(page, 0); unlock_page(page); } } } /** * pagevec_lookup - gang pagecache lookup * @pvec: Where the resulting pages are placed * @mapping: The address_space to search * @start: The starting page index * @nr_pages: The maximum number of pages * * pagevec_lookup() will search for and return a group of up to @nr_pages pages * in the mapping. The pages are placed in @pvec. pagevec_lookup() takes a * reference against the pages in @pvec. * * The search returns a group of mapping-contiguous pages with ascending * indexes. There may be holes in the indices due to not-present pages. * * pagevec_lookup() returns the number of pages which were found. */ unsigned pagevec_lookup(struct pagevec *pvec, struct address_space *mapping, pgoff_t start, unsigned nr_pages) { pvec->nr = find_get_pages(mapping, start, nr_pages, pvec->pages); return pagevec_count(pvec); } EXPORT_SYMBOL(pagevec_lookup); unsigned pagevec_lookup_tag(struct pagevec *pvec, struct address_space *mapping, pgoff_t *index, int tag, unsigned nr_pages) { pvec->nr = find_get_pages_tag(mapping, index, tag, nr_pages, pvec->pages); return pagevec_count(pvec); } EXPORT_SYMBOL(pagevec_lookup_tag); /* * Perform any setup for the swap system */ void __init swap_setup(void) { unsigned long megs = totalram_pages >> (20 - PAGE_SHIFT); #ifdef CONFIG_SWAP bdi_init(swapper_space.backing_dev_info); #endif /* Use a smaller cluster for small-memory machines */ if (megs < 16) page_cluster = 2; else page_cluster = 3; /* * Right now other parts of the system means that we * _really_ don't want to cluster much more */ }