23 Aug, 2008

6 commits


29 Jul, 2008

34 commits

  • Linus Torvalds
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus:
    lguest: turn Waker into a thread, not a process
    lguest: Enlarge virtio rings
    lguest: Use GSO/IFF_VNET_HDR extensions on tun/tap
    lguest: Remove 'network: no dma buffer!' warning
    lguest: Adaptive timeout
    lguest: Tell Guest net not to notify us on every packet xmit
    lguest: net block unneeded receive queue update notifications
    lguest: wrap last_avail accesses.
    lguest: use cpu capability accessors
    lguest: virtio-rng support
    lguest: Support assigning a MAC address
    lguest: Don't leak /dev/zero fd
    lguest: fix verbose printing of device features.
    lguest: fix switcher_page leak on unload
    lguest: Guest int3 fix
    lguest: set max_pfn_mapped, growl loudly at Yinghai Lu

    Linus Torvalds
     
  • * 'for-linus' of git://git.o-hand.com/linux-mfd:
    mfd: accept pure device as a parent, not only platform_device
    mfd: add platform_data to mfd_cell
    mfd: Coding style fixes
    mfd: Use to_platform_device instead of container_of

    Linus Torvalds
     
  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6: (21 commits)
    x86/PCI: use dev_printk when possible
    PCI: add D3 power state avoidance quirk
    PCI: fix bogus "'device' may be used uninitialized" warning in pci_slot
    PCI: add an option to allow ASPM enabled forcibly
    PCI: disable ASPM on pre-1.1 PCIe devices
    PCI: disable ASPM per ACPI FADT setting
    PCI MSI: Don't disable MSIs if the mask bit isn't supported
    PCI: handle 64-bit resources better on 32-bit machines
    PCI: rewrite PCI BAR reading code
    PCI: document pci_target_state
    PCI hotplug: fix typo in pcie hotplug output
    x86 gart: replace to_pages macro with iommu_num_pages
    x86, AMD IOMMU: replace to_pages macro with iommu_num_pages
    iommu: add iommu_num_pages helper function
    dma-coherent: add documentation to new interfaces
    Cris: convert to using generic dma-coherent mem allocator
    Sh: use generic per-device coherent dma allocator
    ARM: support generic per-device coherent dma mem
    Generic dma-coherent: fix DMA_MEMORY_EXCLUSIVE
    x86: use generic per-device dma coherent allocator
    ...

    Linus Torvalds
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
    [SCSI] qla2xxx: fix msleep compile error

    Linus Torvalds
     
  • Alexey Dobriyan reported trouble with LTP with the new fast-gup code,
    and Johannes Weiner debugged it to non-page-aligned addresses, where the
    new get_user_pages_fast() code would do all the wrong things, including
    just traversing past the end of the requested area due to 'addr' never
    matching 'end' exactly.

    This is not a pretty fix, and we may actually want to move the alignment
    into generic code, leaving just the core code per-arch, but Alexey
    verified that the vmsplice01 LTP test doesn't crash with this.

    Reported-and-tested-by: Alexey Dobriyan
    Debugged-by: Johannes Weiner
    Cc: Nick Piggin
    Cc: Andrew Morton
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     
  • lguest uses a Waker process to break it out of the kernel (ie.
    actually running the guest) when file descriptor needs attention.

    Changing this from a process to a thread somewhat simplifies things:
    it can directly access the fd_set of things to watch. More
    importantly, it means that the Waker can see Guest memory correctly,
    so /dev/vring file descriptors will work as anticipated (the
    alternative is to actually mmap MAP_SHARED, but you can't do that with
    /dev/zero).

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • With big packets, 128 entries is a little small.

    Guest -> Host 1GB TCP:
    Before: 8.43625 seconds xmit 95640 recv 198266 timeout 49771 usec 1252
    After: 8.01099 seconds xmit 49200 recv 102263 timeout 26014 usec 2118

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • Guest -> Host 1GB TCP:
    Before 20.1974 seconds xmit 214510 recv 5 timeout 214491 usec 278
    After 8.43625 seconds xmit 95640 recv 198266 timeout 49771 usec 1252

    Host -> Guest 1GB TCP:
    Before: Seconds 9.98854 xmit 172166 recv 5344 timeout 172157 usec 251
    After: Seconds 5.72803 xmit 244322 recv 9919 timeout 244302 usec 156

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • This warning can happen a lot under load, and it should be warnx not
    warn anwyay.

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • Since the correct timeout value varies, use a heuristic which adjusts
    the timeout depending on how many packets we've seen. This gives
    slightly worse results, but doesn't need tweaking when GSO is
    introduced.

    500 usec 19.1887 xmit 561141 recv 1 timeout 559657
    Dynamic (278) 20.1974 xmit 214510 recv 5 timeout 214491 usec 278

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • virtio_ring has the ability to suppress notifications. This prevents
    a guest exit for every packet, but we need to set a timer on packet
    receipt to re-check if there were any remaining packets.

    Here are the times for 1G TCP Guest->Host with different timeout
    settings (it matters because the TCP window doesn't grow big enough to
    fill the entire buffer):

    Timeout value Seconds Xmit/Recv/Timeout
    None (before) 25.3784 xmit 7750233 recv 1
    2500 usec 62.5119 xmit 207020 recv 2 timeout 207020
    1000 usec 34.5379 xmit 207003 recv 2 timeout 207003
    750 usec 29.2305 xmit 207002 recv 1 timeout 207002
    500 usec 19.1887 xmit 561141 recv 1 timeout 559657
    250 usec 20.0465 xmit 214128 recv 2 timeout 214110
    100 usec 19.2583 xmit 561621 recv 1 timeout 560153

    (Note that these values are sensitive to the GSO patches which come
    later, and probably other traffic-related variables, so take with a
    large grain of salt).

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • Number of exits transmitting 10GB Guest->Host before:
    network xmit 7858610 recv 118136

    After:
    network xmit 7750233 recv 1

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • To simplify the transition to when we publish indices in the ring
    (and make shuffling my patch queue easier), wrap them in a lg_last_avail()
    macro.

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • To support my little make-x86-bitops-use-proper-typechecking projectlet.

    Cc: Thomas Gleixner
    Cc: Andrea Arcangeli
    Signed-off-by: Andrew Morton
    Acked-by: Ingo Molnar
    Signed-off-by: Rusty Russell

    Andrew Morton
     
  • This is a simple patch to add support for the virtio "hardware random
    generator" to lguest. It gets about 1.2 MB/sec reading from /dev/hwrng
    in the guest.

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • If you've got a nice DHCP configuration which maps MAC
    addresses to specific IP addresses, then you're going to
    want to start your guest with one of those MAC addresses.

    Also, in Fedora, we have persistent network interface naming
    based on the MAC address, so with randomly assigned
    addresses you're soon going to hit eth13. Who knows what
    will happen then!

    Allow assigning a MAC address to the network interface with
    e.g.

    --tunnet=bridge:eth0:00:FF:95:6B:DA:3D

    or:

    --tunnet=192.168.121.1:00:FF:95:6B:DA:3D

    which is pretty unintelligable, but ...

    (includes Rusty's minor rework)

    Signed-off-by: Mark McLoughlin
    Signed-off-by: Rusty Russell

    Mark McLoughlin
     
  • Signed-off-by: Mark McLoughlin
    Signed-off-by: Rusty Russell

    Mark McLoughlin
     
  • %02x is more appropriate for bytes than %08x.

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • map_switcher allocates the array, unmap_switcher has to free it
    accordingly.

    Signed-off-by: Johannes Weiner
    Signed-off-by: Rusty Russell

    Johannes Weiner
     
  • Ron Minnich noticed that guest userspace gets a GPF when it tries to int3:
    we need to copy the privilege level from the guest-supplied IDT to the real
    IDT. int3 is the only common case where guest userspace expects to invoke
    an interrupt, so that's the symptom of failing to do this.

    Signed-off-by: Rusty Russell

    Rusty Russell
     
  • 6af61a7614a306fe882a0c2b4ddc63b65aa66efc 'x86: clean up max_pfn_mapped
    usage - 32-bit' makes the following comment:

    XEN PV and lguest may need to assign max_pfn_mapped too.

    But no CC. Yinghai, wasting fellow developers' time is a VERY bad
    habit. If you do it again, I will hunt you down and try to extract
    the three hours of my life I just lost :)

    Signed-off-by: Rusty Russell
    Cc: Yinghai Lu

    Rusty Russell
     
  • Signed-off-by: Dmitry Baryshkov
    Signed-off-by: Samuel Ortiz

    Dmitry Baryshkov
     
  • arch/x86/mm/pgtable.c: In function 'pgd_mop_up_pmds':
    arch/x86/mm/pgtable.c:194: warning: unused variable 'pmd'

    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrew Morton
     
  • The computed color value is never actually written to hardware
    colormap register.

    Signed-off-by: Manuel Lauss
    Cc: Nobuhiro Iwamatsu
    Cc: Munakata Hisao
    Cc: Paul Mundt
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Manuel Lauss
     
  • With SLUB debugging turned on in 2.6.26, I was getting memory corruption
    when testing eCryptfs. The root cause turned out to be that eCryptfs was
    doing kmalloc(PAGE_CACHE_SIZE); virt_to_page() and treating that as a nice
    page-aligned chunk of memory. But at least with SLUB debugging on, this
    is not always true, and the page we get from virt_to_page does not
    necessarily match the PAGE_CACHE_SIZE worth of memory we got from kmalloc.

    My simple testcase was 2 loops doing "rm -f fileX; cp /tmp/fileX ." for 2
    different multi-megabyte files. With this change I no longer see the
    corruption.

    Signed-off-by: Eric Sandeen
    Acked-by: Michael Halcrow
    Acked-by: Rik van Riel
    Cc: [2.6.25.x, 2.6.26.x]
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Eric Sandeen
     
  • If CONFIG_GENERIC_GPIO=y && CONFIG_GPIO_SYSFS=n, gpio_export() in
    asm-generic/gpio.h refers -ENOSYS and causes build error.

    Signed-off-by: Atsushi Nemoto
    Acked-by: David Brownell
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Atsushi Nemoto
     
  • I got section mismatch message about bio_integrity_init_slab().

    WARNING: fs/built-in.o(__ksymtab+0xb60): Section mismatch in reference from the variable __ksymtab_bio_integrity_init_slab to the function .init.text:bio_integrity_init_slab()

    The symbol bio_integrity_init_slab is exported and annotated __init Fix
    this by removing the __init annotation of bio_integrity_init_slab or drop
    the export.

    It only call from init_bio(). The EXPORT_SYMBOL() can be removed.

    Signed-off-by: Yoichi Yuasa
    Cc: "Martin K. Petersen"
    Cc: Jens Axboe
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Yoichi Yuasa
     
  • When we read some part of a file through pagecache, if there is a
    pagecache of corresponding index but this page is not uptodate, read IO
    is issued and this page will be uptodate.

    I think this is good for pagesize == blocksize environment but there is
    room for improvement on pagesize != blocksize environment. Because in
    this case a page can have multiple buffers and even if a page is not
    uptodate, some buffers can be uptodate.

    So I suggest that when all buffers which correspond to a part of a file
    that we want to read are uptodate, use this pagecache and copy data from
    this pagecache to user buffer even if a page is not uptodate. This can
    reduce read IO and improve system throughput.

    I wrote a benchmark program and got result number with this program.

    This benchmark do:

    1: mount and open a test file.

    2: create a 512MB file.

    3: close a file and umount.

    4: mount and again open a test file.

    5: pwrite randomly 300000 times on a test file. offset is aligned
    by IO size(1024bytes).

    6: measure time of preading randomly 100000 times on a test file.

    The result was:
    2.6.26
    330 sec

    2.6.26-patched
    226 sec

    Arch:i386
    Filesystem:ext3
    Blocksize:1024 bytes
    Memory: 1GB

    On ext3/4, a file is written through buffer/block. So random read/write
    mixed workloads or random read after random write workloads are optimized
    with this patch under pagesize != blocksize environment. This test result
    showed this.

    The benchmark program is as follows:

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define LEN 1024
    #define LOOP 1024*512 /* 512MB */

    main(void)
    {
    unsigned long i, offset, filesize;
    int fd;
    char buf[LEN];
    time_t t1, t2;

    if (mount("/dev/sda1", "/root/test1/", "ext3", 0, 0) < 0) {
    perror("cannot mount\n");
    exit(1);
    }
    memset(buf, 0, LEN);
    fd = open("/root/test1/testfile", O_CREAT|O_RDWR|O_TRUNC);
    if (fd < 0) {
    perror("cannot open file\n");
    exit(1);
    }
    for (i = 0; i < LOOP; i++)
    write(fd, buf, LEN);
    close(fd);
    if (umount("/root/test1/") < 0) {
    perror("cannot umount\n");
    exit(1);
    }
    if (mount("/dev/sda1", "/root/test1/", "ext3", 0, 0) < 0) {
    perror("cannot mount\n");
    exit(1);
    }
    fd = open("/root/test1/testfile", O_RDWR);
    if (fd < 0) {
    perror("cannot open file\n");
    exit(1);
    }

    filesize = LEN * LOOP;
    for (i = 0; i < 300000; i++){
    offset = (random() % filesize) & (~(LEN - 1));
    pwrite(fd, buf, LEN, offset);
    }
    printf("start test\n");
    time(&t1);
    for (i = 0; i < 100000; i++){
    offset = (random() % filesize) & (~(LEN - 1));
    pread(fd, buf, LEN, offset);
    }
    time(&t2);
    printf("%ld sec\n", t2-t1);
    close(fd);
    if (umount("/root/test1/") < 0) {
    perror("cannot umount\n");
    exit(1);
    }
    }

    Signed-off-by: Hisashi Hifumi
    Cc: Nick Piggin
    Cc: Christoph Hellwig
    Cc: Jan Kara
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Hisashi Hifumi
     
  • Signed-off-by: Simon Horman
    Acked-by: Vivek Goyal
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Simon Horman
     
  • The original "Pass the bus number we expect the S3C24XX SPI driver to
    attach to via the platform data." [1] patch was mis-sent, and missed two
    important parts of the diff, which was to actually set the bus_num field
    and add the relevant field to the platform data.

    The previous commit 50f426b55d919dd017af35bb6a08753d1f262920 promised to
    add a bus_num field, but failed to include the two hunks that added this
    field to include/asm-arm/arch-s3c2410/spi.h and then pass it to the spi
    core when creating the new master field in drivers/spi/spi_s3c24xx.c.

    [1] git commit 50f426b55d919dd017af35bb6a08753d1f262920

    Signed-off-by: Ben Dooks
    Signed-off-by: David Brownell
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ben Dooks
     
  • The block transfer routine in the mpc52xx psc spi driver misinterpret
    the datasheet. According to the processor datasheet the chipselect is
    held as long as the EOF is not written.

    Theoretically blocks of any sizes can be transferred in this way. The
    old routine however writes an EOF after every word, which has the size
    of size_of_word. This makes the transfer slow.

    Also fixed some duplicate code.

    Signed-off-by: Luotao Fu
    Signed-off-by: David Brownell
    Cc: [2.6.25.x, 2.6.26.x]
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Luotao Fu
     
  • This patch fixes the following build error on sh caused by commit
    aa888a74977a8f2120ae9332376e179c39a6b07d ("hugetlb: support larger than
    MAX_ORDER"):

    mm/hugetlb.c: In function 'alloc_bootmem_huge_page':
    mm/hugetlb.c:958: error: implicit declaration of function 'virt_to_phys'

    Signed-off-by: Adrian Bunk
    Cc: Hirokazu Takata
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Adrian Bunk
     
  • With KVM/GFP/XPMEM there isn't just the primary CPU MMU pointing to pages.
    There are secondary MMUs (with secondary sptes and secondary tlbs) too.
    sptes in the kvm case are shadow pagetables, but when I say spte in
    mmu-notifier context, I mean "secondary pte". In GRU case there's no
    actual secondary pte and there's only a secondary tlb because the GRU
    secondary MMU has no knowledge about sptes and every secondary tlb miss
    event in the MMU always generates a page fault that has to be resolved by
    the CPU (this is not the case of KVM where the a secondary tlb miss will
    walk sptes in hardware and it will refill the secondary tlb transparently
    to software if the corresponding spte is present). The same way
    zap_page_range has to invalidate the pte before freeing the page, the spte
    (and secondary tlb) must also be invalidated before any page is freed and
    reused.

    Currently we take a page_count pin on every page mapped by sptes, but that
    means the pages can't be swapped whenever they're mapped by any spte
    because they're part of the guest working set. Furthermore a spte unmap
    event can immediately lead to a page to be freed when the pin is released
    (so requiring the same complex and relatively slow tlb_gather smp safe
    logic we have in zap_page_range and that can be avoided completely if the
    spte unmap event doesn't require an unpin of the page previously mapped in
    the secondary MMU).

    The mmu notifiers allow kvm/GRU/XPMEM to attach to the tsk->mm and know
    when the VM is swapping or freeing or doing anything on the primary MMU so
    that the secondary MMU code can drop sptes before the pages are freed,
    avoiding all page pinning and allowing 100% reliable swapping of guest
    physical address space. Furthermore it avoids the code that teardown the
    mappings of the secondary MMU, to implement a logic like tlb_gather in
    zap_page_range that would require many IPI to flush other cpu tlbs, for
    each fixed number of spte unmapped.

    To make an example: if what happens on the primary MMU is a protection
    downgrade (from writeable to wrprotect) the secondary MMU mappings will be
    invalidated, and the next secondary-mmu-page-fault will call
    get_user_pages and trigger a do_wp_page through get_user_pages if it
    called get_user_pages with write=1, and it'll re-establishing an updated
    spte or secondary-tlb-mapping on the copied page. Or it will setup a
    readonly spte or readonly tlb mapping if it's a guest-read, if it calls
    get_user_pages with write=0. This is just an example.

    This allows to map any page pointed by any pte (and in turn visible in the
    primary CPU MMU), into a secondary MMU (be it a pure tlb like GRU, or an
    full MMU with both sptes and secondary-tlb like the shadow-pagetable layer
    with kvm), or a remote DMA in software like XPMEM (hence needing of
    schedule in XPMEM code to send the invalidate to the remote node, while no
    need to schedule in kvm/gru as it's an immediate event like invalidating
    primary-mmu pte).

    At least for KVM without this patch it's impossible to swap guests
    reliably. And having this feature and removing the page pin allows
    several other optimizations that simplify life considerably.

    Dependencies:

    1) mm_take_all_locks() to register the mmu notifier when the whole VM
    isn't doing anything with "mm". This allows mmu notifier users to keep
    track if the VM is in the middle of the invalidate_range_begin/end
    critical section with an atomic counter incraese in range_begin and
    decreased in range_end. No secondary MMU page fault is allowed to map
    any spte or secondary tlb reference, while the VM is in the middle of
    range_begin/end as any page returned by get_user_pages in that critical
    section could later immediately be freed without any further
    ->invalidate_page notification (invalidate_range_begin/end works on
    ranges and ->invalidate_page isn't called immediately before freeing
    the page). To stop all page freeing and pagetable overwrites the
    mmap_sem must be taken in write mode and all other anon_vma/i_mmap
    locks must be taken too.

    2) It'd be a waste to add branches in the VM if nobody could possibly
    run KVM/GRU/XPMEM on the kernel, so mmu notifiers will only enabled if
    CONFIG_KVM=m/y. In the current kernel kvm won't yet take advantage of
    mmu notifiers, but this already allows to compile a KVM external module
    against a kernel with mmu notifiers enabled and from the next pull from
    kvm.git we'll start using them. And GRU/XPMEM will also be able to
    continue the development by enabling KVM=m in their config, until they
    submit all GRU/XPMEM GPLv2 code to the mainline kernel. Then they can
    also enable MMU_NOTIFIERS in the same way KVM does it (even if KVM=n).
    This guarantees nobody selects MMU_NOTIFIER=y if KVM and GRU and XPMEM
    are all =n.

    The mmu_notifier_register call can fail because mm_take_all_locks may be
    interrupted by a signal and return -EINTR. Because mmu_notifier_reigster
    is used when a driver startup, a failure can be gracefully handled. Here
    an example of the change applied to kvm to register the mmu notifiers.
    Usually when a driver startups other allocations are required anyway and
    -ENOMEM failure paths exists already.

    struct kvm *kvm_arch_create_vm(void)
    {
    struct kvm *kvm = kzalloc(sizeof(struct kvm), GFP_KERNEL);
    + int err;

    if (!kvm)
    return ERR_PTR(-ENOMEM);

    INIT_LIST_HEAD(&kvm->arch.active_mmu_pages);

    + kvm->arch.mmu_notifier.ops = &kvm_mmu_notifier_ops;
    + err = mmu_notifier_register(&kvm->arch.mmu_notifier, current->mm);
    + if (err) {
    + kfree(kvm);
    + return ERR_PTR(err);
    + }
    +
    return kvm;
    }

    mmu_notifier_unregister returns void and it's reliable.

    The patch also adds a few needed but missing includes that would prevent
    kernel to compile after these changes on non-x86 archs (x86 didn't need
    them by luck).

    [akpm@linux-foundation.org: coding-style fixes]
    [akpm@linux-foundation.org: fix mm/filemap_xip.c build]
    [akpm@linux-foundation.org: fix mm/mmu_notifier.c build]
    Signed-off-by: Andrea Arcangeli
    Signed-off-by: Nick Piggin
    Signed-off-by: Christoph Lameter
    Cc: Jack Steiner
    Cc: Robin Holt
    Cc: Nick Piggin
    Cc: Peter Zijlstra
    Cc: Kanoj Sarcar
    Cc: Roland Dreier
    Cc: Steve Wise
    Cc: Avi Kivity
    Cc: Hugh Dickins
    Cc: Rusty Russell
    Cc: Anthony Liguori
    Cc: Chris Wright
    Cc: Marcelo Tosatti
    Cc: Eric Dumazet
    Cc: "Paul E. McKenney"
    Cc: Izik Eidus
    Cc: Anthony Liguori
    Cc: Rik van Riel
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrea Arcangeli