From c7176e679977ecaafff74461614cf77522a373cd Mon Sep 17 00:00:00 2001 From: Marc Fiuczynski Date: Fri, 16 Jul 2004 19:45:51 +0000 Subject: [PATCH] Merge to ckrm-E15 --- .config | 2 + .config.old | 110 +++++++++++++++++++-------------------- fs/Makefile | 1 - fs/exec.c | 3 +- fs/proc/array.c | 9 ++-- include/linux/autoconf.h | 2 + include/linux/ckrm.h | 59 +++++++++++---------- include/linux/sched.h | 5 ++ include/linux/tcp.h | 3 +- include/net/sock.h | 3 ++ include/net/tcp.h | 50 +++++++----------- init/Kconfig | 32 ++++++++++-- kernel/exit.c | 2 + kernel/fork.c | 5 ++ kernel/sched.c | 3 ++ mm/memory.c | 12 ++--- net/ipv4/tcp.c | 77 ++++++++++++++------------- net/ipv4/tcp_ipv4.c | 8 +-- net/ipv6/tcp_ipv6.c | 15 ++---- 19 files changed, 210 insertions(+), 191 deletions(-) diff --git a/.config b/.config index 6dd5c2337..7f9bc8d9d 100644 --- a/.config +++ b/.config @@ -31,6 +31,8 @@ CONFIG_CKRM_TYPE_TASKCLASS=y CONFIG_CKRM_RES_NUMTASKS=y CONFIG_CKRM_TYPE_SOCKETCLASS=y CONFIG_CKRM_RES_LISTENAQ=m +CONFIG_CKRM_RBCE=m +CONFIG_CKRM_CRBCE=m # CONFIG_BSD_PROCESS_ACCT_V3 is not set CONFIG_SYSCTL=y CONFIG_AUDIT=y diff --git a/.config.old b/.config.old index 7445bef55..55ca63656 100644 --- a/.config.old +++ b/.config.old @@ -21,7 +21,16 @@ CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y -# CONFIG_BSD_PROCESS_ACCT_V3 is not set + +# +# Class Based Kernel Resource Management +# +CONFIG_CKRM=y +CONFIG_RCFS_FS=y +CONFIG_CKRM_TYPE_TASKCLASS=y +CONFIG_CKRM_RES_NUMTASKS=y +CONFIG_CKRM_TYPE_SOCKETCLASS=y +CONFIG_CKRM_RES_LISTENAQ=m CONFIG_SYSCTL=y CONFIG_AUDIT=y CONFIG_AUDITSYSCALL=y @@ -29,6 +38,7 @@ CONFIG_LOG_BUF_SHIFT=17 CONFIG_HOTPLUG=y # CONFIG_IKCONFIG is not set # CONFIG_EMBEDDED is not set +CONFIG_DELAY_ACCT=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set CONFIG_FUTEX=y @@ -189,7 +199,7 @@ CONFIG_X86_ACPI_CPUFREQ=m # CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set CONFIG_X86_POWERNOW_K6=m CONFIG_X86_POWERNOW_K7=y -CONFIG_X86_POWERNOW_K8=m +# CONFIG_X86_POWERNOW_K8 is not set # CONFIG_X86_GX_SUSPMOD is not set CONFIG_X86_SPEEDSTEP_CENTRINO=y CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y @@ -200,7 +210,7 @@ CONFIG_X86_P4_CLOCKMOD=m CONFIG_X86_SPEEDSTEP_LIB=y # CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set CONFIG_X86_LONGRUN=y -# CONFIG_X86_LONGHAUL is not set +CONFIG_X86_LONGHAUL=y # # Bus options (PCI, PCMCIA, EISA, MCA, ISA) @@ -251,7 +261,7 @@ CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE=y # CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_AOUT is not set -CONFIG_BINFMT_MISC=y +CONFIG_BINFMT_MISC=m # # Device Drivers @@ -404,6 +414,7 @@ CONFIG_BLK_DEV_IDE=y # CONFIG_BLK_DEV_HD_IDE is not set CONFIG_BLK_DEV_IDEDISK=y CONFIG_IDEDISK_MULTI_MODE=y +# CONFIG_IDEDISK_STROKE is not set CONFIG_BLK_DEV_IDECS=m CONFIG_BLK_DEV_IDECD=y CONFIG_BLK_DEV_IDETAPE=m @@ -495,9 +506,8 @@ CONFIG_SCSI_FC_ATTRS=m # SCSI low-level drivers # CONFIG_BLK_DEV_3W_XXXX_RAID=m -CONFIG_SCSI_3W_9XXX=m # CONFIG_SCSI_7000FASST is not set -CONFIG_SCSI_ACARD=m +# CONFIG_SCSI_ACARD is not set CONFIG_SCSI_AHA152X=m CONFIG_SCSI_AHA1542=m CONFIG_SCSI_AACRAID=m @@ -525,13 +535,14 @@ CONFIG_SCSI_SATA=y CONFIG_SCSI_SATA_SVW=m CONFIG_SCSI_ATA_PIIX=m CONFIG_SCSI_SATA_PROMISE=m -CONFIG_SCSI_SATA_SX4=m +# CONFIG_SCSI_SATA_SX4 is not set CONFIG_SCSI_SATA_SIL=m CONFIG_SCSI_SATA_SIS=m CONFIG_SCSI_SATA_VIA=m CONFIG_SCSI_SATA_VITESSE=m CONFIG_SCSI_BUSLOGIC=m # CONFIG_SCSI_OMIT_FLASHPOINT is not set +# CONFIG_SCSI_CPQFCTS is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_DTC3280 is not set # CONFIG_SCSI_EATA is not set @@ -568,7 +579,7 @@ CONFIG_SCSI_QLA6312=m CONFIG_SCSI_QLA6322=m # CONFIG_SCSI_SYM53C416 is not set # CONFIG_SCSI_DC395x is not set -CONFIG_SCSI_DC390T=m +# CONFIG_SCSI_DC390T is not set # CONFIG_SCSI_T128 is not set # CONFIG_SCSI_U14_34F is not set # CONFIG_SCSI_ULTRASTOR is not set @@ -582,7 +593,7 @@ CONFIG_PCMCIA_AHA152X=m CONFIG_PCMCIA_FDOMAIN=m CONFIG_PCMCIA_NINJA_SCSI=m CONFIG_PCMCIA_QLOGIC=m -CONFIG_PCMCIA_SYM53C500=m +# CONFIG_PCMCIA_SYM53C500 is not set # # Old CD-ROM drivers (not SCSI, not IDE) @@ -602,9 +613,6 @@ CONFIG_MD_RAID6=m CONFIG_MD_MULTIPATH=m CONFIG_BLK_DEV_DM=m CONFIG_DM_CRYPT=m -CONFIG_DM_SNAPSHOT=m -CONFIG_DM_MIRROR=m -CONFIG_DM_ZERO=m # # Fusion MPT device support @@ -618,32 +626,7 @@ CONFIG_FUSION_LAN=m # # IEEE 1394 (FireWire) support # -CONFIG_IEEE1394=m - -# -# Subsystem Options -# -# CONFIG_IEEE1394_VERBOSEDEBUG is not set -CONFIG_IEEE1394_OUI_DB=y -# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set - -# -# Device Drivers -# -# CONFIG_IEEE1394_PCILYNX is not set -CONFIG_IEEE1394_OHCI1394=m - -# -# Protocol Drivers -# -CONFIG_IEEE1394_VIDEO1394=m -CONFIG_IEEE1394_SBP2=m -# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set -# CONFIG_IEEE1394_ETH1394 is not set -CONFIG_IEEE1394_DV1394=m -CONFIG_IEEE1394_RAWIO=m -CONFIG_IEEE1394_CMP=m -CONFIG_IEEE1394_AMDTP=m +# CONFIG_IEEE1394 is not set # # I2O device support @@ -688,6 +671,7 @@ CONFIG_SYN_COOKIES=y CONFIG_INET_AH=m CONFIG_INET_ESP=m CONFIG_INET_IPCOMP=m +CONFIG_ACCEPT_QUEUES=y # # IP: Virtual Server Configuration @@ -1066,7 +1050,7 @@ CONFIG_PCMCIA_XIRCOM=m CONFIG_DEPCA=m CONFIG_HP100=m # CONFIG_NET_ISA is not set -CONFIG_NE2000=m +# CONFIG_NE2000 is not set CONFIG_NET_PCI=y CONFIG_PCNET32=m CONFIG_AMD8111_ETH=m @@ -1099,7 +1083,6 @@ CONFIG_SUNDANCE=m CONFIG_TLAN=m CONFIG_VIA_RHINE=m CONFIG_VIA_RHINE_MMIO=y -CONFIG_VIA_VELOCITY=m CONFIG_NET_POCKET=y CONFIG_ATP=m CONFIG_DE600=m @@ -1593,7 +1576,6 @@ CONFIG_DRM_SIS=m CONFIG_SYNCLINK_CS=m CONFIG_MWAVE=m # CONFIG_RAW_DRIVER is not set -# CONFIG_HPET is not set CONFIG_HANGCHECK_TIMER=m # @@ -1650,7 +1632,7 @@ CONFIG_SENSORS_LM80=m CONFIG_SENSORS_LM83=m CONFIG_SENSORS_LM85=m CONFIG_SENSORS_LM90=m -CONFIG_SENSORS_MAX1619=m +# CONFIG_SENSORS_MAX1619 is not set CONFIG_SENSORS_VIA686A=m CONFIG_SENSORS_W83781D=m CONFIG_SENSORS_W83L785TS=m @@ -1662,7 +1644,7 @@ CONFIG_SENSORS_W83627HF=m CONFIG_SENSORS_EEPROM=m CONFIG_SENSORS_PCF8574=m CONFIG_SENSORS_PCF8591=m -CONFIG_SENSORS_RTC8564=m +# CONFIG_SENSORS_RTC8564 is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set @@ -1799,9 +1781,8 @@ CONFIG_FB_VGA16=m CONFIG_FB_VESA=y CONFIG_VIDEO_SELECT=y CONFIG_FB_HGA=m -CONFIG_FB_HGA_ACCEL=y +# CONFIG_FB_HGA_ACCEL is not set CONFIG_FB_RIVA=m -# CONFIG_FB_RIVA_I2C is not set CONFIG_FB_I810=m CONFIG_FB_I810_GTF=y CONFIG_FB_MATROX=m @@ -1825,10 +1806,10 @@ CONFIG_FB_ATY_GX=y CONFIG_FB_NEOMAGIC=m CONFIG_FB_KYRO=m CONFIG_FB_3DFX=m -CONFIG_FB_3DFX_ACCEL=y +# CONFIG_FB_3DFX_ACCEL is not set CONFIG_FB_VOODOO1=m CONFIG_FB_TRIDENT=m -CONFIG_FB_TRIDENT_ACCEL=y +# CONFIG_FB_TRIDENT_ACCEL is not set # CONFIG_FB_VIRTUAL is not set # @@ -2012,7 +1993,6 @@ CONFIG_USB_ACM=m CONFIG_USB_PRINTER=m CONFIG_USB_STORAGE=m # CONFIG_USB_STORAGE_DEBUG is not set -CONFIG_USB_STORAGE_RW_DETECT=y CONFIG_USB_STORAGE_DATAFAB=y CONFIG_USB_STORAGE_FREECOM=y CONFIG_USB_STORAGE_ISD200=y @@ -2037,7 +2017,7 @@ CONFIG_USB_WACOM=m CONFIG_USB_KBTAB=m CONFIG_USB_POWERMATE=m CONFIG_USB_MTOUCH=m -CONFIG_USB_EGALAX=m +# CONFIG_USB_EGALAX is not set CONFIG_USB_XPAD=m CONFIG_USB_ATI_REMOTE=m @@ -2149,8 +2129,8 @@ CONFIG_USB_RIO500=m CONFIG_USB_LEGOTOWER=m CONFIG_USB_LCD=m CONFIG_USB_LED=m -# CONFIG_USB_CYTHERM is not set -CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_CYTHERM=m +# CONFIG_USB_PHIDGETSERVO is not set CONFIG_USB_TEST=m # @@ -2175,9 +2155,7 @@ CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set CONFIG_REISERFS_PROC_INFO=y -CONFIG_REISERFS_FS_XATTR=y -CONFIG_REISERFS_FS_POSIX_ACL=y -CONFIG_REISERFS_FS_SECURITY=y +# CONFIG_REISERFS_FS_XATTR is not set CONFIG_JFS_FS=m CONFIG_JFS_POSIX_ACL=y # CONFIG_JFS_DEBUG is not set @@ -2212,7 +2190,9 @@ CONFIG_UDF_FS=m CONFIG_FAT_FS=m CONFIG_MSDOS_FS=m CONFIG_VFAT_FS=m -# CONFIG_NTFS_FS is not set +CONFIG_NTFS_FS=y +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set # # Pseudo filesystems @@ -2227,6 +2207,10 @@ CONFIG_TMPFS=y CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y CONFIG_RAMFS=y +CONFIG_RELAYFS_FS=y +CONFIG_KLOG_CHANNEL=y +CONFIG_KLOG_CHANNEL_AUTOENABLE=y +CONFIG_KLOG_CHANNEL_SHIFT=21 # # Miscellaneous filesystems @@ -2300,6 +2284,7 @@ CONFIG_MINIX_SUBPARTITION=y CONFIG_SOLARIS_X86_PARTITION=y CONFIG_UNIXWARE_DISKLABEL=y # CONFIG_LDM_PARTITION is not set +# CONFIG_NEC98_PARTITION is not set CONFIG_SGI_PARTITION=y # CONFIG_ULTRIX_PARTITION is not set CONFIG_SUN_PARTITION=y @@ -2364,11 +2349,23 @@ CONFIG_DEBUG_STACKOVERFLOW=y CONFIG_MAGIC_SYSRQ=y # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_PAGEALLOC is not set -# CONFIG_DEBUG_HIGHMEM is not set +CONFIG_DEBUG_HIGHMEM=y CONFIG_DEBUG_INFO=y CONFIG_DEBUG_SPINLOCK_SLEEP=y # CONFIG_FRAME_POINTER is not set +# +# Linux VServer +# +CONFIG_VSERVER_LEGACY=y +CONFIG_PROC_SECURE=y +# CONFIG_VSERVER_HARDCPU is not set +# CONFIG_INOXID_NONE is not set +# CONFIG_INOXID_GID16 is not set +CONFIG_INOXID_GID24=y +# CONFIG_INOXID_GID32 is not set +# CONFIG_INOXID_MAGIC is not set + # # Security options # @@ -2414,4 +2411,5 @@ CONFIG_LIBCRC32C=m CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m CONFIG_X86_BIOS_REBOOT=y +CONFIG_X86_STD_RESOURCES=y CONFIG_PC=y diff --git a/fs/Makefile b/fs/Makefile index e39e43f35..8abcedf4f 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -52,7 +52,6 @@ obj-$(CONFIG_EXT2_FS) += ext2/ obj-$(CONFIG_CRAMFS) += cramfs/ obj-$(CONFIG_RAMFS) += ramfs/ obj-$(CONFIG_HUGETLBFS) += hugetlbfs/ -obj-$(CONFIG_RELAYFS_FS) += relayfs/ obj-$(CONFIG_CODA_FS) += coda/ obj-$(CONFIG_MINIX_FS) += minix/ obj-$(CONFIG_FAT_FS) += fat/ diff --git a/fs/exec.c b/fs/exec.c index 2902dda85..afe3dbb9c 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1052,6 +1052,7 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) fput(bprm->file); bprm->file = NULL; current->did_exec = 1; + ckrm_cb_exec(bprm->filename); return retval; } read_lock(&binfmt_lock); @@ -1157,8 +1158,6 @@ int do_execve(char * filename, if (retval >= 0) { free_arg_pages(&bprm); - ckrm_cb_exec(filename); - /* execve success */ security_bprm_free(&bprm); return retval; diff --git a/fs/proc/array.c b/fs/proc/array.c index c15680757..dfca2ff6b 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -491,15 +491,14 @@ int proc_pid_delay(struct task_struct *task, char * buffer) { int res; - res = sprintf(buffer,"%lu %lu %lu %lu %lu %lu %lu\n", + res = sprintf(buffer,"%u %llu %llu %u %llu %u %llu\n", get_delay(task,runs), get_delay(task,runcpu_total), get_delay(task,waitcpu_total), - get_delay(task,iowait_total), get_delay(task,num_iowaits), - get_delay(task,mem_iowait_total), - get_delay(task,num_memwaits) - + get_delay(task,iowait_total), + get_delay(task,num_memwaits), + get_delay(task,mem_iowait_total) ); return res; } diff --git a/include/linux/autoconf.h b/include/linux/autoconf.h index f0db33b05..5ee385a8a 100644 --- a/include/linux/autoconf.h +++ b/include/linux/autoconf.h @@ -32,6 +32,8 @@ #define CONFIG_CKRM_RES_NUMTASKS 1 #define CONFIG_CKRM_TYPE_SOCKETCLASS 1 #define CONFIG_CKRM_RES_LISTENAQ_MODULE 1 +#define CONFIG_CKRM_RBCE_MODULE 1 +#define CONFIG_CKRM_CRBCE_MODULE 1 #undef CONFIG_BSD_PROCESS_ACCT_V3 #define CONFIG_SYSCTL 1 #define CONFIG_AUDIT 1 diff --git a/include/linux/ckrm.h b/include/linux/ckrm.h index 4ac2c1894..8dba64362 100644 --- a/include/linux/ckrm.h +++ b/include/linux/ckrm.h @@ -45,16 +45,16 @@ enum ckrm_event { /* we distinguish various events types - * + * * (a) CKRM_LATCHABLE_EVENTS - * events can be latched for event callbacks by classtypes - * + * events can be latched for event callbacks by classtypes + * * (b) CKRM_NONLATACHBLE_EVENTS - * events can not be latched but can be used to call classification - * + * events can not be latched but can be used to call classification + * * (c) event that are used for notification purposes * range: [ CKRM_EVENT_CANNOT_CLASSIFY .. ) - */ + */ /* events (a) */ @@ -83,7 +83,7 @@ enum ckrm_event { CKRM_NOTCLASSIFY_EVENTS, CKRM_EVENT_MANUAL = CKRM_NOTCLASSIFY_EVENTS, - + CKRM_NUM_EVENTS }; #endif @@ -93,7 +93,7 @@ enum ckrm_event { extern void ckrm_invoke_event_cb_chain(enum ckrm_event ev, void *arg); -typedef void (*ckrm_event_cb)(void *arg); +typedef void (*ckrm_event_cb) (void *arg); struct ckrm_hook_cb { ckrm_event_cb fct; @@ -112,7 +112,7 @@ static inline void ckrm_cb_##fct(argtp arg) \ ckrm_invoke_event_cb_chain(CKRM_EVENT_##EV,(void*)arg); \ } -#else // !CONFIG_CKRM +#else // !CONFIG_CKRM #define CKRM_DEF_CB(EV,fct) \ static inline void ckrm_cb_##fct(void) { } @@ -120,11 +120,7 @@ static inline void ckrm_cb_##fct(void) { } #define CKRM_DEF_CB_ARG(EV,fct,argtp) \ static inline void ckrm_cb_##fct(argtp arg) { } -#define ckrm_cb_newtask(task_struct) -#define ckrm_cb_exit(task_struct) -#define ckrm_init() - -#endif // CONFIG_CKRM +#endif // CONFIG_CKRM /*----------------------------------------------------------------- * define the CKRM event functions @@ -136,27 +132,30 @@ struct task_struct; struct sock; struct user_struct; -CKRM_DEF_CB_ARG( FORK , fork, struct task_struct *); -CKRM_DEF_CB_ARG( EXEC , exec, const char* ); -CKRM_DEF_CB ( UID , uid ); -CKRM_DEF_CB ( GID , gid ); -CKRM_DEF_CB ( APPTAG , apptag ); -CKRM_DEF_CB ( LOGIN , login ); -CKRM_DEF_CB_ARG( USERADD , useradd, struct user_struct *); -CKRM_DEF_CB_ARG( USERDEL , userdel, struct user_struct *); -CKRM_DEF_CB_ARG( LISTEN_START , listen_start, struct sock * ); -CKRM_DEF_CB_ARG( LISTEN_STOP , listen_stop, struct sock * ); +CKRM_DEF_CB_ARG(FORK, fork, struct task_struct *); +CKRM_DEF_CB_ARG(EXEC, exec, const char *); +CKRM_DEF_CB(UID, uid); +CKRM_DEF_CB(GID, gid); +CKRM_DEF_CB(APPTAG, apptag); +CKRM_DEF_CB(LOGIN, login); +CKRM_DEF_CB_ARG(USERADD, useradd, struct user_struct *); +CKRM_DEF_CB_ARG(USERDEL, userdel, struct user_struct *); +CKRM_DEF_CB_ARG(LISTEN_START, listen_start, struct sock *); +CKRM_DEF_CB_ARG(LISTEN_STOP, listen_stop, struct sock *); +// some other functions required #ifdef CONFIG_CKRM -// and a few special one's +extern void ckrm_init(void); void ckrm_cb_newtask(struct task_struct *); void ckrm_cb_exit(struct task_struct *); +#else +#define ckrm_init(x) do { } while (0) +#define ckrm_cb_newtask(x) do { } while (0) +#define ckrm_cb_exit(x) do { } while (0) +#endif -// some other functions required -extern void ckrm_init(void); extern int get_exe_path_name(struct task_struct *, char *, int); -#endif // CONFIG_CKRM -#endif // __KERNEL__ +#endif // __KERNEL__ -#endif // _LINUX_CKRM_H +#endif // _LINUX_CKRM_H diff --git a/include/linux/sched.h b/include/linux/sched.h index 5d419950f..385b390fe 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1154,6 +1154,10 @@ static inline void add_io_delay(unsigned long dstart) clear_delay_flag(tsk,PF_IOWAIT); } +inline static void init_delays(struct task_struct *tsk) +{ + memset((void*)&tsk->delays,0,sizeof(tsk->delays)); +} #else @@ -1171,6 +1175,7 @@ static inline void add_io_delay(unsigned long dstart) #define add_delay_ts(tsk,field,start_ts,now) do { } while (0) #define add_delay_clear(tsk,field,start_ts,flg) do { } while (0) #define add_io_delay(dstart) do { } while (0) +#define init_delays(tsk) do { } while (0) #endif diff --git a/include/linux/tcp.h b/include/linux/tcp.h index dadabeeea..9ceaf7393 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -454,8 +454,7 @@ struct tcp_opt { unsigned int aq_qcount; unsigned int aq_backlog; unsigned int aq_wait_time; - int aq_valid; - } acceptq[NUM_ACCEPT_QUEUES]; + } acceptq[NUM_ACCEPT_QUEUES]; #endif }; diff --git a/include/net/sock.h b/include/net/sock.h index 4cf8c904b..80aa71498 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -409,6 +409,7 @@ static inline int sock_flag(struct sock *sk, enum sock_flags flag) return test_bit(flag, &sk->sk_flags); } +#ifndef CONFIG_ACCEPT_QUEUES static inline void sk_acceptq_removed(struct sock *sk) { sk->sk_ack_backlog--; @@ -424,6 +425,8 @@ static inline int sk_acceptq_is_full(struct sock *sk) return sk->sk_ack_backlog > sk->sk_max_ack_backlog; } +#endif + /* * Compute minimal free write space needed to queue new packets. */ diff --git a/include/net/tcp.h b/include/net/tcp.h index 7aa687fb3..b1513f564 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1788,18 +1788,32 @@ static inline int tcp_full_space( struct sock *sk) return tcp_win_from_space(sk->sk_rcvbuf); } +struct tcp_listen_opt +{ + u8 max_qlen_log; /* log_2 of maximal queued SYNs */ + int qlen; +#ifdef CONFIG_ACCEPT_QUEUES + int qlen_young[NUM_ACCEPT_QUEUES]; +#else + int qlen_young; +#endif + int clock_hand; + u32 hash_rnd; + struct open_request *syn_table[TCP_SYNQ_HSIZE]; +}; + #ifdef CONFIG_ACCEPT_QUEUES -static inline void tcp_acceptq_removed(struct sock *sk, int class) +static inline void sk_acceptq_removed(struct sock *sk, int class) { tcp_sk(sk)->acceptq[class].aq_backlog--; } -static inline void tcp_acceptq_added(struct sock *sk, int class) +static inline void sk_acceptq_added(struct sock *sk, int class) { tcp_sk(sk)->acceptq[class].aq_backlog++; } -static inline int tcp_acceptq_is_full(struct sock *sk, int class) +static inline int sk_acceptq_is_full(struct sock *sk, int class) { return tcp_sk(sk)->acceptq[class].aq_backlog > sk->sk_max_ack_backlog; @@ -1847,25 +1861,10 @@ static inline void tcp_acceptq_queue(struct sock *sk, struct open_request *req, { tcp_set_acceptq(tcp_sk(sk),req); req->sk = child; - tcp_acceptq_added(sk,req->acceptq_class); + sk_acceptq_added(sk,req->acceptq_class); } #else -static inline void tcp_acceptq_removed(struct sock *sk) -{ - sk->sk_ack_backlog--; -} - -static inline void tcp_acceptq_added(struct sock *sk) -{ - sk->sk_ack_backlog++; -} - -static inline int tcp_acceptq_is_full(struct sock *sk) -{ - return sk->sk_ack_backlog > sk->sk_max_ack_backlog; -} - static inline void tcp_acceptq_queue(struct sock *sk, struct open_request *req, struct sock *child) { @@ -1885,19 +1884,6 @@ static inline void tcp_acceptq_queue(struct sock *sk, struct open_request *req, #endif -struct tcp_listen_opt -{ - u8 max_qlen_log; /* log_2 of maximal queued SYNs */ - int qlen; -#ifdef CONFIG_ACCEPT_QUEUES - int qlen_young[NUM_ACCEPT_QUEUES]; -#else - int qlen_young; -#endif - int clock_hand; - u32 hash_rnd; - struct open_request *syn_table[TCP_SYNQ_HSIZE]; -}; #ifdef CONFIG_ACCEPT_QUEUES static inline void diff --git a/init/Kconfig b/init/Kconfig index 1b1d1a0de..d9153c5aa 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -85,6 +85,8 @@ config SYSVIPC you want to run the DOS emulator dosemu under Linux (read the DOSEMU-HOWTO, available from ), you'll need to say Y here. + DOSEMU-HOWTO, available from ), + you'll need to say Y here. You can find documentation about IPC with "info ipc" and also in section 6.4 of the Linux Programmer's Guide, available from @@ -188,6 +190,30 @@ config CKRM_RES_LISTENAQ If unsure, say N. +config CKRM_RBCE + tristate "Vanilla Rule-based Classification Engine (RBCE)" + depends on CKRM && RCFS_FS + default m + help + Provides an optional module to support creation of rules for automatic + classification of kernel objects. Rules are created/deleted/modified + through an rcfs interface. RBCE is not required for CKRM. + + If unsure, say N. + +config CKRM_CRBCE + tristate "Enhanced Rule-based Classification Engine (RBCE)" + depends on CKRM && RCFS_FS && RELAYFS_FS && DELAY_ACCT + default m + help + Provides an optional module to support creation of rules for automatic + classification of kernel objects, just like RBCE above. In addition, + CRBCE provides per-process delay data (requires DELAY_ACCT configured) + enabled) and makes information on significant kernel events available + to userspace tools through relayfs (requires RELAYFS_FS configured). + + If unsure, say N. + endmenu config BSD_PROCESS_ACCT_V3 @@ -313,9 +339,9 @@ config DELAY_ACCT bool "Enable delay accounting (EXPERIMENTAL)" help In addition to counting frequency the total delay in ns is also - recorded. CPU delays are specified as cpu-wait and cpu-run. Memory - delay is recorded for minor and major faults. Information is - accessible through /proc//delay. + recorded. CPU delays are specified as cpu-wait and cpu-run. + I/O delays are recorded for memory and regular I/O. + Information is accessible through /proc//delay. config KALLSYMS diff --git a/kernel/exit.c b/kernel/exit.c index 05f2029da..979c5d425 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -834,7 +834,9 @@ asmlinkage NORET_TYPE void do_exit(long code) module_put(tsk->binfmt->module); tsk->exit_code = code; +#ifdef CONFIG_CKRM_TYPE_TASKCLASS numtasks_put_ref(tsk->taskclass); +#endif exit_notify(tsk); schedule(); BUG(); diff --git a/kernel/fork.c b/kernel/fork.c index 5edc15413..ca4a6f985 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -968,6 +968,7 @@ struct task_struct *copy_process(unsigned long clone_flags, if (p->binfmt && !try_module_get(p->binfmt->module)) goto bad_fork_cleanup_put_domain; + init_delays(p); p->did_exec = 0; copy_flags(clone_flags, p); if (clone_flags & CLONE_IDLETASK) @@ -1228,9 +1229,11 @@ long do_fork(unsigned long clone_flags, clone_flags |= CLONE_PTRACE; } +#ifdef CONFIG_CKRM_TYPE_TASKCLASS if (numtasks_get_ref(current->taskclass, 0) == 0) { return -ENOMEM; } +#endif p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr); /* @@ -1300,7 +1303,9 @@ long do_fork(unsigned long clone_flags, */ set_need_resched(); } else { +#ifdef CONFIG_CKRM_TYPE_TASKCLASS numtasks_put_ref(current->taskclass); +#endif } return pid; } diff --git a/kernel/sched.c b/kernel/sched.c index f9be59676..a5058d6ee 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -46,6 +46,8 @@ #include +#include + #ifdef CONFIG_NUMA #define cpu_to_node_mask(cpu) node_to_cpumask(cpu_to_node(cpu)) #else @@ -1879,6 +1881,7 @@ static void active_load_balance(runqueue_t *busiest, int busiest_cpu) next_group: group = group->next; } while (group != sd->groups); +>>>>>>> 1.1.9.3 } /* diff --git a/mm/memory.c b/mm/memory.c index fcc91fd37..2511ddf09 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -687,7 +687,7 @@ follow_page_pfn(struct mm_struct *mm, unsigned long address, int write, goto out; if (pmd_huge(*pmd)) return follow_huge_pmd(mm, address, pmd, write); - if (pmd_bad(*pmd)) + if (unlikely(pmd_bad(*pmd))) goto out; ptep = pte_offset_map(pmd, address); @@ -699,15 +699,11 @@ follow_page_pfn(struct mm_struct *mm, unsigned long address, int write, if (pte_present(pte)) { if (write && !pte_write(pte)) goto out; - if (write && !pte_dirty(pte)) { - struct page *page = pte_page(pte); - if (!PageDirty(page)) - set_page_dirty(page); - } pfn = pte_pfn(pte); if (pfn_valid(pfn)) { - struct page *page = pfn_to_page(pfn); - + page = pfn_to_page(pfn); + if (write && !pte_dirty(pte) && !PageDirty(page)) + set_page_dirty(page); mark_page_accessed(page); return page; } else { diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 531034e6e..d4430f6bb 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -256,7 +256,10 @@ #include #include #include + +#ifdef CONFIG_CKRM #include +#endif #include #include @@ -278,7 +281,6 @@ kmem_cache_t *tcp_timewait_cachep; atomic_t tcp_orphan_count = ATOMIC_INIT(0); int sysctl_tcp_default_win_scale = 7; - int sysctl_tcp_mem[3]; int sysctl_tcp_wmem[3] = { 4 * 1024, 16 * 1024, 128 * 1024 }; int sysctl_tcp_rmem[3] = { 4 * 1024, 87380, 87380 * 2 }; @@ -528,7 +530,24 @@ int tcp_listen_start(struct sock *sk) sk->sk_max_ack_backlog = 0; sk->sk_ack_backlog = 0; +#ifdef CONFIG_ACCEPT_QUEUES tp->accept_queue = NULL; +#else + tp->accept_queue = tp->accept_queue_tail = NULL; +#endif + tp->syn_wait_lock = RW_LOCK_UNLOCKED; + tcp_delack_init(tp); + + lopt = kmalloc(sizeof(struct tcp_listen_opt), GFP_KERNEL); + if (!lopt) + return -ENOMEM; + + memset(lopt, 0, sizeof(struct tcp_listen_opt)); + for (lopt->max_qlen_log = 6; ; lopt->max_qlen_log++) + if ((1 << lopt->max_qlen_log) >= sysctl_max_syn_backlog) + break; + get_random_bytes(&lopt->hash_rnd, 4); + #ifdef CONFIG_ACCEPT_QUEUES tp->class_index = 0; for (i=0; i < NUM_ACCEPT_QUEUES; i++) { @@ -538,27 +557,13 @@ int tcp_listen_start(struct sock *sk) tp->acceptq[i].aq_qcount = 0; tp->acceptq[i].aq_count = 0; if (i == 0) { - tp->acceptq[i].aq_valid = 1; tp->acceptq[i].aq_ratio = 1; } else { - tp->acceptq[i].aq_valid = 0; tp->acceptq[i].aq_ratio = 0; } } #endif - tp->syn_wait_lock = RW_LOCK_UNLOCKED; - tcp_delack_init(tp); - - lopt = kmalloc(sizeof(struct tcp_listen_opt), GFP_KERNEL); - if (!lopt) - return -ENOMEM; - - memset(lopt, 0, sizeof(struct tcp_listen_opt)); - for (lopt->max_qlen_log = 6; ; lopt->max_qlen_log++) - if ((1 << lopt->max_qlen_log) >= sysctl_max_syn_backlog) - break; - get_random_bytes(&lopt->hash_rnd, 4); write_lock_bh(&tp->syn_wait_lock); tp->listen_opt = lopt; @@ -668,7 +673,7 @@ static void tcp_listen_stop (struct sock *sk) sock_put(child); #ifdef CONFIG_ACCEPT_QUEUES - tcp_acceptq_removed(sk, req->acceptq_class); + sk_acceptq_removed(sk, req->acceptq_class); #else sk_acceptq_removed(sk); #endif @@ -2250,8 +2255,8 @@ struct sock *tcp_accept(struct sock *sk, int flags, int *err) req = tp->accept_queue; if ((tp->accept_queue = req->dl_next) == NULL) tp->accept_queue_tail = NULL; - - tcp_acceptq_removed(sk); + newsk = req->sk; + sk_acceptq_removed(sk); #else first = tp->class_index; /* We should always have request queued here. The accept_queue @@ -2281,17 +2286,11 @@ struct sock *tcp_accept(struct sock *sk, int flags, int *err) if((++(tp->acceptq[first].aq_cnt)) >= tp->acceptq[first].aq_ratio){ tp->acceptq[first].aq_cnt = 0; - tp->class_index = ++first & ~NUM_ACCEPT_QUEUES; + tp->class_index = ++first & (NUM_ACCEPT_QUEUES-1); } - tcp_acceptq_removed(sk, req->acceptq_class); -#endif newsk = req->sk; - - /* MEF REVISIT: The following sk_acceptq_removed(sk); wasn't - in CKRM E13, but a latter patch should fix this - properly. - */ - sk_acceptq_removed(sk); + sk_acceptq_removed(sk, req->acceptq_class); +#endif tcp_openreq_fastfree(req); BUG_TRAP(newsk->sk_state != TCP_SYN_RECV); release_sock(sk); @@ -2303,6 +2302,7 @@ out: return NULL; } + /* * Socket option code for TCP. */ @@ -2464,6 +2464,12 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval, #ifdef CONFIG_ACCEPT_QUEUES case TCP_ACCEPTQ_SHARE: +#ifdef CONFIG_CKRM + // If CKRM is set then the shares are set through rcfs. + // Get shares will still succeed. + err = -EOPNOTSUPP; + break; +#else { char share_wt[NUM_ACCEPT_QUEUES]; int i,j; @@ -2483,10 +2489,9 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval, else if (share_wt[i] < j) { j = share_wt[i]; } - tp->acceptq[i].aq_valid = 1; } else - tp->acceptq[i].aq_valid = 0; + tp->acceptq[i].aq_ratio = 0; } if (j == 0) { @@ -2494,7 +2499,6 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval, * specified set class 0 as 1. */ share_wt[0] = 1; - tp->acceptq[0].aq_valid = 1; j = 1; } for (i=0; i < NUM_ACCEPT_QUEUES; i++) { @@ -2504,7 +2508,7 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval, } break; #endif - +#endif default: err = -ENOPROTOOPT; break; @@ -2587,7 +2591,8 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval, break; #ifdef CONFIG_ACCEPT_QUEUES - case TCP_ACCEPTQ_SHARE: { + case TCP_ACCEPTQ_SHARE: + { struct tcp_acceptq_info tinfo[NUM_ACCEPT_QUEUES]; int i; @@ -2601,13 +2606,10 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval, for(i=0; i < NUM_ACCEPT_QUEUES; i++) { tinfo[i].acceptq_wait_time = - tp->acceptq[i].aq_wait_time/(HZ/USER_HZ); + jiffies_to_msecs(tp->acceptq[i].aq_wait_time); tinfo[i].acceptq_qcount = tp->acceptq[i].aq_qcount; tinfo[i].acceptq_count = tp->acceptq[i].aq_count; - if (tp->acceptq[i].aq_valid) - tinfo[i].acceptq_shares=tp->acceptq[i].aq_ratio; - else - tinfo[i].acceptq_shares = 0; + tinfo[i].acceptq_shares=tp->acceptq[i].aq_ratio; } len = min_t(unsigned int, len, sizeof(tinfo)); @@ -2619,6 +2621,7 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval, return 0; } + break; #endif default: return -ENOPROTOOPT; diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index a9c91a33a..53d710d35 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1529,8 +1529,8 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) * Accept only if the class has shares set or if the default class * i.e. class 0 has shares */ - if (!(tcp_sk(sk)->acceptq[class].aq_valid)) { - if (tcp_sk(sk)->acceptq[0].aq_valid) + if (!(tcp_sk(sk)->acceptq[class].aq_ratio)) { + if (tcp_sk(sk)->acceptq[0].aq_ratio) class = 0; else goto drop; @@ -1543,7 +1543,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) * timeout. */ #ifdef CONFIG_ACCEPT_QUEUES - if (tcp_acceptq_is_full(sk, class) && tcp_synq_young(sk, class) > 1) + if (sk_acceptq_is_full(sk, class) && tcp_synq_young(sk, class) > 1) #else if (sk_acceptq_is_full(sk) && tcp_synq_young(sk) > 1) #endif @@ -1675,7 +1675,7 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, struct sock *newsk; #ifdef CONFIG_ACCEPT_QUEUES - if (tcp_acceptq_is_full(sk, req->acceptq_class)) + if (sk_acceptq_is_full(sk, req->acceptq_class)) #else if (sk_acceptq_is_full(sk)) #endif diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 1c8b8ecee..e674ff755 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -1197,21 +1197,14 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) * Accept only if the class has shares set or if the default class * i.e. class 0 has shares */ - if (!(tcp_sk(sk)->acceptq[class].aq_valid)) { - if (tcp_sk(sk)->acceptq[0].aq_valid) + if (!(tcp_sk(sk)->acceptq[class].aq_ratio)) { + if (tcp_sk(sk)->acceptq[0].aq_ratio) class = 0; else goto drop; } -#endif - /* Accept backlog is full. If we have already queued enough - * of warm entries in syn queue, drop request. It is better than - * clogging syn queue with openreqs with exponentially increasing - * timeout. - */ -#ifdef CONFIG_ACCEPT_QUEUES - if (tcp_acceptq_is_full(sk, class) && tcp_synq_young(sk, class) > 1) + if (sk_acceptq_is_full(sk, class) && tcp_synq_young(sk, class) > 1) #else if (sk_acceptq_is_full(sk) && tcp_synq_young(sk) > 1) #endif @@ -1336,7 +1329,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, opt = np->opt; #ifdef CONFIG_ACCEPT_QUEUES - if (tcp_acceptq_is_full(sk, req->acceptq_class)) + if (sk_acceptq_is_full(sk, req->acceptq_class)) #else if (sk_acceptq_is_full(sk)) #endif -- 2.47.0