vmkdrivers/BLD/build/HEADERS/CUR-9-vmkdrivers-asm-x64/vmkernel64/release/asm/mm_track.h
2015-10-23 15:48:45 -04:00

98 lines
3.2 KiB
C

/*
* Routines and structures for building a bitmap of
* dirty pages in a live system. For use in memory mirroring
* or migration applications.
*
* Copyright (C) 2006 Stratus Technologies Bermuda Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __X86_64_MMTRACK_H__
#define __X86_64_MMTRACK_H__
#ifndef CONFIG_TRACK_DIRTY_PAGES
static inline void mm_track_pte(pte_t *ptep) {}
static inline void mm_track_pmd(pmd_t *pmdp) {}
static inline void mm_track_pud(pud_t *pudp) {}
static inline void mm_track_pgd(pgd_t *pgdp) {}
static inline void mm_track_phys(void *physp) {}
#else
#include <asm/page.h>
#include <asm/atomic.h>
/*
* For memory-tracking purposes, if active is true (non-zero), the other
* elements of the structure are available for use. Each time mm_track_pte
* is called, it increments count and sets a bit in the bitvector table.
* Each bit in the bitvector represents a physical page in memory.
*
* This is declared in arch/x86_64/mm/track.c.
*
* The in_use element is used in the code which drives the memory tracking
* environment. When tracking is complete, the vector may be freed, but
* only after the active flag is set to zero and the in_use count goes to
* zero.
*
* The count element indicates how many pages have been stored in the
* bitvector. This is an optimization to avoid counting the bits in the
* vector between harvest operations.
*/
struct mm_tracker {
int active; // non-zero if this structure in use
atomic_t count; // number of pages tracked by mm_track()
unsigned long * vector; // bit vector of modified pages
unsigned long bitcnt; // number of bits in vector
};
extern struct mm_tracker mm_tracking_struct;
extern void do_mm_track_pte(void *);
extern void do_mm_track_pmd(void *);
extern void do_mm_track_pud(void *);
extern void do_mm_track_pgd(void *);
extern void do_mm_track_phys(void *);
/*
* The mm_track routine is needed by macros in pgtable.h
*/
static __inline__ void mm_track_pte(pte_t *ptep)
{
if (unlikely(mm_tracking_struct.active))
do_mm_track_pte(ptep);
}
static __inline__ void mm_track_pmd(pmd_t *pmdp)
{
if (unlikely(mm_tracking_struct.active))
do_mm_track_pmd(pmdp);
}
static __inline__ void mm_track_pud(pud_t *pudp)
{
if (unlikely(mm_tracking_struct.active))
do_mm_track_pud(pudp);
}
static __inline__ void mm_track_pgd(pgd_t *pgdp)
{
if (unlikely(mm_tracking_struct.active))
do_mm_track_pgd(pgdp);
}
static __inline__ void mm_track_phys(void *physp)
{
if (unlikely(mm_tracking_struct.active))
do_mm_track_phys(physp);
}
#endif /* CONFIG_TRACK_DIRTY_PAGES */
#endif /* __X86_64_MMTRACK_H__ */