2003-01-15 17:33:49

by Robert Macaulay

[permalink] [raw]
Subject: 2.5.57 IO slowdown with CONFIG_PREEMPT enabled

In between 2.5.56 and 2.5.57 IO speeds have dropped if CONFIG_PREEMPT is
set.

The machine is a 4 processor Xeon with 8GB of RAM. The external storage is
attached to the machine via qlogic 2200 HBAs using the qlogicfc driver.
The filesystems on the external devices is reiserfs, mounted with noatime
as the only change from defaults. The config file is attached below. The
same config was used for both 2.5.56 and 2.5.57. The config has
preemptable kernel enabled. I know preemption will lower your throughput,
but it was enabled in 2.5.56, and speed was good.

The test involved the simultaneous writing to all 8 filesystems on the
external storage. On 2.5.56, the vmstat output is below

procs -----------memory---------- ---swap-- -----io---- --system--
----cpu----
r b swpd free buff cache si so bi bo in cs us sy
id wa
8 1 0 7108 87280 7505164 0 0 20 2989 144 56 0 21
77 1
8 2 0 8444 85376 7505440 0 0 0 115536 1387 2391 0 93
1 5
9 2 0 7684 89364 7502132 0 0 0 112348 1455 2308 0 94
1 5
4 2 0 7072 94704 7495600 0 0 0 129468 1382 4314 0 51
32 18


For 2.5.57, the io bo rate drops, and the system time pegs at 100%

procs -----------memory---------- ---swap-- -----io---- --system--
----cpu----
r b swpd free buff cache si so bi bo in cs us sy
id wa
8 1 0 8000 61196 7535276 0 0 36 4158 147 22 1 40
58 1
9 1 0 7468 62316 7533832 0 0 1 79852 1223 303 0 100
0 0
9 1 0 6740 64884 7532368 0 0 0 79655 1288 182 0 100
0 0
9 0 0 7004 66720 7528828 0 0 0 78841 1261 354 0 100
0 0
9 1 0 8272 67604 7526844 0 0 0 77958 1190 204 0 100
0 0


The profiling information for 2.5.57 is below
/usr/sbin/readprofile -m /boot/System.map-2.5.57-test2 -v | sort -nr +2 |
head -15
00000000 total 436997 2.9703
c011bb60 __preempt_spin_lock 293278 3054.9792
c0107020 default_idle 83500 1304.6875
c011bc22 .text.lock.sched 55920 185.1656
c0119fc0 __wake_up 2371 29.6375
c0118960 kmap_atomic 941 7.3516
c0121920 do_softirq 393 1.8894
c01189f0 kmap_atomic_to_page 129 1.1518
c011bb00 __might_sleep 128 1.3333
c0119af0 schedule 126 0.1270
c0113e50 flush_tlb_mm 47 0.3264
c011bbc0 __preempt_write_lock 35 0.3571
c01178c0 do_page_fault 31 0.0251
c01189e0 kunmap_atomic 17 1.0625
c0124cb0 add_timer 15 0.0446

If I recompile 2.5.57 with preemption off, the vmstat rates go back to the
rates similar to the 2.5.56 w/ preemption turned on.

Is this expected behaviour now?
Thanks in advance.
Robert


2003-01-15 17:51:19

by Andrew Morton

[permalink] [raw]
Subject: Re: 2.5.57 IO slowdown with CONFIG_PREEMPT enabled

Robert Macaulay <[email protected]> wrote:
>
> Is this expected behaviour now?

Judging by the coffee dribbles on my monitor: no.

Thanks for the detailed report. Let me crunch on that.


2003-01-15 19:09:52

by Andrew Morton

[permalink] [raw]
Subject: Re: 2.5.57 IO slowdown with CONFIG_PREEMPT enabled

Robert Macaulay <[email protected]> wrote:
>
> In between 2.5.56 and 2.5.57 IO speeds have dropped if CONFIG_PREEMPT is
> set.
>
> The machine is a 4 processor Xeon with 8GB of RAM. The external storage is
> attached to the machine via qlogic 2200 HBAs using the qlogicfc driver.
> The filesystems on the external devices is reiserfs, mounted with noatime
> as the only change from defaults. The config file is attached below. The
> same config was used for both 2.5.56 and 2.5.57. The config has
> preemptable kernel enabled. I know preemption will lower your throughput,
> but it was enabled in 2.5.56, and speed was good.
>

