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
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
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
# 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
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)
#
CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_AOUT is not set
-CONFIG_BINFMT_MISC=y
+CONFIG_BINFMT_MISC=m
#
# Device Drivers
# 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
# 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
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
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
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)
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
#
# 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
CONFIG_INET_AH=m
CONFIG_INET_ESP=m
CONFIG_INET_IPCOMP=m
+CONFIG_ACCEPT_QUEUES=y
#
# IP: Virtual Server Configuration
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
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
CONFIG_SYNCLINK_CS=m
CONFIG_MWAVE=m
# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
CONFIG_HANGCHECK_TIMER=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
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
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
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
#
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
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
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
#
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
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
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
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
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
#
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=m
CONFIG_X86_BIOS_REBOOT=y
+CONFIG_X86_STD_RESOURCES=y
CONFIG_PC=y
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/
fput(bprm->file);
bprm->file = NULL;
current->did_exec = 1;
+ ckrm_cb_exec(bprm->filename);
return retval;
}
read_lock(&binfmt_lock);
if (retval >= 0) {
free_arg_pages(&bprm);
- ckrm_cb_exec(filename);
-
/* execve success */
security_bprm_free(&bprm);
return retval;
{
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;
}
#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
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) */
CKRM_NOTCLASSIFY_EVENTS,
CKRM_EVENT_MANUAL = CKRM_NOTCLASSIFY_EVENTS,
-
+
CKRM_NUM_EVENTS
};
#endif
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;
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) { }
#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
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
clear_delay_flag(tsk,PF_IOWAIT);
}
+inline static void init_delays(struct task_struct *tsk)
+{
+ memset((void*)&tsk->delays,0,sizeof(tsk->delays));
+}
#else
#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
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
};
return test_bit(flag, &sk->sk_flags);
}
+#ifndef CONFIG_ACCEPT_QUEUES
static inline void sk_acceptq_removed(struct sock *sk)
{
sk->sk_ack_backlog--;
return sk->sk_ack_backlog > sk->sk_max_ack_backlog;
}
+#endif
+
/*
* Compute minimal free write space needed to queue new packets.
*/
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;
{
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)
{
#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
you want to run the DOS emulator dosemu under Linux (read the
DOSEMU-HOWTO, available from <http://www.tldp.org/docs.html#howto>),
you'll need to say Y here.
+ DOSEMU-HOWTO, available from <http://www.tldp.org/docs.html#howto>),
+ 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
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
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/<pid>/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/<pid>/delay.
config KALLSYMS
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();
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)
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);
/*
*/
set_need_resched();
} else {
+#ifdef CONFIG_CKRM_TYPE_TASKCLASS
numtasks_put_ref(current->taskclass);
+#endif
}
return pid;
}
#include <asm/unistd.h>
+#include <asm/unistd.h>
+
#ifdef CONFIG_NUMA
#define cpu_to_node_mask(cpu) node_to_cpumask(cpu_to_node(cpu))
#else
next_group:
group = group->next;
} while (group != sd->groups);
+>>>>>>> 1.1.9.3
}
/*
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);
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 {
#include <linux/smp_lock.h>
#include <linux/fs.h>
#include <linux/random.h>
+
+#ifdef CONFIG_CKRM
#include <linux/ckrm.h>
+#endif
#include <net/icmp.h>
#include <net/tcp.h>
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 };
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++) {
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;
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
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
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);
return NULL;
}
+
/*
* Socket option code for TCP.
*/
#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;
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) {
* 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++) {
}
break;
#endif
-
+#endif
default:
err = -ENOPROTOOPT;
break;
break;
#ifdef CONFIG_ACCEPT_QUEUES
- case TCP_ACCEPTQ_SHARE: {
+ case TCP_ACCEPTQ_SHARE:
+ {
struct tcp_acceptq_info tinfo[NUM_ACCEPT_QUEUES];
int i;
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));
return 0;
}
+ break;
#endif
default:
return -ENOPROTOOPT;
* 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;
* 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
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
* 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
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