OSDN Git Service

Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Fri, 14 Sep 2007 21:00:35 +0000 (14:00 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Fri, 14 Sep 2007 21:00:35 +0000 (14:00 -0700)
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus:
  [MIPS] 20Kc: Disable use of WAIT instruction.
  [MIPS] Workaround for 4Kc machine check exception
  [MIPS] Malta: Fix off by one bug in interrupt handler.
  [MIPS] No ide_default_io_base() if PCI IDE was not found
  [MIPS] Add #include <linux/profile.h> to arch/mips/kernel/time.c
  [MIPS] N32 needs to use compat_sys_futimesat
  [MIPS] rtlx: Fix build error.
  [MIPS] rtlx: fix int vs. long bug.

14 files changed:
Documentation/kernel-parameters.txt
Documentation/video4linux/cx2341x/fw-encoder-api.txt
block/ll_rw_blk.c
drivers/kvm/kvm.h
drivers/kvm/mmu.c
drivers/md/dm-bio-list.h
drivers/media/video/cx88/cx88-mpeg.c
drivers/media/video/ivtv/ivtv-fileops.c
drivers/media/video/ivtv/ivtv-ioctl.c
drivers/media/video/pwc/pwc-if.c
drivers/media/video/saa7134/saa7134-cards.c
drivers/media/video/saa7191.c
include/media/v4l2-dev.h
net/sunrpc/svcsock.c

index b41cde3..586b6f8 100644 (file)
@@ -1,5 +1,5 @@
-                          Kernel Parameters
-                          ~~~~~~~~~~~~~~~~~
+                         Kernel Parameters
+                         ~~~~~~~~~~~~~~~~~
 
 The following is a consolidated list of the kernel parameters as implemented
 (mostly) by the __setup() macro and sorted into English Dictionary order
@@ -468,9 +468,6 @@ and is between 256 and 4096 characters. It is defined in the file
                        Format:
                        <first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
 
-       cpia_pp=        [HW,PPT]
-                       Format: { parport<nr> | auto | none }
-
        crashkernel=nn[KMG]@ss[KMG]
                        [KNL] Reserve a chunk of physical memory to
                        hold a kernel to switch to with kexec on panic.
@@ -1465,7 +1462,7 @@ and is between 256 and 4096 characters. It is defined in the file
 
        reboot=         [BUGS=X86-32,BUGS=ARM,BUGS=IA-64] Rebooting mode
                        Format: <reboot_mode>[,<reboot_mode2>[,...]]
-                       See arch/*/kernel/reboot.c or arch/*/kernel/process.c                   
+                       See arch/*/kernel/reboot.c or arch/*/kernel/process.c
 
        reserve=        [KNL,BUGS] Force the kernel to ignore some iomem area
 
@@ -1553,12 +1550,12 @@ and is between 256 and 4096 characters. It is defined in the file
 
        selinux_compat_net =
                        [SELINUX] Set initial selinux_compat_net flag value.
-                        Format: { "0" | "1" }
-                        0 -- use new secmark-based packet controls
-                        1 -- use legacy packet controls
-                        Default value is 0 (preferred).
-                        Value can be changed at runtime via
-                        /selinux/compat_net.
+                       Format: { "0" | "1" }
+                       0 -- use new secmark-based packet controls
+                       1 -- use legacy packet controls
+                       Default value is 0 (preferred).
+                       Value can be changed at runtime via
+                       /selinux/compat_net.
 
        serialnumber    [BUGS=X86-32]
 
@@ -1957,7 +1954,7 @@ and is between 256 and 4096 characters. It is defined in the file
        norandmaps      Don't use address space randomization
                        Equivalent to echo 0 > /proc/sys/kernel/randomize_va_space
 
-       unwind_debug=N  N > 0 will enable dwarf2 unwinder debugging
+       unwind_debug=N  N > 0 will enable dwarf2 unwinder debugging
                        This is useful to get more information why
                        you got a "dwarf2 unwinder stuck"
 
index 5dd3109..5a27af2 100644 (file)
@@ -407,8 +407,10 @@ Description
                u32 length;             // Length of this frame
                u32 offset_low;         // Offset in the file of the
                u32 offset_high;        // start of this frame
-               u32 mask1;              // Bits 0-1 are the type mask:
+               u32 mask1;              // Bits 0-2 are the type mask:
                                        // 1=I, 2=P, 4=B
+                                       // 0=End of Program Index, other fields
+                                       //   are invalid.
                u32 pts;                // The PTS of the frame
                u32 mask2;              // Bit 0 is bit 32 of the pts.
        };
