milos-linux/include/uapi/linux
Minchan Kim 48b4800a1c zsmalloc: page migration support
This patch introduces run-time migration feature for zspage.

For migration, VM uses page.lru field so it would be better to not use
page.next field which is unified with page.lru for own purpose.  For
that, firstly, we can get first object offset of the page via runtime
calculation instead of using page.index so we can use page.index as link
for page chaining instead of page.next.

In case of huge object, it stores handle to page.index instead of next
link of page chaining because huge object doesn't need to next link for
page chaining.  So get_next_page need to identify huge object to return
NULL.  For it, this patch uses PG_owner_priv_1 flag of the page flag.

For migration, it supports three functions

* zs_page_isolate

It isolates a zspage which includes a subpage VM want to migrate from
class so anyone cannot allocate new object from the zspage.

We could try to isolate a zspage by the number of subpage so subsequent
isolation trial of other subpage of the zpsage shouldn't fail.  For
that, we introduce zspage.isolated count.  With that, zs_page_isolate
can know whether zspage is already isolated or not for migration so if
it is isolated for migration, subsequent isolation trial can be
successful without trying further isolation.

* zs_page_migrate

First of all, it holds write-side zspage->lock to prevent migrate other
subpage in zspage.  Then, lock all objects in the page VM want to
migrate.  The reason we should lock all objects in the page is due to
race between zs_map_object and zs_page_migrate.

  zs_map_object				zs_page_migrate

  pin_tag(handle)
  obj = handle_to_obj(handle)
  obj_to_location(obj, &page, &obj_idx);

					write_lock(&zspage->lock)
					if (!trypin_tag(handle))
						goto unpin_object

  zspage = get_zspage(page);
  read_lock(&zspage->lock);

If zs_page_migrate doesn't do trypin_tag, zs_map_object's page can be
stale by migration so it goes crash.

If it locks all of objects successfully, it copies content from old page
to new one, finally, create new zspage chain with new page.  And if it's
last isolated subpage in the zspage, put the zspage back to class.

* zs_page_putback

It returns isolated zspage to right fullness_group list if it fails to
migrate a page.  If it find a zspage is ZS_EMPTY, it queues zspage
freeing to workqueue.  See below about async zspage freeing.

This patch introduces asynchronous zspage free.  The reason to need it
is we need page_lock to clear PG_movable but unfortunately, zs_free path
should be atomic so the apporach is try to grab page_lock.  If it got
page_lock of all of pages successfully, it can free zspage immediately.
Otherwise, it queues free request and free zspage via workqueue in
process context.

If zs_free finds the zspage is isolated when it try to free zspage, it
delays the freeing until zs_page_putback finds it so it will free free
the zspage finally.

In this patch, we expand fullness_list from ZS_EMPTY to ZS_FULL.  First
of all, it will use ZS_EMPTY list for delay freeing.  And with adding
ZS_FULL list, it makes to identify whether zspage is isolated or not via
list_empty(&zspage->list) test.

[minchan@kernel.org: zsmalloc: keep first object offset in struct page]
  Link: http://lkml.kernel.org/r/1465788015-23195-1-git-send-email-minchan@kernel.org
[minchan@kernel.org: zsmalloc: zspage sanity check]
  Link: http://lkml.kernel.org/r/20160603010129.GC3304@bbox