I cannot reproduce this :(

Machine is a quad pIII Xeon, 4G of RAM (IDE starts bouncing above 4G),
writing four disks (2xIDE, 2xSCSI).

With CONFIG_PREEMPT=y:

3 1 1 1656 3224 3908 218564 0 0 0 76308 1545 705 1 86 13
3 1 1 1656 3784 3996 217920 0 0 0 74676 1529 736 0 86 14
3 1 1 1656 3024 4104 218388 0 0 0 71320 1538 614 0 86 13
4 0 2 1656 2496 3948 219104 0 0 0 73992 1536 687 0 88 12
3 1 1 1680 3652 4004 218004 0 24 0 74040 1524 647 0 88 12
3 1 1 1680 2972 4032 218596 32 0 48 78136 1547 688 0 87 13

oprofile says:

c01685f4 164 0.49068 mpage_writepages
c01e6a14 177 0.529575 journal_mark_dirty
c014c79c 182 0.544535 __block_prepare_write
c01ca90c 190 0.568471 balance_leaf
c01e676c 205 0.61335 do_journal_begin_r
c0131bf4 237 0.709093 generic_file_aio_write_nolock
c01de9b8 251 0.75098 is_leaf
c014c044 290 0.867666 __find_get_block
c01d03f0 442 1.32244 reiserfs_get_block
c01dec24 978 2.92613 search_by_key
c01dc8a0 1836 5.49322 leaf_paste_in_buffer
c01f88f8 2963 8.86515 __copy_from_user_ll
c0108a88 6235 18.6548 poll_idle
c011ad8c 11403 34.1172 __preempt_spin_lock

OK, that's similar to yours. Disabling preemption:

c01dccd0 576 0.490213 reiserfs_restore_prepared_buffer
c01dbf94 605 0.514894 journal_mark_dirty
c01dbcec 615 0.523404 do_journal_begin_r
c0147a9c 628 0.534468 __block_prepare_write
c01d3f58 637 0.542128 is_leaf
c012f004 658 0.56 generic_file_aio_write_nolock
c01c8828 873 0.742979 reiserfs_commit_write
c01473c4 1376 1.17106 __find_get_block
c01c5b90 1651 1.40511 reiserfs_get_block
c01d41c4 3496 2.97532 search_by_key
c01d1e40 6264 5.33106 leaf_paste_in_buffer
c01edc18 10115 8.60851 __copy_from_user_ll
c0108a58 21450 18.2553 poll_idle
c01c8afc 38908 33.1132 .text.lock.inode

And the I/O rate is the same. So all we've done here is to move the lock
contention from kernel/sched.c to fs/reiserfs/inode.c. It'll be
lock_kernel().

So hm. Confused. Could you please:

- double check everything.

- try booting with mem=4G? It could be that something broke and there is
bounce buffering happening above 4G - the regular kernel profiler often
will not show this.

- remove the cpu_relax() call from kernel/sched.c:__preempt_spin_lock()

Thanks.


BTW: here is ext2:

0 4 2 704 136696 13980 3904276 0 0 0 104848 1680 310 1 99 0
0 4 2 704 30336 14084 4009228 0 0 0 100836 1680 273 0 100 0
0 4 3 1716 5532 9848 4038584 0 1012 8 99888 1682 342 1 97 3
2 2 3 1716 5132 9956 4038788 0 0 0 97392 1685 307 0 100 0
1 3 3 1716 4996 10052 4038832 0 0 0 97276 1689 310 1 99 0
0 4 3 1716 8252 10160 4035436 0 0 4 100644 1691 321 0 98 2
2 2 3 1716 5176 10256 4038020 0 0 8 102432 1683 333 2 98 1
1 3 3 1716 7124 10348 4035804 0 0 0 112740 1691 354 0 100 0

c0134bcc 193 0.337094 __set_page_dirty_nobuffers
c0120bc0 194 0.338841 current_kernel_time
c019890c 249 0.434904 ext2_get_branch
c014c044 261 0.455863 __find_get_block
c0131bf4 265 0.46285 generic_file_aio_write_nolock
c01681bc 280 0.489049 mpage_writepage
c023ab18 300 0.523981 ide_outb
c01685f4 307 0.536207 mpage_writepages
c01305a4 314 0.548433 unlock_page
c0198cd8 372 0.649736 ext2_get_block
c01f88f8 8907 15.557 __copy_from_user_ll
c0108a88 39147 68.3743 poll_idle

So sweet.


2003-01-15 22:04:05

by Robert Macaulay

[permalink] [raw]
Subject: Re: 2.5.57 IO slowdown with CONFIG_PREEMPT enabled

On Wed, 15 Jan 2003, Andrew Morton wrote:
> So hm.? Confused.? Could you please:
>
> - double check everything.
created 2 kernel trees, patched to 2.5.57. Same config in each except for
the PREEMPT. Same results(below)

> - try booting with mem=4G?? It could be that something broke and there is
> ? bounce buffering happening above 4G - the regular kernel profiler often
> ? will not show this.
No change, results at bottom

> - remove the cpu_relax() call from kernel/sched.c:__preempt_spin_lock()
No change either

I have been hitting an odd issue, and I haven't had a chance to traceback
to where it came from(versionwise). FS changes seem to be getting rolled
back at times. For example, I run make menuconfig, add my config options
for CONFIG_MEGARAID to be built in, and recompile kernel. I install and
reboot, and that config file, which contained CONFIG_MEGARAID=y, reverts
back to its original state. multiple syncs seem to keep this in the
correct state. The filesystem that this is occuring on is ext3, mounted
with defaults, on a megaraid controller. I'll trace this down later and
post results.

Results, config attached at bottom

Preempt on, mem=4G

r b swpd free buff cache si so bi bo in cs us sy
id wa
9 0 0 3708656 43480 334772 0 0 31 10 135 14 0 3
96 1
9 0 0 3270376 44460 761840 0 0 0 84554 1146 57 0 100
0 0
10 0 0 2839680 45436 1185396 0 0 0 84579 1219 68 0
100 0 0
10 0 0 2396048 46004 1622124 0 0 0 85222 1249 81 0
100 0 0
10 0 0 1963608 46880 2047936 0 0 0 85438 1258 52 0
100 0 0
10 0 0 1524696 47508 2480336 0 0 0 87675 1229 41 0
100 0 0
10 0 0 1110296 47984 2888388 0 0 0 81985 1208 23 0
100 0 0
8 0 0 690520 49752 3300296 0 0 0 82430 1288 50 0 100
0 0
10 0 0 275136 51228 3708044 0 0 0 81434 1266 41 0 100
0 0

00000000 total 391373 2.6427
c011bc70 __preempt_spin_lock 249427 2598.1979
c0107020 default_idle 82788 1293.5625
c011bd32 .text.lock.sched 55698 184.4305
c011a0d0 __wake_up 1940 24.2500
c0118a70 kmap_atomic 693 5.4141
c0121d10 do_softirq 300 1.4423
c0119c00 schedule 147 0.1482

Preempt off

9 1 0 4221696 59828 3372500 0 0 54 2356 147 51 1 17
81 1
8 1 0 3594336 61208 3989276 0 0 0 110992 1373 1680 0
91 2 7
7 1 0 2975704 63588 4596296 0 0 0 116468 1344 1989 0
92 2 7
7 1 0 2370264 66660 5189600 0 0 0 117044 1389 2527 0
92 2 6
7 1 0 1781400 68724 5767900 0 0 0 111212 1399 2216 0
92 2 6
10 1 0 1196824 70228 6342416 0 0 0 111518 1395 2122 0
92 2 7
11 1 0 614664 71968 6914100 0 0 0 110734 1431 2139 0 92
2 6

00000000 total 124674 0.8897
c0107000 default_idle 104540 1633.4375
c011ac9d .text.lock.sched 16201 31.4583
c0119550 __wake_up 1331 27.7292
c0119120 schedule 996 1.0921
c0118200 kmap_atomic 854 6.6719
c01204f0 do_softirq 293 1.4087


Preempt on, mem=4G, removed cpu_relax
10 0 0 3026800 44312 1002740 0 0 1206 437 205 87 6 10
75 10
10 0 0 2662480 45464 1360980 0 0 0 70961 1220 53 0
100 0 0
13 0 0 2309832 46572 1707684 0 0 0 70914 1223 40 0
100 0 0
10 0 0 1957536 46984 2054168 0 0 0 71576 1217 38 0
100 0 0
10 0 0 1611088 47444 2395760 0 0 0 60826 1184 20 0
100 0 0

c011bc70 __preempt_spin_lock 220564 2757.0500
c011bd20 .text.lock.sched 58550 203.2986
c011a0d0 __wake_up 1829 22.8625
c0118a70 kmap_atomic 890 6.9531
c0121cf0 do_softirq 284 1.3654
c0107020 default_idle 132 2.0625



CONFIG file
#
# Automatically generated make config: don't edit
#
CONFIG_X86=y
CONFIG_MMU=y
CONFIG_SWAP=y
CONFIG_UID16=y
CONFIG_GENERIC_ISA_DMA=y

#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y

#
# General setup
#
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
# CONFIG_LOG_BUF_SHIFT_17 is not set
# CONFIG_LOG_BUF_SHIFT_16 is not set
CONFIG_LOG_BUF_SHIFT_15=y
# CONFIG_LOG_BUF_SHIFT_14 is not set
# CONFIG_LOG_BUF_SHIFT_13 is not set
# CONFIG_LOG_BUF_SHIFT_12 is not set
CONFIG_LOG_BUF_SHIFT=15

#
# Loadable module support
#
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
CONFIG_OBSOLETE_MODPARM=y
CONFIG_KMOD=y

#
# Processor type and features
#
CONFIG_X86_PC=y
# CONFIG_X86_VOYAGER is not set
# CONFIG_X86_NUMAQ is not set
# CONFIG_X86_SUMMIT is not set
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
# CONFIG_M586TSC is not set
# CONFIG_M586MMX is not set
# CONFIG_M686 is not set
# CONFIG_MPENTIUMII is not set
CONFIG_MPENTIUMIII=y
# CONFIG_MPENTIUM4 is not set
# CONFIG_MK6 is not set
# CONFIG_MK7 is not set
# CONFIG_MK8 is not set
# CONFIG_MELAN is not set
# CONFIG_MCRUSOE is not set
# CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP2 is not set
# CONFIG_MWINCHIP3D is not set
# CONFIG_MCYRIXIII is not set
CONFIG_X86_CMPXCHG=y
CONFIG_X86_XADD=y
CONFIG_X86_L1_CACHE_SHIFT=5
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y
CONFIG_X86_BSWAP=y
CONFIG_X86_POPAD_OK=y
CONFIG_X86_TSC=y
CONFIG_X86_GOOD_APIC=y
CONFIG_X86_INTEL_USERCOPY=y
CONFIG_X86_USE_PPRO_CHECKSUM=y
CONFIG_X86_PREFETCH=y
# CONFIG_HUGETLB_PAGE is not set
CONFIG_SMP=y
# CONFIG_PREEMPT is not set
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_NR_CPUS=16
CONFIG_X86_MCE=y
# CONFIG_X86_MCE_NONFATAL is not set
CONFIG_X86_MCE_P4THERMAL=y
# CONFIG_TOSHIBA is not set
# CONFIG_I8K is not set
# CONFIG_MICROCODE is not set
# CONFIG_X86_MSR is not set
# CONFIG_X86_CPUID is not set
CONFIG_EDD=y
# CONFIG_NOHIGHMEM is not set
# CONFIG_HIGHMEM4G is not set
CONFIG_HIGHMEM64G=y
CONFIG_HIGHMEM=y
CONFIG_X86_PAE=y
CONFIG_HIGHPTE=y
# CONFIG_MATH_EMULATION is not set
CONFIG_MTRR=y
CONFIG_HAVE_DEC_LOCK=y

#
# Power management options (ACPI, APM)
#
# CONFIG_PM is not set

#
# ACPI Support
#
CONFIG_ACPI=y
# CONFIG_ACPI_HT_ONLY is not set
CONFIG_ACPI_BOOT=y
CONFIG_ACPI_AC=y
CONFIG_ACPI_BATTERY=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_FAN=y
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_THERMAL=y
# CONFIG_ACPI_TOSHIBA is not set
CONFIG_ACPI_DEBUG=y
CONFIG_ACPI_BUS=y
CONFIG_ACPI_INTERPRETER=y
CONFIG_ACPI_EC=y
CONFIG_ACPI_POWER=y
CONFIG_ACPI_PCI=y
CONFIG_ACPI_SYSTEM=y
# CONFIG_CPU_FREQ is not set

#
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
#
CONFIG_PCI=y
# CONFIG_PCI_GOBIOS is not set
# CONFIG_PCI_GODIRECT is not set
CONFIG_PCI_GOANY=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
# CONFIG_SCx200 is not set
# CONFIG_PCI_LEGACY_PROC is not set
CONFIG_PCI_NAMES=y
CONFIG_ISA=y
# CONFIG_EISA is not set
# CONFIG_MCA is not set
# CONFIG_HOTPLUG is not set

#
# Executable file formats
#
CONFIG_KCORE_ELF=y
# CONFIG_KCORE_AOUT is not set
CONFIG_BINFMT_AOUT=y
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_MISC=y

#
# Memory Technology Devices (MTD)
#
# CONFIG_MTD is not set

#
# Parallel port support
#
# CONFIG_PARPORT is not set

#
# Plug and Play support
#
# CONFIG_PNP is not set

#
# Block devices
#
CONFIG_BLK_DEV_FD=y
# CONFIG_BLK_DEV_XD is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
# CONFIG_BLK_DEV_LOOP is not set
# CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_RAM is not set
CONFIG_LBD=y

#
# ATA/ATAPI/MFM/RLL device support
#
# CONFIG_IDE is not set

#
# SCSI device support
#
CONFIG_SCSI=y

#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not set
CONFIG_BLK_DEV_SR=y
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_CHR_DEV_SG=y

#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_REPORT_LUNS=y
CONFIG_SCSI_CONSTANTS=y
# CONFIG_SCSI_LOGGING is not set

#
# SCSI low-level drivers
#
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
# CONFIG_SCSI_7000FASST is not set
# CONFIG_SCSI_ACARD is not set
# CONFIG_SCSI_AHA152X is not set
# CONFIG_SCSI_AHA1542 is not set
# CONFIG_SCSI_AACRAID is not set
# CONFIG_SCSI_AIC7XXX is not set
# CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_DPT_I2O is not set
# CONFIG_SCSI_ADVANSYS is not set
# CONFIG_SCSI_IN2000 is not set
# CONFIG_SCSI_AM53C974 is not set
CONFIG_SCSI_MEGARAID=y
# CONFIG_SCSI_BUSLOGIC 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_EATA_DMA is not set
# CONFIG_SCSI_EATA_PIO is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
# CONFIG_SCSI_GENERIC_NCR5380 is not set
# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
# CONFIG_SCSI_IPS is not set
# CONFIG_SCSI_INITIO is not set
# CONFIG_SCSI_INIA100 is not set
# CONFIG_SCSI_NCR53C406A is not set
# CONFIG_SCSI_NCR53C7xx is not set
# CONFIG_SCSI_SYM53C8XX_2 is not set
# CONFIG_SCSI_NCR53C8XX is not set
# CONFIG_SCSI_SYM53C8XX is not set
# CONFIG_SCSI_PAS16 is not set
# CONFIG_SCSI_PCI2000 is not set
# CONFIG_SCSI_PCI2220I is not set
# CONFIG_SCSI_PSI240I is not set
# CONFIG_SCSI_QLOGIC_FAS is not set
# CONFIG_SCSI_QLOGIC_ISP is not set
CONFIG_SCSI_QLOGIC_FC=m
CONFIG_SCSI_QLOGIC_FC_FIRMWARE=y
# CONFIG_SCSI_QLOGIC_1280 is not set
# CONFIG_SCSI_SEAGATE is not set
# CONFIG_SCSI_SIM710 is not set
# CONFIG_SCSI_SYM53C416 is not set
# 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_SCSI_NSP32 is not set
# CONFIG_SCSI_DEBUG is not set

#
# Old CD-ROM drivers (not SCSI, not IDE)
#
# CONFIG_CD_NO_IDESCSI is not set

#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set

#
# Fusion MPT device support
#
# CONFIG_FUSION is not set

#
# IEEE 1394 (FireWire) support (EXPERIMENTAL)
#
# CONFIG_IEEE1394 is not set

#
# I2O device support
#
# CONFIG_I2O is not set

#
# Networking support
#
CONFIG_NET=y

#
# Networking options
#
CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
# CONFIG_NETLINK_DEV is not set
# CONFIG_NETFILTER is not set
# CONFIG_FILTER is not set
CONFIG_UNIX=y
# CONFIG_NET_KEY is not set
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
# CONFIG_IP_PNP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
# CONFIG_INET_ECN is not set
# CONFIG_SYN_COOKIES is not set
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_XFRM_USER is not set
# CONFIG_IPV6 is not set

#
# SCTP Configuration (EXPERIMENTAL)
#
CONFIG_IPV6_SCTP__=y
# CONFIG_IP_SCTP is not set
# CONFIG_ATM is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_LLC is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
# CONFIG_NET_HW_FLOWCONTROL is not set

#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set

#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
CONFIG_NETDEVICES=y

#
# ARCnet devices
#
# CONFIG_ARCNET is not set
CONFIG_DUMMY=m
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# CONFIG_ETHERTAP is not set

#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
# CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set
# CONFIG_NET_VENDOR_RACAL is not set

#
# Tulip family network device support
#
# CONFIG_NET_TULIP is not set
# CONFIG_AT1700 is not set
# CONFIG_DEPCA is not set
# CONFIG_HP100 is not set
# CONFIG_NET_ISA is not set
CONFIG_NET_PCI=y
# CONFIG_PCNET32 is not set
# CONFIG_AMD8111_ETH is not set
# CONFIG_ADAPTEC_STARFIRE is not set
# CONFIG_AC3200 is not set
# CONFIG_APRICOT is not set
# CONFIG_B44 is not set
# CONFIG_CS89x0 is not set
# CONFIG_DGRS is not set
# CONFIG_EEPRO100 is not set
# CONFIG_E100 is not set
# CONFIG_FEALNX is not set
# CONFIG_NATSEMI is not set
# CONFIG_NE2K_PCI is not set
# CONFIG_8139CP is not set
# CONFIG_8139TOO is not set
# CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set
# CONFIG_TLAN is not set
# CONFIG_VIA_RHINE is not set
# CONFIG_NET_POCKET is not set

#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
CONFIG_E1000=y
# CONFIG_E1000_NAPI is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_R8169 is not set
# CONFIG_SK98LIN is not set
CONFIG_TIGON3=m
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set

#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set

#
# Token Ring devices (depends on LLC=y)
#
# CONFIG_NET_FC is not set
# CONFIG_RCPCI is not set
# CONFIG_SHAPER is not set

#
# Wan interfaces
#
# CONFIG_WAN is not set

#
# Amateur Radio support
#
# CONFIG_HAMRADIO is not set

#
# IrDA (infrared) support
#
# CONFIG_IRDA is not set

#
# ISDN subsystem
#
# CONFIG_ISDN_BOOL is not set

#
# Telephony Support
#
# CONFIG_PHONE is not set

#
# Input device support
#
CONFIG_INPUT=y

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_TSDEV is not set
# CONFIG_INPUT_EVDEV is not set
# CONFIG_INPUT_EVBUG is not set

#
# Input I/O drivers
#
# CONFIG_GAMEPORT is not set
CONFIG_SOUND_GAMEPORT=y
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
# CONFIG_SERIO_SERPORT is not set
# CONFIG_SERIO_CT82C710 is not set

#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
# CONFIG_MOUSE_SERIAL is not set
# CONFIG_MOUSE_INPORT is not set
# CONFIG_MOUSE_LOGIBM is not set
# CONFIG_MOUSE_PC110PAD is not set
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set

#
# Character devices
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
# CONFIG_SERIAL_NONSTANDARD is not set

#
# Serial drivers
#
CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_CONSOLE is not set
# CONFIG_SERIAL_8250_EXTENDED is not set

#
# Non-8250 serial port support
#
CONFIG_SERIAL_CORE=y
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=256

#
# I2C support
#
# CONFIG_I2C is not set

#
# I2C Hardware Sensors Mainboard support
#

#
# I2C Hardware Sensors Chip support
#

#
# Mice
#
# CONFIG_BUSMOUSE is not set
# CONFIG_QIC02_TAPE is not set

#
# Watchdog Cards
#
# CONFIG_WATCHDOG is not set
CONFIG_INTEL_RNG=y
# CONFIG_AMD_RNG is not set
# CONFIG_NVRAM is not set
# CONFIG_RTC is not set
# CONFIG_GEN_RTC is not set
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_SONYPI is not set

#
# Ftape, the floppy tape device driver
#
# CONFIG_FTAPE is not set
CONFIG_AGP=y
# CONFIG_AGP3 is not set
CONFIG_AGP_INTEL=y
CONFIG_AGP_VIA=y
CONFIG_AGP_AMD=y
CONFIG_AGP_SIS=y
CONFIG_AGP_ALI=y
CONFIG_AGP_SWORKS=y
# CONFIG_AGP_AMD_8151 is not set
# CONFIG_DRM is not set
# CONFIG_MWAVE is not set
# CONFIG_RAW_DRIVER is not set

#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set

#
# File systems
#
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
CONFIG_AUTOFS4_FS=y
CONFIG_REISERFS_FS=y
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
CONFIG_EXT3_FS=y
CONFIG_EXT3_FS_XATTR=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
# CONFIG_EFS_FS is not set
# CONFIG_CRAMFS is not set
CONFIG_TMPFS=y
CONFIG_RAMFS=y
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
# CONFIG_ZISOFS is not set
# CONFIG_JFS_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_NTFS_FS is not set
# CONFIG_HPFS_FS is not set
CONFIG_PROC_FS=y
# CONFIG_DEVFS_FS is not set
CONFIG_DEVPTS_FS=y
# CONFIG_QNX4FS_FS is not set
# CONFIG_ROMFS_FS is not set
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
# CONFIG_EXT2_FS_POSIX_ACL is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UDF_FS is not set
# CONFIG_UFS_FS is not set
# CONFIG_XFS_FS is not set

#
# Network File Systems
#
# CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
CONFIG_NFS_FS=y
# CONFIG_NFS_V3 is not set
# CONFIG_NFS_V4 is not set
CONFIG_NFSD=y
# CONFIG_NFSD_V3 is not set
# CONFIG_NFSD_TCP is not set
CONFIG_SUNRPC=y
CONFIG_LOCKD=y
CONFIG_EXPORTFS=y
# CONFIG_CIFS is not set
# CONFIG_SMB_FS is not set
# CONFIG_NCP_FS is not set
# CONFIG_AFS_FS is not set
CONFIG_FS_MBCACHE=y
CONFIG_FS_POSIX_ACL=y

#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
CONFIG_NLS=y

#
# Native Language Support
#
CONFIG_NLS_DEFAULT="iso8859-1"
CONFIG_NLS_CODEPAGE_437=y
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
CONFIG_NLS_ISO8859_1=y
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
# CONFIG_NLS_UTF8 is not set

#
# Graphics support
#
# CONFIG_FB is not set
# CONFIG_VIDEO_SELECT is not set

#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
# CONFIG_MDA_CONSOLE is not set
CONFIG_DUMMY_CONSOLE=y

#
# Sound
#
# CONFIG_SOUND is not set

#
# USB support
#
# CONFIG_USB is not set

#
# Bluetooth support
#
# CONFIG_BT is not set

#
# Profiling support
#
CONFIG_PROFILING=y
CONFIG_OPROFILE=y

#
# Kernel hacking
#
# CONFIG_DEBUG_KERNEL is not set
CONFIG_KALLSYMS=y
CONFIG_DEBUG_SPINLOCK_SLEEP=y
CONFIG_FRAME_POINTER=y
CONFIG_X86_EXTRA_IRQS=y
CONFIG_X86_FIND_SMP_CONFIG=y
CONFIG_X86_MPPARSE=y

#
# Security options
#
# CONFIG_SECURITY is not set

#
# Cryptographic options
#
# CONFIG_CRYPTO is not set

#
# Library routines
#
# CONFIG_CRC32 is not set
CONFIG_X86_SMP=y
CONFIG_X86_HT=y
CONFIG_X86_BIOS_REBOOT=y
CONFIG_X86_TRAMPOLINE=y


2003-01-15 22:24:30

by Andrew Morton

[permalink] [raw]
Subject: Re: 2.5.57 IO slowdown with CONFIG_PREEMPT enabled

Robert Macaulay <[email protected]> wrote:
>
> No change either

OK, thanks. The below patch reverts the spinlocking change,
if you could please test that with CONFIG_PREEMPT=y

>
> I have been hitting an odd issue, and I haven't had a chance to traceback
> to where it came from(versionwise). FS changes seem to be getting rolled
> back at times. For example, I run make menuconfig, add my config options
> for CONFIG_MEGARAID to be built in, and recompile kernel. I install and
> reboot, and that config file, which contained CONFIG_MEGARAID=y, reverts
> back to its original state. multiple syncs seem to keep this in the
> correct state. The filesystem that this is occuring on is ext3, mounted
> with defaults, on a megaraid controller. I'll trace this down later and
> post results.

Suggest that you make sure it's not some strangeness in the kernel build
system which is writing out a modified .config file.



include/linux/spinlock.h | 56 ++++++++++++++---------------------------------
kernel/ksyms.c | 4 ---
kernel/sched.c | 47 ---------------------------------------
3 files changed, 17 insertions(+), 90 deletions(-)

diff -puN include/linux/spinlock.h~preempt-oddity include/linux/spinlock.h
--- 25/include/linux/spinlock.h~preempt-oddity Wed Jan 15 14:28:20 2003
+++ 25-akpm/include/linux/spinlock.h Wed Jan 15 14:28:53 2003
@@ -85,37 +85,31 @@
* regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various
* methods are defined as nops in the case they are not required.
*/
-#define spin_trylock(lock) ({preempt_disable(); _raw_spin_trylock(lock) ? \
- 1 : ({preempt_enable(); 0;});})
+#define spin_lock(lock) \
+do { \
+ preempt_disable(); \
+ _raw_spin_lock(lock); \
+} while(0)