index cd20367..ed39313 100644 (file)
@@ -1085,6 +1085,12 @@ void blk_queue_end_tag(struct request_queue *q, struct request *rq)
 
        bqt->tag_index[tag] = NULL;
 
+       /*
+        * We use test_and_clear_bit's memory ordering properties here.
+        * The tag_map bit acts as a lock for tag_index[bit], so we need
+        * a barrer before clearing the bit (precisely: release semantics).
+        * Could use clear_bit_unlock when it is merged.
+        */
        if (unlikely(!test_and_clear_bit(tag, bqt->tag_map))) {
                printk(KERN_ERR "%s: attempt to clear non-busy tag (%d)\n",
                       __FUNCTION__, tag);
@@ -1137,6 +1143,10 @@ int blk_queue_start_tag(struct request_queue *q, struct request *rq)
                        return 1;
 
        } while (test_and_set_bit(tag, bqt->tag_map));
+       /*
+        * We rely on test_and_set_bit providing lock memory ordering semantics
+        * (could use test_and_set_bit_lock when it is merged).
+        */
 
        rq->cmd_flags |= REQ_QUEUED;
        rq->tag = tag;
index 3ac9cbc..336be86 100644 (file)
@@ -619,7 +619,7 @@ unsigned long segment_base(u16 selector);
 void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
                       const u8 *old, const u8 *new, int bytes);
 int kvm_mmu_unprotect_page_virt(struct kvm_vcpu *vcpu, gva_t gva);
-void kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu);
+void __kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu);
 int kvm_mmu_load(struct kvm_vcpu *vcpu);
 void kvm_mmu_unload(struct kvm_vcpu *vcpu);
 
@@ -628,11 +628,15 @@ int kvm_hypercall(struct kvm_vcpu *vcpu, struct kvm_run *run);
 static inline int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t gva,
                                     u32 error_code)
 {
-       if (unlikely(vcpu->kvm->n_free_mmu_pages < KVM_MIN_FREE_MMU_PAGES))
-               kvm_mmu_free_some_pages(vcpu);
        return vcpu->mmu.page_fault(vcpu, gva, error_code);
 }
 
+static inline void kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu)
+{
+       if (unlikely(vcpu->kvm->n_free_mmu_pages < KVM_MIN_FREE_MMU_PAGES))
+               __kvm_mmu_free_some_pages(vcpu);
+}
+
 static inline int kvm_mmu_reload(struct kvm_vcpu *vcpu)
 {
        if (likely(vcpu->mmu.root_hpa != INVALID_PAGE))
index 1a87ba9..23965aa 100644 (file)
@@ -273,12 +273,14 @@ static int mmu_topup_memory_caches(struct kvm_vcpu *vcpu)
        int r;
 
        r = __mmu_topup_memory_caches(vcpu, GFP_NOWAIT);
+       kvm_mmu_free_some_pages(vcpu);
        if (r < 0) {
                spin_unlock(&vcpu->kvm->lock);
                kvm_arch_ops->vcpu_put(vcpu);
                r = __mmu_topup_memory_caches(vcpu, GFP_KERNEL);
                kvm_arch_ops->vcpu_load(vcpu);
                spin_lock(&vcpu->kvm->lock);
+               kvm_mmu_free_some_pages(vcpu);
        }
        return r;
 }