Link: http://lkml.kernel.org/r/1464736881-24886-12-git-send-email-minchan@kernel.org
Signed-off-by: Minchan Kim <minchan@kernel.org>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2016-07-26 16:19:19 -07:00
..
android
byteorder
caif
can
cifs
dvb
genwqe
hdlc
hsi
iio iio: electricalconductivity: add IIO_ELECTRICALCONDUCTIVITY type 2016-05-29 20:03:21 +01:00
isdn
mmc
netfilter netfilter: xt_SYNPROXY: include missing <linux/types.h> 2016-06-17 13:47:40 +02:00
netfilter_arp
netfilter_bridge
netfilter_ipv4
netfilter_ipv6
nfsd
raid
spi
sunrpc
tc_act Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2016-05-15 13:32:48 -04:00
tc_ematch
usb USB: PD: additional feature selectors 2016-04-19 04:33:15 +09:00
wimax
a.out.h
acct.h
adb.h
adfs_fs.h
affs_hardblocks.h
agpgart.h
aio_abi.h
am437x-vpfe.h
apm_bios.h
arcfb.h
atalk.h
atm.h
atm_eni.h
atm_he.h
atm_idt77105.h
atm_nicstar.h
atm_tcp.h
atm_zatm.h
atmapi.h
atmarp.h
atmbr2684.h
atmclip.h
atmdev.h
atmioc.h
atmlec.h
atmmpc.h
atmppp.h
atmsap.h
atmsvc.h
audit.h
auto_fs.h
auto_fs4.h
auxvec.h
ax25.h
b1lli.h
baycom.h
bcache.h
bcm933xx_hcs.h
bfs_fs.h
binfmts.h
blkpg.h
blktrace_api.h
bpf.h bpf: direct packet access 2016-05-06 16:01:53 -04:00
bpf_common.h
bpqether.h
bsg.h
btrfs.h btrfs: Use __u64 in exported linux/btrfs.h. 2016-05-30 13:50:02 +02:00
btrfs_tree.h btrfs: uapi/linux/btrfs_tree.h, use __u8 and __u64 2016-04-28 11:06:41 +02:00
can.h
capability.h
capi.h
cciss_defs.h
cciss_ioctl.h
cdrom.h
cgroupstats.h
chio.h
cm4000_cs.h
cn_proc.h
coda.h
coda_psdev.h
coff.h
connector.h
const.h
coresight-stm.h coresight: stm: adding driver for CoreSight STM component 2016-05-03 14:59:30 -07:00
cramfs_fs.h
cryptouser.h
cuda.h
cyclades.h
cycx_cfm.h
dcbnl.h
dccp.h
devlink.h devlink: implement shared buffer occupancy monitoring interface 2016-04-14 16:22:03 -04:00
dlm.h
dlm_device.h
dlm_netlink.h
dlm_plock.h
dlmconstants.h
dm-ioctl.h
dm-log-userspace.h
dma-buf.h
dn.h
dqblk_xfs.h
edd.h
efs_fs_sb.h
elf-em.h
elf-fdpic.h
elf.h
elfcore.h
errno.h
errqueue.h
ethtool.h ethtool: add support for 25G/50G/100G speed modes 2016-05-25 12:26:54 -07:00
eventpoll.h
fadvise.h
falloc.h
fanotify.h
fb.h
fcntl.h
fd.h
fdreg.h
fib_rules.h libnl: nla_put_be64(): align on a 64-bit area 2016-04-23 20:13:24 -04:00
fiemap.h
filter.h
firewire-cdev.h
firewire-constants.h
flat.h
fou.h
fs.h libnvdimm for 4.7 2016-05-23 11:18:01 -07:00
fsl_hypervisor.h
fuse.h fuse: serialize dirops by default 2016-06-30 13:10:49 +02:00
futex.h
gameport.h
gen_stats.h sched: align nlattr properly when needed 2016-04-26 12:00:49 -04:00
genetlink.h
gfs2_ondisk.h
gigaset_dev.h
gpio.h
gsmmux.h
gtp.h gtp: #define _UAPI_LINUX_GTP_H_ and not _UAPI_LINUX_GTP_H__ 2016-06-07 16:25:49 -07:00
hash_info.h
hdlc.h
hdlcdrv.h
hdreg.h
hid.h
hiddev.h
hidraw.h
hpet.h
hsr_netlink.h
hw_breakpoint.h
hyperv.h
hysdn_if.h
i2c-dev.h
i2c.h i2c: guarantee that I2C_M_RD will be 0x0001 forever 2016-04-11 18:54:59 +02:00
i2o-dev.h
i8k.h
icmp.h
icmpv6.h
if.h uapi glibc compat: fix compile errors when glibc net/if.h included before linux/if.h 2016-05-09 21:29:31 -04:00
if_addr.h
if_addrlabel.h
if_alg.h
if_arcnet.h
if_arp.h
if_bonding.h
if_bridge.h bridge: netlink: export per-vlan stats 2016-05-02 22:27:06 -04:00
if_cablemodem.h
if_eql.h
if_ether.h net/hsr: Added support for HSR v1 2016-04-15 17:06:48 -04:00
if_fc.h
if_fddi.h
if_frad.h
if_hippi.h
if_infiniband.h
if_link.h gtp: add initial driver for datapath of GPRS Tunneling Protocol (GTP-U) 2016-05-10 12:25:04 -04:00
if_ltalk.h
if_macsec.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2016-05-09 15:59:24 -04:00
if_packet.h
if_phonet.h
if_plip.h
if_ppp.h
if_pppol2tp.h
if_pppox.h
if_slip.h
if_team.h
if_tun.h
if_tunnel.h
if_vlan.h
if_x25.h
igmp.h
ila.h ila: add checksum neutral ILA translations 2016-04-26 01:27:07 -04:00
in.h
in6.h
in_route.h
inet_diag.h sock_diag: align nlattr properly when needed 2016-04-26 12:00:48 -04:00
inotify.h
input-event-codes.h Input: add SW_PEN_INSERTED define 2016-06-29 09:51:03 -07:00
input.h Input: add BUS_CEC type 2016-06-18 10:32:28 -07:00
ioctl.h
ip.h
ip6_tunnel.h
ip_vs.h netfilter/ipvs: use nla_put_u64_64bit() 2016-04-25 15:09:11 -04:00
ipc.h
ipmi.h
ipmi_msgdefs.h
ipsec.h
ipv6.h Revert "ipv6: Revert optional address flusing on ifdown." 2016-04-26 11:47:41 -04:00
ipv6_route.h
ipx.h
irda.h
irqnr.h
isdn.h
isdn_divertif.h
isdn_ppp.h
isdnif.h
iso_fs.h
ivtv.h
ivtvfb.h
ixjuser.h
jffs2.h
joystick.h
Kbuild uapi: export lirc.h header 2016-07-15 14:54:27 +09:00
kcm.h
kcmp.h
kcov.h
kd.h
kdev_t.h
kernel-page-flags.h
kernel.h
kernelcapi.h
kexec.h
keyboard.h
keyctl.h KEYS: Add KEYCTL_DH_COMPUTE command 2016-04-12 19:54:58 +01:00
kfd_ioctl.h
kvm.h kvm: introduce KVM_MAX_VCPU_ID 2016-05-11 22:37:54 +02:00
kvm_para.h
l2tp.h l2tp: use nla_put_u64_64bit() 2016-04-25 15:09:10 -04:00
libc-compat.h uapi glibc compat: fix compilation when !__USE_MISC in glibc 2016-05-20 19:57:22 -04:00
lightnvm.h
limits.h
lirc.h
llc.h
loop.h
lp.h
lwtunnel.h libnl: nla_put_be64(): align on a 64-bit area 2016-04-23 20:13:24 -04:00
magic.h zsmalloc: page migration support 2016-07-26 16:19:19 -07:00
major.h
map_to_7segment.h
matroxfb.h
mdio.h
media-bus-format.h
media.h
mei.h
membarrier.h
memfd.h
mempolicy.h
meye.h
mic_common.h
mic_ioctl.h
mii.h
minix_fs.h
mman.h
mmtimer.h
module.h
mpls.h
mpls_iptunnel.h
mqueue.h
mroute.h
mroute6.h
msdos_fs.h
msg.h
mtio.h
n_r3964.h
nbd.h
ncp.h
ncp_fs.h
ncp_mount.h
ncp_no.h
ndctl.h Merge branch 'for-4.7/dsm' into libnvdimm-for-next 2016-05-18 10:06:59 -07:00
neighbour.h libnl: nla_put_msecs(): align on a 64-bit area 2016-04-23 20:13:24 -04:00
net.h
net_dropmon.h
net_namespace.h
net_tstamp.h
netconf.h
netdevice.h
netfilter.h
netfilter_arp.h
netfilter_bridge.h
netfilter_decnet.h
netfilter_ipv4.h
netfilter_ipv6.h
netlink.h
netlink_diag.h
netrom.h
nfc.h
nfs.h
nfs2.h
nfs3.h
nfs4.h
nfs4_mount.h
nfs_fs.h
nfs_idmap.h
nfs_mount.h
nfsacl.h
nl80211.h nl80211: use nla_put_u64_64bit() for the remaining u64 attributes 2016-04-27 11:01:13 +02:00
nubus.h
nvme_ioctl.h NVMe: Allow user initiated rescan 2016-05-17 17:14:21 -06:00
nvram.h
omap3isp.h
omapfb.h
oom.h
openvswitch.h ovs: align nlattr properly when needed 2016-04-26 12:00:48 -04:00
packet_diag.h
param.h
parport.h
patchkey.h
pci.h
pci_regs.h PCI: Add Downstream Port Containment driver 2016-05-03 10:39:24 -05:00
perf_event.h perf core: Per event callchain limit 2016-05-30 12:41:44 -03:00
personality.h
pfkeyv2.h
pg.h
phantom.h
phonet.h
pkt_cls.h net sched actions: policer missing timestamp processing 2016-05-24 16:23:23 -07:00
pkt_sched.h fq_codel: add memory limitation per queue 2016-05-08 23:49:38 -04:00
pktcdvd.h
pmu.h
poll.h
posix_types.h
ppdev.h
ppp-comp.h
ppp-ioctl.h
ppp_defs.h
pps.h
pr.h
prctl.h
psci.h
ptp_clock.h
ptrace.h
qnx4_fs.h
qnxtypes.h
qrtr.h net: Add Qualcomm IPC router 2016-05-08 23:46:14 -04:00
quota.h fs/quota: use nla_put_u64_64bit() 2016-04-26 12:00:48 -04:00
radeonfb.h
random.h
raw.h
rds.h
reboot.h
reiserfs_fs.h
reiserfs_xattr.h
resource.h
rfkill.h
rio_mport_cdev.h rapidio/mport_cdev: fix uapi type definitions 2016-05-05 17:38:53 -07:00
romfs_fs.h
rose.h
route.h
rtc.h
rtnetlink.h sched: align nlattr properly when needed 2016-04-26 12:00:49 -04:00
scc.h
sched.h
scif_ioctl.h
screen_info.h
sctp.h
sdla.h
seccomp.h
securebits.h
selinux_netlink.h
sem.h
serial.h
serial_core.h TTY and Serial driver update for 4.7-rc1 2016-05-20 20:57:27 -07:00
serial_reg.h
serio.h
shm.h
signal.h signals/sigaltstack: Change SS_AUTODISARM to (1U << 31) 2016-05-04 08:34:14 +02:00
signalfd.h
smiapp.h
snmp.h
sock_diag.h
socket.h
sockios.h
sonet.h
sonypi.h
sound.h
soundcard.h
stat.h
stddef.h
stm.h
string.h
suspend_ioctls.h
swab.h byteswap: try to avoid __builtin_constant_p gcc bug 2016-05-05 17:38:53 -07:00
sync_file.h dma-buf/sync_file: de-stage sync_file headers 2016-04-29 17:37:10 -07:00
synclink.h
sysctl.h
sysinfo.h
target_core_user.h
taskstats.h
tcp.h
tcp_metrics.h libnl: nla_put_msecs(): align on a 64-bit area 2016-04-23 20:13:24 -04:00
telephony.h
termios.h
thermal.h
time.h
times.h
timex.h
tiocl.h
tipc.h
tipc_config.h
tipc_netlink.h
toshiba.h
tty.h
tty_flags.h tty: core: Undefine ASYNC_* flags superceded by TTY_PORT* flags 2016-04-30 09:26:55 -07:00
types.h
udf_fs_i.h
udp.h gtp: add initial driver for datapath of GPRS Tunneling Protocol (GTP-U) 2016-05-10 12:25:04 -04:00
uhid.h
uinput.h
uio.h
ultrasound.h
un.h
unistd.h
unix_diag.h
usbdevice_fs.h
usbip.h
userfaultfd.h
userio.h
utime.h
utsname.h
uuid.h lib/uuid.c: remove FSF address 2016-05-20 17:58:30 -07:00
uvcvideo.h
v4l2-common.h
v4l2-controls.h
v4l2-dv-timings.h [media] v4l2-dv-timings.h: fix polarity for 4k formats 2016-04-25 10:19:56 -03:00
v4l2-mediabus.h
v4l2-subdev.h
veth.h
vfio.h
vhost.h
videodev2.h [media] videodev2.h: remove 'experimental' annotations 2016-04-25 08:04:12 -03:00
virtio_9p.h
virtio_balloon.h
virtio_blk.h
virtio_config.h
virtio_console.h
virtio_gpu.h
virtio_ids.h
virtio_input.h
virtio_net.h
virtio_pci.h
virtio_ring.h
virtio_rng.h
virtio_scsi.h
virtio_types.h
vm_sockets.h
vsp1.h
vt.h tty: vt, remove reduntant check 2016-04-30 09:26:55 -07:00
wait.h
wanrouter.h
watchdog.h
wil6210_uapi.h
wimax.h
wireless.h
x25.h
xattr.h
xfrm.h xfrm: align nlattr properly when needed 2016-04-23 20:13:25 -04:00
xilinx-v4l2-controls.h
zorro.h
zorro_ids.h