2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-22 01:51:51 +00:00
criu/Makefile

177 lines
3.6 KiB
Makefile
Raw Normal View History

include Makefile.inc
CFLAGS += -I./include
CFLAGS += -O0 -ggdb3
LIBS += -lrt -lpthread -lprotobuf-c
DEFINES += -D_FILE_OFFSET_BITS=64
DEFINES += -D_GNU_SOURCE
ifneq ($(WERROR),0)
WARNINGS += -Werror
endif
ifeq ($(DEBUG),1)
DEFINES += -DCR_DEBUG
endif
WARNINGS += -Wall
CFLAGS += $(WARNINGS) $(DEFINES)
PROGRAM := crtools
export CC ECHO MAKE CFLAGS LIBS ARCH DEFINES
OBJS += parasite-syscall.o
OBJS += cr-restore.o
OBJS += crtools.o
OBJS += image.o
OBJS += proc_parse.o
OBJS += cr-dump.o
OBJS += cr-show.o
OBJS += cr-check.o
OBJS += util.o
OBJS += util-net.o
OBJS += sysctl.o
OBJS += ptrace.o
OBJS += kcmp-ids.o
OBJS += rbtree.o
OBJS += log.o
Unix sockets initial support Currently it can only work with stream sockets, which have no skbs in queues (listening or established -- both work OK). The cpt part uses the sock_diag engine that was merged to Dave recently to collect sockets. Then it dumps sockets by checking the filesystem ID of a failed-to-open through /proc/pid/fd descriptors (sockets do not allow for such tricks with opens through proc) against SOCKFS_TYPE. The rst part is more tricky. Listen sockets are just restored, this is simple. Connected sockets are restored like this: 1. One end establishes a listening anon socket at the desired descriptor; 2. The other end just creates a socket at the desired descriptor; 3. All sockets, that are to be connect()-ed call connect. Unix sockets do not block connect() till the accept() time and thus we continue with... 4. ... all listening sockets call accept() and ... dup2 the new fd into the accepting end. There's a problem with this approach -- socket names are not preserved, but looking into our OpenVZ implementation I think this is OK for existing apps. What should be done next is: 1. Need to merge the file IDs patches in our tree and make Andrey to support files sharing. This will solve the sk = socket(); fork(); case. Currently it simply doesn't work :( 2. Need to add support for DGRAM sockets -- I wrote comment how to do it in the can_dump_unix_sk() 3. Need to add support for in-flight connections 4. Implement support for UDP sockets (quite simple) 5. Implement support for listening TCP sockets (also not very complex) 6. Implement support for connected TCP scokets (hard one, Tejun's patches are not very good for this from my POV) Cyrill, plz, apply this patch and put the above descriptions onto wiki docs (do we have the plans page yet?). Andrey, plz, take care of unix sockets tests in zdtm. Most likely it won't work till you do the shared files support for sockets. Signed-off-by: Pavel Emelyanov <xemul@parallels.com> Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
2011-12-26 22:12:03 +04:00
OBJS += libnetlink.o
OBJS += sockets.o
OBJS += sk-inet.o
OBJS += sk-tcp.o
OBJS += sk-unix.o
OBJS += sk-queue.o
OBJS += files.o
OBJS += files-reg.o
OBJS += pipes.o
OBJS += fifo.o
files: Use sys_kcmp to find file descriptor duplicates v4 We switch generic-object-id concept with sys_kcmp approach, which implies changes of image format a bit (and since it's early time for project overall, we're allowed to). In short -- previously every file descriptor had an ID generated by a kernel and exported via procfs. If the appropriate file descriptors were the same objects in kernel memory -- the IDs did match up to bit. It allows us to figure out which files were actually the identical ones and should be restored in a special way. Once sys_kcmp system call was merged into the kernel, we've got a new opprotunity -- to use this syscall instead. The syscall basically compares kernel objects and returns ordered results suitable for objects sorting in a userspace. For us it means -- we treat every file descriptor as a combination of 'genid' and 'subid'. While 'genid' serves for fast comparison between fds, the 'subid' is kind of a second key, which guarantees uniqueness of genid+subid tuple over all file descritors found in a process (or group of processes). To be able to find and dump file descriptors in a single pass we collect every fd into a global rbtree, where (!) each node might become a root for a subtree as well. The main tree carries only non-equal genid. If we find genid which is already in tree, we need to make sure that it's either indeed a duplicate or not. For this we use sys_kcmp syscall and if we find that file descriptors are different -- we simply put new fd into a subtree. Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org> Acked-by: Pavel Emelyanov <xemul@parallels.com>
2012-02-28 18:27:28 +04:00
OBJS += file-ids.o
OBJS += namespaces.o
OBJS += uts_ns.o
OBJS += ipc_ns.o
OBJS += netfilter.o
OBJS += shmem.o
OBJS += eventfd.o
OBJS += eventpoll.o
OBJS += mount.o
OBJS += inotify.o
OBJS += pstree.o
OBJS += protobuf.o
PROTOBUF-LIB := protobuf/protobuf-lib.o
DEPS := $(patsubst %.o,%.d,$(OBJS))
MAKEFLAGS += --no-print-directory
syscalls: Complete redesign v9 At early days we've been using only a few syscalls which together with debug compiler options always produce relative addresses for memory variables used in parasite and restorer blobs. Thus it came in unnoticed that there is something worng with syscalls declarations we use. Basically all our syscalls are just a wrappers over inline assembly code in form of static long syscall2(int nr, long arg0, long arg1) { long ret; asm volatile( "movl %1, %%eax \t\n" "movq %2, %%rdi \t\n" "movq %3, %%rsi \t\n" "syscall \t\n" "movq %%rax, %0 \t\n" : "=r"(ret) : "g" ((int)nr), "g" (arg0), "g" (arg1) : "rax", "rdi", "rsi", "memory"); return ret; } so every argument treated to be plain long (even if the call sematics implies it's a memory address passed but not some integer direct value) and transferred via general purpose register. As being mentioned it caused no problems when debug options specified at compile time, the compiler do not tries to optimize addressing but generates code which always compute them. The situation is changed if one is building crtools with optimization enabled -- the compiler finds that arguments are rather plain long numbers and might pass direct addresses of variables, instead of generating relative addresses (because function declarations have no pointers and 'g' in cope with 'mov' is used, which is of course wrong). To fix all this -- now syscalls declarations are generated from syscall.def file and function arguments are passed in conform with x86-64 ABI. This shrinks amount of source code needed to declare syscalls and opens a way to use optimization. Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2012-04-18 18:10:12 +04:00
include Makefile.syscall
include Makefile.pie
.PHONY: all test-legacy zdtm test rebuild clean distclean tags cscope \
docs help pie protobuf
all: protobuf pie
$(Q) $(MAKE) $(PROGRAM)
pie: $(PIE-GEN)
protobuf:
$(Q) $(MAKE) -C protobuf/
%.o: %.c
$(E) " CC " $@
$(Q) $(CC) -c $(CFLAGS) $< -o $@
%.i: %.c
$(E) " CC " $@
$(Q) $(CC) -E $(CFLAGS) $< -o $@
%.s: %.c
$(E) " CC " $@
$(Q) $(CC) -S $(CFLAGS) -fverbose-asm $< -o $@
%.d: %.c
$(E) " DEP " $@
$(Q) $(CC) -M -MT $@ -MT $(patsubst %.d,%.o,$@) $(CFLAGS) $< -o $@
$(PROGRAM): $(OBJS) $(SYS-OBJ) $(PROTOBUF-LIB)
$(E) " LINK " $@
$(Q) $(CC) $(CFLAGS) $^ $(LIBS) -o $@
test-legacy: all
$(Q) $(MAKE) -C test/legacy all
zdtm: all
$(Q) $(MAKE) -C test/zdtm all
test: zdtm
$(Q) $(SH) test/zdtm.sh
rebuild:
$(E) " FORCE-REBUILD"
$(Q) $(RM) -f ./*.o
$(Q) $(RM) -f ./*.d
$(Q) $(MAKE)
syscalls: Complete redesign v9 At early days we've been using only a few syscalls which together with debug compiler options always produce relative addresses for memory variables used in parasite and restorer blobs. Thus it came in unnoticed that there is something worng with syscalls declarations we use. Basically all our syscalls are just a wrappers over inline assembly code in form of static long syscall2(int nr, long arg0, long arg1) { long ret; asm volatile( "movl %1, %%eax \t\n" "movq %2, %%rdi \t\n" "movq %3, %%rsi \t\n" "syscall \t\n" "movq %%rax, %0 \t\n" : "=r"(ret) : "g" ((int)nr), "g" (arg0), "g" (arg1) : "rax", "rdi", "rsi", "memory"); return ret; } so every argument treated to be plain long (even if the call sematics implies it's a memory address passed but not some integer direct value) and transferred via general purpose register. As being mentioned it caused no problems when debug options specified at compile time, the compiler do not tries to optimize addressing but generates code which always compute them. The situation is changed if one is building crtools with optimization enabled -- the compiler finds that arguments are rather plain long numbers and might pass direct addresses of variables, instead of generating relative addresses (because function declarations have no pointers and 'g' in cope with 'mov' is used, which is of course wrong). To fix all this -- now syscalls declarations are generated from syscall.def file and function arguments are passed in conform with x86-64 ABI. This shrinks amount of source code needed to declare syscalls and opens a way to use optimization. Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2012-04-18 18:10:12 +04:00
clean: cleanpie cleansyscall
$(E) " CLEAN"
$(Q) $(RM) -f ./*.o
$(Q) $(RM) -f ./*.d
$(Q) $(RM) -f ./*.i
$(Q) $(RM) -f ./*.img
$(Q) $(RM) -f ./*.out
$(Q) $(RM) -f ./*.bin
$(Q) $(RM) -f ./$(PROGRAM)
$(Q) $(RM) -rf ./test/dump/
$(Q) $(MAKE) -C protobuf/ clean
$(Q) $(MAKE) -C test/legacy clean
$(Q) $(MAKE) -C test/zdtm cleandep
$(Q) $(MAKE) -C test/zdtm clean
$(Q) $(MAKE) -C test/zdtm cleanout
$(Q) $(MAKE) -C Documentation clean
distclean: clean
$(E) " DISTCLEAN"
$(Q) $(RM) -f ./tags
$(Q) $(RM) -f ./cscope*
tags:
$(E) " GEN" $@
$(Q) $(RM) -f tags
$(Q) $(FIND) . -name '*.[hcS]' ! -path './.*' -print | xargs ctags -a
cscope:
$(E) " GEN" $@
$(Q) $(FIND) . -name '*.[hcS]' ! -path './.*' -print > cscope.files
$(Q) $(CSCOPE) -bkqu
docs:
$(Q) $(MAKE) -s -C Documentation all
help:
$(E) ' Targets:'
$(E) ' all - Build all [*] targets'
$(E) ' * crtools - Build crtools'
$(E) ' zdtm - Build zdtm test-suite'
$(E) ' docs - Build documentation'
$(E) ' clean - Clean everything'
$(E) ' tags - Generate tags file (ctags)'
$(E) ' cscope - Generate cscope database'
$(E) ' rebuild - Force-rebuild of [*] targets'
$(E) ' test - Run zdtm test-suite'
deps-targets := $(OBJS) $(patsubst %.o,%.s,$(OBJS)) $(patsubst %.o,%.i,$(OBJS)) $(PROGRAM)
.DEFAULT_GOAL := all
ifneq ($(filter $(deps-targets), $(MAKECMDGOALS)),)
INCDEPS := 1
endif
ifeq ($(INCDEPS),1)
-include $(DEPS)
endif