@@ -1208,7 +1210,7 @@ int kvm_mmu_unprotect_page_virt(struct kvm_vcpu *vcpu, gva_t gva)
        return kvm_mmu_unprotect_page(vcpu, gpa >> PAGE_SHIFT);
 }
 
-void kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu)
+void __kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu)
 {
        while (vcpu->kvm->n_free_mmu_pages < KVM_REFILL_PAGES) {
                struct kvm_mmu_page *page;
@@ -1218,7 +1220,6 @@ void kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu)
                kvm_mmu_zap_page(vcpu->kvm, page);
        }
 }
-EXPORT_SYMBOL_GPL(kvm_mmu_free_some_pages);
 
 static void free_mmu_pages(struct kvm_vcpu *vcpu)
 {
index 16ee3b0..3f7b827 100644 (file)
@@ -9,6 +9,8 @@
 
 #include <linux/bio.h>
 
+#ifdef CONFIG_BLOCK
+
 struct bio_list {
        struct bio *head;
        struct bio *tail;
@@ -106,4 +108,5 @@ static inline struct bio *bio_list_get(struct bio_list *bl)
        return bio;
 }
 
+#endif /* CONFIG_BLOCK */
 #endif
index 317a2a3..da7a6b5 100644 (file)
@@ -580,7 +580,7 @@ struct cx8802_dev * cx8802_get_device(struct inode *inode)
 
        list_for_each(list,&cx8802_devlist) {
                h = list_entry(list, struct cx8802_dev, devlist);
-               if (h->mpeg_dev->minor == minor)
+               if (h->mpeg_dev && h->mpeg_dev->minor == minor)
                        return h;
        }
 
index 5dd519c..0285c4a 100644 (file)
@@ -190,7 +190,9 @@ static void ivtv_update_pgm_info(struct ivtv *itv)
                int idx = (itv->pgm_info_write_idx + i) % itv->pgm_info_num;
                struct v4l2_enc_idx_entry *e = itv->pgm_info + idx;
                u32 addr = itv->pgm_info_offset + 4 + idx * 24;
-               const int mapping[] = { V4L2_ENC_IDX_FRAME_P, V4L2_ENC_IDX_FRAME_I, V4L2_ENC_IDX_FRAME_B, 0 };
+               const int mapping[8] = { -1, V4L2_ENC_IDX_FRAME_I, V4L2_ENC_IDX_FRAME_P, -1,
+                       V4L2_ENC_IDX_FRAME_B, -1, -1, -1 };
+                                       // 1=I, 2=P, 4=B
 
                e->offset = read_enc(addr + 4) + ((u64)read_enc(addr + 8) << 32);
                if (e->offset > itv->mpg_data_received) {
@@ -199,7 +201,7 @@ static void ivtv_update_pgm_info(struct ivtv *itv)
                e->offset += itv->vbi_data_inserted;
                e->length = read_enc(addr);
                e->pts = read_enc(addr + 16) + ((u64)(read_enc(addr + 20) & 1) << 32);
-               e->flags = mapping[read_enc(addr + 12) & 3];
+               e->flags = mapping[read_enc(addr + 12) & 7];
                i++;
        }
        itv->pgm_info_write_idx = (itv->pgm_info_write_idx + i) % itv->pgm_info_num;
index 5977a79..dfe0aed 100644 (file)
@@ -1099,14 +1099,21 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
 
        case VIDIOC_G_ENC_INDEX: {
                struct v4l2_enc_idx *idx = arg;
+               struct v4l2_enc_idx_entry *e = idx->entry;
+               int entries;
                int i;
 
-               idx->entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
+               entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
                                        IVTV_MAX_PGM_INDEX;
-               if (idx->entries > V4L2_ENC_IDX_ENTRIES)
-                       idx->entries = V4L2_ENC_IDX_ENTRIES;
-               for (i = 0; i < idx->entries; i++) {
-                       idx->entry[i] = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
+               if (entries > V4L2_ENC_IDX_ENTRIES)
+                       entries = V4L2_ENC_IDX_ENTRIES;
+               idx->entries = 0;
+               for (i = 0; i < entries; i++) {
+                       *e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
+                       if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) {
+                               idx->entries++;
+                               e++;
+                       }
                }
                itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
                break;
index 3d81966..931b274 100644 (file)
@@ -1243,7 +1243,7 @@ static int pwc_video_close(struct inode *inode, struct file *file)
                                PWC_ERROR("Failed to power down camera (%d)\n", i);
                }
                pdev->vopen--;
-               PWC_DEBUG_OPEN("<< video_close() vopen=%d\n", i);
+               PWC_DEBUG_OPEN("<< video_close() vopen=%d\n", pdev->vopen);
        } else {
                pwc_cleanup(pdev);
                /* Free memory (don't set pdev to 0 just yet) */
index 8ec83bd..25ec168 100644 (file)
@@ -1537,18 +1537,18 @@ struct saa7134_board saa7134_boards[] = {
                },{
                        .name = name_comp1,
                        .vmux = 0,
-                       .amux = LINE2,
-                       .gpio = 0x00,
+                       .amux = LINE1,
+                       .gpio = 0x02,
                },{
                        .name = name_comp2,
                        .vmux = 3,
-                       .amux = LINE2,
-                       .gpio = 0x00,
+                       .amux = LINE1,
+                       .gpio = 0x02,
                },{
                        .name = name_svideo,
                        .vmux = 8,
-                       .amux = LINE2,
-                       .gpio = 0x00,
+                       .amux = LINE1,
+                       .gpio = 0x02,
                }},
                .radio = {
                        .name = name_radio,
index 8615a60..b4018cc 100644 (file)
@@ -130,7 +130,7 @@ static int saa7191_write_reg(struct i2c_client *client, u8 reg,
 
 /* the first byte of data must be the first subaddress number (register) */
 static int saa7191_write_block(struct i2c_client *client,
-                              u8 length, u8 *data)
+                              u8 length, const u8 *data)
 {
        int i;
        int ret;
@@ -592,7 +592,7 @@ static int saa7191_attach(struct i2c_adapter *adap, int addr, int kind)
        if (err)
                goto out_free_decoder;
 
-       err = saa7191_write_block(client, sizeof(initseq), (u8 *)initseq);
+       err = saa7191_write_block(client, sizeof(initseq), initseq);
        if (err) {
                printk(KERN_ERR "SAA7191 initialization failed\n");
                goto out_detach_client;
index d62847f..17f8f3a 100644 (file)
@@ -337,6 +337,9 @@ void *priv;
        struct class_device class_dev; /* sysfs */
 };
 
+/* Class-dev to video-device */
+#define to_video_device(cd) container_of(cd, struct video_device, class_dev)
+
 /* Version 2 functions */
 extern int video_register_device(struct video_device *vfd, int type, int nr);
 void video_unregister_device(struct video_device *);
@@ -354,11 +357,9 @@ extern int video_usercopy(struct inode *inode, struct file *file,
                          int (*func)(struct inode *inode, struct file *file,
                                      unsigned int cmd, void *arg));
 
-
 #ifdef CONFIG_VIDEO_V4L1_COMPAT
 #include <linux/mm.h>
 
-#define to_video_device(cd) container_of(cd, struct video_device, class_dev)
 static inline int __must_check
 video_device_create_file(struct video_device *vfd,
                         struct class_device_attribute *attr)
index 12ff5da..1a89992 100644 (file)
@@ -1592,7 +1592,7 @@ svc_age_temp_sockets(unsigned long closure)
 
                if (!test_and_set_bit(SK_OLD, &svsk->sk_flags))
                        continue;
-               if (atomic_read(&svsk->sk_inuse) || test_bit(SK_BUSY, &svsk->sk_flags))
+               if (atomic_read(&svsk->sk_inuse) > 1 || test_bit(SK_BUSY, &svsk->sk_flags))
                        continue;
                atomic_inc(&svsk->sk_inuse);
                list_move(le, &to_be_aged);