Merge branch 'for-2.6.25' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus...
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Fri, 8 Feb 2008 17:31:42 +0000 (09:31 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Fri, 8 Feb 2008 17:31:42 +0000 (09:31 -0800)
* 'for-2.6.25' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc:
  [POWERPC] Add arch-specific walk_memory_remove() for 64-bit powerpc
  [POWERPC] Enable hotplug memory remove for 64-bit powerpc
  [POWERPC] Add remove_memory() for 64-bit powerpc
  [POWERPC] Make cell IOMMU fixed mapping printk more useful
  [POWERPC] Fix potential cell IOMMU bug when switching back to default DMA ops
  [POWERPC] Don't enable cell IOMMU fixed mapping if there are no dma-ranges
  [POWERPC] Fix cell IOMMU null pointer explosion on old firmwares
  [POWERPC] spufs: Fix timing dependent false return from spufs_run_spu
  [POWERPC] spufs: No need to have a runnable SPU for libassist update
  [POWERPC] spufs: Update SPU_Status[CISHP] in backing runcntl write
  [POWERPC] spufs: Fix state_mutex leaks
  [POWERPC] Disable G5 NAP mode during SMU commands on U3

1  2 
arch/powerpc/platforms/cell/spufs/file.c

index e393144d533dcf06f988fe841c8a8b527569973a,e4ab9d5a86f003040a7ce2f76f37a33c0555e8a5..c66c3756970d53d52ae56df931e38219a9e79ade
@@@ -358,6 -358,7 +358,7 @@@ static unsigned long spufs_ps_nopfn(str
  {
        struct spu_context *ctx = vma->vm_file->private_data;
        unsigned long area, offset = address - vma->vm_start;
+       int ret = 0;
  
        spu_context_nospu_trace(spufs_ps_nopfn__enter, ctx);
  
        if (ctx->state == SPU_STATE_SAVED) {
                up_read(&current->mm->mmap_sem);
                spu_context_nospu_trace(spufs_ps_nopfn__sleep, ctx);
-               spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE);
+               ret = spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE);
                spu_context_trace(spufs_ps_nopfn__wake, ctx, ctx->spu);
                down_read(&current->mm->mmap_sem);
        } else {
                spu_context_trace(spufs_ps_nopfn__insert, ctx, ctx->spu);
        }
  
-       spu_release(ctx);
+       if (!ret)
+               spu_release(ctx);
        return NOPFN_REFAULT;
  }
  
@@@ -460,7 -462,7 +462,7 @@@ static int spufs_cntl_open(struct inod
        if (!i->i_openers++)
                ctx->cntl = inode->i_mapping;
        mutex_unlock(&ctx->mapping_lock);
 -      return spufs_attr_open(inode, file, spufs_cntl_get,
 +      return simple_attr_open(inode, file, spufs_cntl_get,
                                        spufs_cntl_set, "0x%08lx");
  }
  
@@@ -470,7 -472,7 +472,7 @@@ spufs_cntl_release(struct inode *inode
        struct spufs_inode_info *i = SPUFS_I(inode);
        struct spu_context *ctx = i->i_ctx;
  
 -      spufs_attr_release(inode, file);
 +      simple_attr_release(inode, file);
  
        mutex_lock(&ctx->mapping_lock);
        if (!--i->i_openers)
  static const struct file_operations spufs_cntl_fops = {
        .open = spufs_cntl_open,
        .release = spufs_cntl_release,
 -      .read = spufs_attr_read,
 -      .write = spufs_attr_write,
 +      .read = simple_attr_read,
 +      .write = simple_attr_write,
        .mmap = spufs_cntl_mmap,
  };
  
@@@ -755,23 -757,25 +757,25 @@@ static ssize_t spufs_ibox_read(struct f
  
        count = spu_acquire(ctx);
        if (count)
-               return count;
+               goto out;
  
        /* wait only for the first element */
        count = 0;
        if (file->f_flags & O_NONBLOCK) {
-               if (!spu_ibox_read(ctx, &ibox_data))
+               if (!spu_ibox_read(ctx, &ibox_data)) {
                        count = -EAGAIN;
+                       goto out_unlock;
+               }
        } else {
                count = spufs_wait(ctx->ibox_wq, spu_ibox_read(ctx, &ibox_data));
+               if (count)
+                       goto out;
        }
-       if (count)
-               goto out;
  
        /* if we can't write at all, return -EFAULT */
        count = __put_user(ibox_data, udata);
        if (count)
-               goto out;
+               goto out_unlock;
  
        for (count = 4, udata++; (count + 4) <= len; count += 4, udata++) {
                int ret;
                        break;
        }
  
- out:
+ out_unlock:
        spu_release(ctx);
+ out:
        return count;
  }
  
@@@ -905,7 -909,7 +909,7 @@@ static ssize_t spufs_wbox_write(struct 
  
        count = spu_acquire(ctx);
        if (count)
-               return count;
+               goto out;
  
        /*
         * make sure we can at least write one element, by waiting
         */
        count = 0;
        if (file->f_flags & O_NONBLOCK) {
-               if (!spu_wbox_write(ctx, wbox_data))
+               if (!spu_wbox_write(ctx, wbox_data)) {
                        count = -EAGAIN;
+                       goto out_unlock;
+               }
        } else {
                count = spufs_wait(ctx->wbox_wq, spu_wbox_write(ctx, wbox_data));
+               if (count)
+                       goto out;
        }
  
-       if (count)
-               goto out;
  
        /* write as much as possible */
        for (count = 4, udata++; (count + 4) <= len; count += 4, udata++) {
                        break;
        }
  
- out:
+ out_unlock:
        spu_release(ctx);
+ out:
        return count;
  }
  
@@@ -1598,12 -1605,11 +1605,11 @@@ static ssize_t spufs_mfc_read(struct fi
        } else {
                ret = spufs_wait(ctx->mfc_wq,
                           spufs_read_mfc_tagstatus(ctx, &status));
+               if (ret)
+                       goto out;
        }
        spu_release(ctx);
  
-       if (ret)
-               goto out;
        ret = 4;
        if (copy_to_user(buffer, &status, 4))
                ret = -EFAULT;
@@@ -1732,6 -1738,8 +1738,8 @@@ static ssize_t spufs_mfc_write(struct f
                int status;
                ret = spufs_wait(ctx->mfc_wq,
                                 spu_send_mfc_command(ctx, cmd, &status));
+               if (ret)
+                       goto out;
                if (status)
                        ret = status;
        }
@@@ -1785,7 -1793,7 +1793,7 @@@ static int spufs_mfc_flush(struct file 
  
        ret = spu_acquire(ctx);
        if (ret)
-               return ret;
+               goto out;
  #if 0
  /* this currently hangs */
        ret = spufs_wait(ctx->mfc_wq,
                goto out;
        ret = spufs_wait(ctx->mfc_wq,
                         ctx->ops->read_mfc_tagstatus(ctx) == ctx->tagwait);
- out:
+       if (ret)
+               goto out;
  #else
        ret = 0;
  #endif
        spu_release(ctx);
+ out:
        return ret;
  }