-#define write_trylock(lock) ({preempt_disable();_raw_write_trylock(lock) ? \
+#define spin_trylock(lock) ({preempt_disable(); _raw_spin_trylock(lock) ? \
1 : ({preempt_enable(); 0;});})

-/* Where's read_trylock? */
-
-#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT)
-void __preempt_spin_lock(spinlock_t *lock);
-void __preempt_write_lock(rwlock_t *lock);
-
-#define spin_lock(lock) \
+#define spin_unlock(lock) \
do { \
- preempt_disable(); \
- if (unlikely(!_raw_spin_trylock(lock))) \
- __preempt_spin_lock(lock); \
+ _raw_spin_unlock(lock); \
+ preempt_enable(); \
} while (0)

-#define write_lock(lock) \
+#define read_lock(lock) \
do { \
preempt_disable(); \
- if (unlikely(!_raw_write_trylock(lock))) \
- __preempt_write_lock(lock); \
-} while (0)
+ _raw_read_lock(lock); \
+} while(0)

-#else
-#define spin_lock(lock) \
+#define read_unlock(lock) \
do { \
- preempt_disable(); \
- _raw_spin_lock(lock); \
+ _raw_read_unlock(lock); \
+ preempt_enable(); \
} while(0)

#define write_lock(lock) \
@@ -123,19 +117,6 @@ do { \
preempt_disable(); \
_raw_write_lock(lock); \
} while(0)
-#endif
-
-#define read_lock(lock) \
-do { \
- preempt_disable(); \
- _raw_read_lock(lock); \
-} while(0)
-
-#define spin_unlock(lock) \
-do { \
- _raw_spin_unlock(lock); \
- preempt_enable(); \
-} while (0)

