Revision 43e58856585f8c61e6a4a0f1fd6996d78799a973 authored by Emmanuel Grumbach on 10 November 2011, 00:50:50 UTC, committed by John W. Linville on 11 November 2011, 16:03:24 UTC
When HW RF kill switch is set to kill the radio, our NIC issues an
interrupt after we stop the APM module. When we unload the module,
the driver disables and cleans the interrupts before stopping the
APM. So we have a real interrupt (inta not zero) pending.
When this interrupts pops up the tasklet has already been killed
and we crash.

Here is a logical description of the flow:

disable and clean interrupts
synchronize interrupts
kill the tasklet

stop the APM <<== creates an RF kill interrupt

free_irq <<== somehow our ISR is called here and we crash

Here is the panic message:

[  201.313636] BUG: unable to handle kernel paging request at ffff8800911b7150
[  201.314541] IP: [<ffffffff8106d652>] tasklet_action+0x62/0x130
[  201.315149] PGD 1c06063 PUD db37f067 PMD db408067 PTE 80000000911b7160
[  201.316456] Oops: 0000 [#1] SMP DEBUG_PAGEALLOC
[  201.317324] CPU 1
[  201.317495] Modules linked in: arc4 iwlwifi(-) mac80211 cfg80211 netconsole configfs binfmt_misc i915 drm_kms_helper drm uvcvideo i2c_algo_bit videodev dell_laptop dcdbas intel_agp dell_wmi intel_ips psmouse intel_gtt v4l2_compat_ioctl32 asix usbnet mii serio_raw video sparse_keymap firewire_ohci sdhci_pci sdhci firewire_core e1000e crc_itu_t [last unloaded: configfs]
[  201.323839]
[  201.324015] Pid: 2061, comm: modprobe Not tainted 3.1.0-rc9-wl #4 Dell Inc. Latitude E6410/0667CC
[  201.324736] RIP: 0010:[<ffffffff8106d652>]  [<ffffffff8106d652>] tasklet_action+0x62/0x130
[  201.325128] RSP: 0018:ffff88011bc43ea0  EFLAGS: 00010286
[  201.325338] RAX: ffff88008ae70000 RBX: ffff8800911b7150 RCX: ffff88008ae70028
[  201.325555] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff88008ae70000
[  201.325775] RBP: ffff88011bc43ec0 R08: 0000000000000000 R09: 0000000000000000
[  201.325994] R10: 0000000000000002 R11: 0000000000000001 R12: 0000000000000001
[  201.326212] R13: 0000000000000006 R14: 0000000000000100 R15: ffff88008e259fd8
[  201.326431] FS:  00007f4b90ea9700(0000) GS:ffff88011bc40000(0000) knlGS:0000000000000000
[  201.326657] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[  201.326864] CR2: ffff8800911b7150 CR3: 000000008fd6d000 CR4: 00000000000006e0
[  201.327083] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[  201.327302] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[  201.327521] Process modprobe (pid: 2061, threadinfo ffff88008e258000, task ffff88008ae70000)
[  201.327747] Stack:
[  201.330494]  0000000000000046 0000000000000030 0000000000000001 0000000000000006
[  201.333870]  ffff88011bc43f30 ffffffff8106cd8a ffffffff811e1016 ffff88011bc43f08
[  201.337186]  0000000100000046 ffff88008e259fd8 0000000a10be2160 0000000000000006
[  201.340458] Call Trace:
[  201.342994]  <IRQ>
[  201.345656]  [<ffffffff8106cd8a>] __do_softirq+0xca/0x250
[  201.348185]  [<ffffffff811e1016>] ? pde_put+0x76/0x90
[  201.350730]  [<ffffffff8131aeae>] ? do_raw_spin_unlock+0x5e/0xb0
[  201.353261]  [<ffffffff811e1016>] ? pde_put+0x76/0x90
[  201.355776]  [<ffffffff8163ccfc>] call_softirq+0x1c/0x30
[  201.358287]  [<ffffffff8101531d>] do_softirq+0x9d/0xd0
[  201.360823]  [<ffffffff8106cb05>] irq_exit+0xd5/0xf0
[  201.363330]  [<ffffffff8163d5d6>] do_IRQ+0x66/0xe0
[  201.365819]  [<ffffffff81632673>] common_interrupt+0x73/0x73
[  201.368257]  <EOI>

Cc: <stable@kernel.org> 3.1+
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
1 parent 0ecfe80
Raw File
xen.txt
       Recipe for getting/building/running Xen/ia64 with pv_ops
       --------------------------------------------------------

This recipe describes how to get xen-ia64 source and build it,
and run domU with pv_ops.

============
Requirements
============

  - python
  - mercurial
    it (aka "hg") is an open-source source code
    management software. See the below.
    http://www.selenic.com/mercurial/wiki/
  - git
  - bridge-utils

=================================
Getting and Building Xen and Dom0
=================================

  My environment is;
    Machine  : Tiger4
    Domain0 OS  : RHEL5
    DomainU OS  : RHEL5

 1. Download source
    # hg clone http://xenbits.xensource.com/ext/ia64/xen-unstable.hg
    # cd xen-unstable.hg
    # hg clone http://xenbits.xensource.com/ext/ia64/linux-2.6.18-xen.hg

 2. # make world

 3. # make install-tools

 4. copy kernels and xen
    # cp xen/xen.gz /boot/efi/efi/redhat/
    # cp build-linux-2.6.18-xen_ia64/vmlinux.gz \
      /boot/efi/efi/redhat/vmlinuz-2.6.18.8-xen

 5. make initrd for Dom0/DomU
    # make -C linux-2.6.18-xen.hg ARCH=ia64 modules_install \
      O=$(/bin/pwd)/build-linux-2.6.18-xen_ia64
    # mkinitrd -f /boot/efi/efi/redhat/initrd-2.6.18.8-xen.img \
      2.6.18.8-xen --builtin mptspi --builtin mptbase \
      --builtin mptscsih --builtin uhci-hcd --builtin ohci-hcd \
      --builtin ehci-hcd

================================
Making a disk image for guest OS
================================

 1. make file
    # dd if=/dev/zero of=/root/rhel5.img bs=1M seek=4096 count=0
    # mke2fs -F -j /root/rhel5.img
    # mount -o loop /root/rhel5.img /mnt
    # cp -ax /{dev,var,etc,usr,bin,sbin,lib} /mnt
    # mkdir /mnt/{root,proc,sys,home,tmp}

    Note: You may miss some device files. If so, please create them
    with mknod. Or you can use tar instead of cp.

 2. modify DomU's fstab
    # vi /mnt/etc/fstab
       /dev/xvda1  /            ext3    defaults        1 1
       none        /dev/pts     devpts  gid=5,mode=620  0 0
       none        /dev/shm     tmpfs   defaults        0 0
       none        /proc        proc    defaults        0 0
       none        /sys         sysfs   defaults        0 0

 3. modify inittab
    set runlevel to 3 to avoid X trying to start
    # vi /mnt/etc/inittab
       id:3:initdefault:
    Start a getty on the hvc0 console
       X0:2345:respawn:/sbin/mingetty hvc0
    tty1-6 mingetty can be commented out

 4. add hvc0 into /etc/securetty
    # vi /mnt/etc/securetty (add hvc0)

 5. umount
    # umount /mnt

FYI, virt-manager can also make a disk image for guest OS.
It's GUI tools and easy to make it.

==================
Boot Xen & Domain0
==================

 1. replace elilo
    elilo of RHEL5 can boot Xen and Dom0.
    If you use old elilo (e.g RHEL4), please download from the below
    http://elilo.sourceforge.net/cgi-bin/blosxom
    and copy into /boot/efi/efi/redhat/
    # cp elilo-3.6-ia64.efi /boot/efi/efi/redhat/elilo.efi

 2. modify elilo.conf (like the below)
    # vi /boot/efi/efi/redhat/elilo.conf
     prompt
     timeout=20
     default=xen
     relocatable

     image=vmlinuz-2.6.18.8-xen
             label=xen
             vmm=xen.gz
             initrd=initrd-2.6.18.8-xen.img
             read-only
             append=" -- rhgb root=/dev/sda2"

The append options before "--" are for xen hypervisor,
the options after "--" are for dom0.

FYI, your machine may need console options like
"com1=19200,8n1 console=vga,com1". For example,
append="com1=19200,8n1 console=vga,com1 -- rhgb console=tty0 \
console=ttyS0 root=/dev/sda2"

=====================================
Getting and Building domU with pv_ops
=====================================

 1. get pv_ops tree
    # git clone http://people.valinux.co.jp/~yamahata/xen-ia64/linux-2.6-xen-ia64.git/

 2. git branch (if necessary)
    # cd linux-2.6-xen-ia64/
    # git checkout -b your_branch origin/xen-ia64-domu-minimal-2008may19
    (Note: The current branch is xen-ia64-domu-minimal-2008may19.
    But you would find the new branch. You can see with
    "git branch -r" to get the branch lists.
    http://people.valinux.co.jp/~yamahata/xen-ia64/for_eagl/linux-2.6-ia64-pv-ops.git/
    is also available. The tree is based on
    git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6 test)


 3. copy .config for pv_ops of domU
    # cp arch/ia64/configs/xen_domu_wip_defconfig .config

 4. make kernel with pv_ops
    # make oldconfig
    # make

 5. install the kernel and initrd
    # cp vmlinux.gz /boot/efi/efi/redhat/vmlinuz-2.6-pv_ops-xenU
    # make modules_install
    # mkinitrd -f /boot/efi/efi/redhat/initrd-2.6-pv_ops-xenU.img \
      2.6.26-rc3xen-ia64-08941-g1b12161 --builtin mptspi \
      --builtin mptbase --builtin mptscsih --builtin uhci-hcd \
      --builtin ohci-hcd --builtin ehci-hcd

========================
Boot DomainU with pv_ops
========================

 1. make config of DomU
   # vi /etc/xen/rhel5
     kernel = "/boot/efi/efi/redhat/vmlinuz-2.6-pv_ops-xenU"
     ramdisk = "/boot/efi/efi/redhat/initrd-2.6-pv_ops-xenU.img"
     vcpus = 1
     memory = 512
     name = "rhel5"
     disk = [ 'file:/root/rhel5.img,xvda1,w' ]
     root = "/dev/xvda1 ro"
     extra= "rhgb console=hvc0"

 2. After boot xen and dom0, start xend
   # /etc/init.d/xend start
   ( In the debugging case, # XEND_DEBUG=1 xend trace_start )

 3. start domU
   # xm create -c rhel5

=========
Reference
=========
- Wiki of Xen/IA64 upstream merge
  http://wiki.xensource.com/xenwiki/XenIA64/UpstreamMerge

Written by Akio Takebe <takebe_akio@jp.fujitsu.com> on 28 May 2008
back to top