From patchwork Sat Aug 20 11:21:03 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Rankin X-Patchwork-Id: 271 Return-path: Envelope-to: mchehab@infradead.org Delivery-date: Sat, 20 Aug 2011 11:25:27 +0000 Received: from casper.infradead.org [85.118.1.10] by gaivota with IMAP (fetchmail-6.3.20) for (single-drop); Sat, 20 Aug 2011 04:50:31 -0700 (PDT) Received: from vger.kernel.org ([209.132.180.67]) by casper.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1Qujg7-0007Kw-C4; Sat, 20 Aug 2011 11:25:27 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752966Ab1HTLVK (ORCPT + 1 other); Sat, 20 Aug 2011 07:21:10 -0400 Received: from nm2.bt.bullet.mail.ukl.yahoo.com ([217.146.183.200]:28777 "HELO nm2.bt.bullet.mail.ukl.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752857Ab1HTLVI (ORCPT ); Sat, 20 Aug 2011 07:21:08 -0400 Received: from [217.146.183.195] by nm2.bt.bullet.mail.ukl.yahoo.com with NNFMP; 20 Aug 2011 11:21:06 -0000 Received: from [217.146.183.206] by tm1.bt.bullet.mail.ukl.yahoo.com with NNFMP; 20 Aug 2011 11:21:06 -0000 Received: from [127.0.0.1] by omp1004.bt.mail.ukl.yahoo.com with NNFMP; 20 Aug 2011 11:21:06 -0000 X-Yahoo-Newman-Id: 562239.53484.bm@omp1004.bt.mail.ukl.yahoo.com Received: (qmail 85911 invoked from network); 20 Aug 2011 11:21:06 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=DKIM-Signature:X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject:References:In-Reply-To:Content-Type; b=jUCAiAieXm2RrdZOz1kzyjSs+UQAJVU9rc4JBynK1VX1e/y+qtXdFtKa+BcOjOig9PG4ANFRD9LH3ghsmb2kfrhJW5UF0RQ/8gkWlWq/x4eZMO9s5Ipn2ZCeax6W9FBTRXDbEEcnhYA4MZO5Bm1TZadqexdEyAx2yEZXVyPvF0U= ; DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1313839266; bh=z7R8Rx48YrcaAoq7yemraHgNrLlYc43N+I3WNUaY/Zk=; h=X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject:References:In-Reply-To:Content-Type; b=z6IxwZVwy/4W1mJr3UmIj0aqtvRXxBTSnoWWrkBw9LLDuxa8Efh2KeRGJYtCzWhEhmkoauoteV5FFehrIdqjlmjkhuk2ne+ztm12tGpd5w4fl/g4MonHZI+5aSjllynAtDxGskc4PrA1oxxR5hcfBbWp1CcRRanmMH+Qoq9X9I8= X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: ZWtbj0AVM1ko447WW6UZbUIZDqJkcBb.0tdpt4CoxIpvKNY 8qlztLz_mYEtzrzKRf7fb.Nz7SOiqj0Qp0xPK_Rc4mbC106dIGhjhKnTUA01 6hPnMT9aIH82qlEXbMkLaevLj_TO5beUYE1kDDSF5W1u7OqVvHuXXCo.gm1T tM8_RVnHqqz2b3.GDFmvy9xKUyKcFkHs7CRWTMBSlje1S6hhZU6o1BEMGgB4 dvxVoJORHw4_fRh5qWZwSD5tYyZ3lJ3GVD_p_2O8tw0crGXlpVv1f2B5I4Oo s7PaeJMlIw8o2OsCL9SC5UuV4M3uXl6nda_Fxr_3GTXngB5Vfwq.qQHn6cU0 ._wsb4MHteKC3RWeAOBUpq7fH2Jg5szhgBH4rIjKDRoheKSqh7Lm_IF5ZRAu Dow-- X-Yahoo-SMTP: dMK34oyswBBlfKesWTI5ovDjFOUFE6shtILt.ZXnUEjQHhWq Received: from wellhouse.underworld (rankincj@86.182.26.38 with login) by smtp824.mail.ukl.yahoo.com with SMTP; 20 Aug 2011 11:21:05 +0000 GMT Received: from volcano.underworld (volcano.underworld [192.168.0.3]) by wellhouse.underworld (8.14.3/8.14.3/Debian-5+lenny1) with ESMTP id p7KBL3e8011456 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Sat, 20 Aug 2011 12:21:05 +0100 Message-ID: <4E4F989F.1020900@yahoo.com> Date: Sat, 20 Aug 2011 12:21:03 +0100 From: Chris Rankin User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20110707 Thunderbird/5.0 MIME-Version: 1.0 To: Mauro Carvalho Chehab CC: Devin Heitmueller , linux-media@vger.kernel.org, Antti Palosaari Subject: [PATCH 3/6] EM28xx - use atomic bit operations for devices-in-use mask References: <4E4D5157.2080406@yahoo.com> <4E4D8DFD.5060800@yahoo.com> <4E4DFA65.4090508@redhat.com> In-Reply-To: <4E4DFA65.4090508@redhat.com> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org Use atomic bit operations for the em28xx_devused mask, to prevent an unlikely race condition should two adapters be plugged in simultaneously. The operations also clearer than explicit bit manipulation anyway. Signed-off-by: Chris Rankin --- linux-3.0/drivers/media/video/em28xx/em28xx-cards.c.orig 2011-08-18 22:24:12.000000000 +0100 +++ linux-3.0/drivers/media/video/em28xx/em28xx-cards.c 2011-08-18 22:22:14.000000000 +0100 @@ -60,7 +60,7 @@ module_param_array(card, int, NULL, 0444); MODULE_PARM_DESC(card, "card type"); -/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */ +/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */ static unsigned long em28xx_devused; struct em28xx_hash_table { @@ -2763,7 +2763,7 @@ usb_put_dev(dev->udev); /* Mark device as unused */ - em28xx_devused &= ~(1 << dev->devno); + clear_bit(dev->devno, &em28xx_devused); }; /* @@ -2967,8 +2967,16 @@ ifnum = interface->altsetting[0].desc.bInterfaceNumber; /* Check to see next free device and mark as used */ - nr = find_first_zero_bit(&em28xx_devused, EM28XX_MAXBOARDS); - em28xx_devused |= 1<= EM28XX_MAXBOARDS) { + /* No free device slots */ + printk(DRIVER_NAME ": Supports only %i em28xx boards.\n", + EM28XX_MAXBOARDS); + retval = -ENOMEM; + goto err_no_slot; + } + } while (test_and_set_bit(nr, &em28xx_devused)); /* Don't register audio interfaces */ if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) { @@ -2979,7 +2987,6 @@ ifnum, interface->altsetting[0].desc.bInterfaceClass); - em28xx_devused &= ~(1<= EM28XX_MAXBOARDS) { - printk(DRIVER_NAME ": Supports only %i em28xx boards.\n", - EM28XX_MAXBOARDS); - em28xx_devused &= ~(1<alt_max_pkt_size == NULL) { em28xx_errdev("out of memory!\n"); - em28xx_devused &= ~(1<lock); retval = em28xx_init_dev(&dev, udev, interface, nr); if (retval) { - em28xx_devused &= ~(1<devno); kfree(dev->alt_max_pkt_size); mutex_unlock(&dev->lock); kfree(dev); @@ -3147,6 +3141,10 @@ return 0; err: + clear_bit(nr, &em28xx_devused); + +err_no_slot: + usb_put_dev(udev); return retval; }