#define write_unlock(lock) \
do { \
@@ -143,11 +124,8 @@ do { \
preempt_enable(); \
} while(0)

-#define read_unlock(lock) \
-do { \
- _raw_read_unlock(lock); \
- preempt_enable(); \
-} while(0)
+#define write_trylock(lock) ({preempt_disable();_raw_write_trylock(lock) ? \
+ 1 : ({preempt_enable(); 0;});})

#define spin_lock_irqsave(lock, flags) \
do { \
diff -puN kernel/sched.c~preempt-oddity kernel/sched.c
--- 25/kernel/sched.c~preempt-oddity Wed Jan 15 14:28:24 2003
+++ 25-akpm/kernel/sched.c Wed Jan 15 14:28:53 2003
@@ -2278,50 +2278,3 @@ void __might_sleep(char *file, int line)
#endif
}
#endif
-
-
-#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT)
-/*
- * This could be a long-held lock. If another CPU holds it for a long time,
- * and that CPU is not asked to reschedule then *this* CPU will spin on the
- * lock for a long time, even if *this* CPU is asked to reschedule.
- *
- * So what we do here, in the slow (contended) path is to spin on the lock by
- * hand while permitting preemption.
- *
- * Called inside preempt_disable().
- */
-void __preempt_spin_lock(spinlock_t *lock)
-{
- if (preempt_count() > 1) {
- _raw_spin_lock(lock);
- return;
- }
-
- while (!_raw_spin_trylock(lock)) {
- if (need_resched()) {
- preempt_enable_no_resched();
- __cond_resched();
- preempt_disable();
- }
- cpu_relax();
- }
-}
-
-void __preempt_write_lock(rwlock_t *lock)
-{
- if (preempt_count() > 1) {
- _raw_write_lock(lock);
- return;
- }
-
- while (!_raw_write_trylock(lock)) {
- if (need_resched()) {
- preempt_enable_no_resched();
- __cond_resched();
- preempt_disable();
- }
- cpu_relax();
- }
-}
-#endif
diff -puN kernel/ksyms.c~preempt-oddity kernel/ksyms.c
--- 25/kernel/ksyms.c~preempt-oddity Wed Jan 15 14:28:30 2003
+++ 25-akpm/kernel/ksyms.c Wed Jan 15 14:28:53 2003
@@ -493,10 +493,6 @@ EXPORT_SYMBOL(do_settimeofday);
#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
EXPORT_SYMBOL(__might_sleep);
#endif
-#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT)
-EXPORT_SYMBOL(__preempt_spin_lock);
-EXPORT_SYMBOL(__preempt_write_lock);
-#endif
#if !defined(__ia64__)
EXPORT_SYMBOL(loops_per_jiffy);
#endif

_

2003-01-15 22:38:14

by Robert Macaulay

[permalink] [raw]
Subject: Re: 2.5.57 IO slowdown with CONFIG_PREEMPT enabled

On Wed, 15 Jan 2003, Andrew Morton wrote:
> Suggest that you make sure it's not some strangeness in the kernel build
> system which is writing out a modified .config file.

Will apply patch, but for the .config issue, the config file is correct
after the build, then I reboot, and it goes back to its original state.



2003-01-15 23:12:17

by Robert Macaulay

[permalink] [raw]
Subject: Re: 2.5.57 IO slowdown with CONFIG_PREEMPT enabled

On Wed, 15 Jan 2003, Andrew Morton wrote:
> OK, thanks.? The below patch reverts the spinlocking change,
> if you could please test that with CONFIG_PREEMPT=y

Reverting that brings the speed back up
2.5.57, preempt on, 8gig RAM
r b swpd free buff cache si so bi bo in cs us sy
id wa
5 1 3624 7832 177824 7413824 0 1 16 8195 156 153 0 48
46 5
8 0 3624 7124 179336 7413612 0 0 0 110510 1317 2014 0 83
10 7
9 1 3624 8112 182552 7409316 0 1 0 109681 1309 1369 0 90
4 6
8 1 3624 8176 185824 7405948 0 0 0 112612 1302 2202 0 75
17 8
10 1 3632 7328 189300 7402564 0 1 0 112160 1352 1764 0 81
12 6

2003-01-16 11:41:14

by Andrew Morton

[permalink] [raw]
Subject: Re: 2.5.57 IO slowdown with CONFIG_PREEMPT enabled

Robert Macaulay <[email protected]> wrote:
>
> On Wed, 15 Jan 2003, Andrew Morton wrote:
> > if you could please test that with CONFIG_PREEMPT=y
>
> Reverting that brings the speed back up

OK. How irritating.

Presumably there's a fairness problem - once a CPU goes in there to start
spinning on the lock, the length of the loop is such that it's easy for
non-holders to zoom in and claim it first. Or something.

Unless another way of solving the problem which that patch solves presents
itself we may need to revert it.

Or not. Should a CONFIG_PREEMPT SMP kernel compromise its latency because of
overused locking??


I'd appreciate it if you could take a closer look at the mysterious
self-reverting .config, please. See if you can work out what is causing it,
tell me how you're rebooting (reboot -f? -fn? Big Red Button?) and whether
the offending file is on the root filesystem, etc.


Thanks.

2003-01-16 16:23:16

by Robert Macaulay

[permalink] [raw]
Subject: Re: 2.5.57 IO slowdown with CONFIG_PREEMPT enabled

On Thu, 16 Jan 2003, Andrew Morton wrote:
> I'd appreciate it if you could take a closer look at the mysterious
> self-reverting .config, please.? See if you can work out what is causing it,
> tell me how you're rebooting (reboot -f?? -fn?? Big Red Button?) and whether
> the offending file is on the root filesystem, etc.

Seemed to vanish with 2.5.58. It was non-root filesystem, with a clean
'reboot' shutdown.

2.5.58 performed the same as 2.5.57 with regards to preemption on, off,
and patched.

r