From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751630AbbGaGiO (ORCPT ); Fri, 31 Jul 2015 02:38:14 -0400 Received: from mailout4.samsung.com ([203.254.224.34]:43567 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751256AbbGaGiM (ORCPT ); Fri, 31 Jul 2015 02:38:12 -0400 X-AuditID: cbfee691-f79ca6d00000456a-c8-55bb17d19063 Message-id: <55BB17D0.8000701@samsung.com> Date: Fri, 31 Jul 2015 15:38:08 +0900 From: Chanwoo Choi User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130106 Thunderbird/17.0.2 MIME-version: 1.0 To: Roger Quadros Cc: linux-omap@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 2/2] extcon: Fix extcon_cable_get_state() from getting old state after notification References: <1436194018-18696-1-git-send-email-rogerq@ti.com> <1436194018-18696-3-git-send-email-rogerq@ti.com> In-reply-to: <1436194018-18696-3-git-send-email-rogerq@ti.com> Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpgkeLIzCtJLcpLzFFi42JZI2JSqHtRfHeowdkH7BaXd81hs5i9pJ/F YtGyVmaLnkdaDiwex29sZ/L4vEkugCmKyyYlNSezLLVI3y6BK2P1huqClXwVr6/JNTDO5O5i 5OCQEDCRaDuU3MXICWSKSVy4t56ti5GLQ0hgBaNE659mNoiEicTcO3tYIBKzGCU+zrvBCOE8 YJT4fXg2O0gVr4CWxM2vp1lBbBYBVYmH8w8xgdhsQPH9L26ATRIVCJNYOf0KC0S9oMSPyffA bBEBRYl7K0FWc3AwC0RKTJvlABIWFsiUeN/0FaxVSKBQYuLuGWDjOQXsJC4c/8kIYjML6Ejs b53GBmHLS2xe85YZ4uhF7BL3/uZBnCMg8W3yIRaIh2UlNh2AKpGUOLjiBssERrFZSA6ahWTq LCRTFzAyr2IUTS1ILihOSi8y1StOzC0uzUvXS87P3cQIjJjT/55N3MF4/4D1IUYBDkYlHl7B xbtChVgTy4orcw8xmgJdMZFZSjQ5HxiXeSXxhsZmRhamJqbGRuaWZkrivDrSP4OFBNITS1Kz U1MLUovii0pzUosPMTJxcEo1MNbdWNpt8zSsQVqxt3/1onT9inVCKtNPzb5daycn/MQs8s/u b2q195KKE97I6Prvev5lE6P9m7d/hDhOK4m/S/QSTuOwllsqYnVlylzLn3ZJtq3sss2K3+5c sck7fM9iwimlu4Ktez6UJ1x4V7hdaFvHol6uyUrRFhnbLp4z9gi/FrZ0Vq5zgBJLcUaioRZz UXEiAP3dh++TAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrPIsWRmVeSWpSXmKPExsVy+t9jQd2L4rtDDW60MFtc3jWHzWL2kn4W i0XLWpkteh5pObB4HL+xncnj8ya5AKaoBkabjNTElNQihdS85PyUzLx0WyXv4HjneFMzA0Nd Q0sLcyWFvMTcVFslF58AXbfMHKBFSgpliTmlQKGAxOJiJX07TBNCQ9x0LWAaI3R9Q4LgeowM 0EDCGsaM1RuqC1byVby+JtfAOJO7i5GTQ0LARGLunT0sELaYxIV769m6GLk4hARmMUp8nHeD EcJ5wCjx+/BsdpAqXgEtiZtfT7OC2CwCqhIP5x9iArHZgOL7X9xgA7FFBcIkVk6/wgJRLyjx Y/I9MFtEQFHi3kqQDRwczAKREtNmOYCEhQUyJd43fQVrFRIolJi4ewbYeE4BO4kLx38ygtjM AjoS+1unsUHY8hKb17xlnsAIdCXChllIymYhKVvAyLyKUSK1ILmgOCk91ygvtVyvODG3uDQv XS85P3cTIzgyn0nvYDy8y/0QowAHoxIPr8DiXaFCrIllxZW5hxglOJiVRHjd3gGFeFMSK6tS i/Lji0pzUosPMZoCw2Ais5Rocj4waeSVxBsam5gZWRqZG1oYGZsrifPqm2wKFRJITyxJzU5N LUgtgulj4uCUamD0DXLcbfI97edLt0rpWq6jL2vvynhcme3DJ7f7yJ77893X72H0M7Tuv7va 6JTpTLFZUpdL9U8IipcX+P5QS/h3+3z9yYRpOx9+Ube21A17VK5RV2snYvWn4qLNs9re35rr onc9PHZRY6Hdi4DlVdLLrnMzbLZYzt4be9j0PedSufnOHWpt3k+UWIozEg21mIuKEwEV0jr7 4gIAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Roger, On 07/06/2015 11:46 PM, Roger Quadros wrote: > Currently the extcon code notifiers the interested listeners > before it updates the extcon state with the new state. > This will cause the listeners that use extcon_cable_get_state() > to get the stale state and loose the new state. > > Fix this by first changing the extcon state variable and then > notifying listeners. > > Signed-off-by: Roger Quadros > --- > drivers/extcon/extcon.c | 14 ++++++++++---- > 1 file changed, 10 insertions(+), 4 deletions(-) Applied it. Thanks, Chanwoo Choi > > diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c > index 868c6e2..26d1e1e 100644 > --- a/drivers/extcon/extcon.c > +++ b/drivers/extcon/extcon.c > @@ -275,19 +275,25 @@ int extcon_update_state(struct extcon_dev *edev, u32 mask, u32 state) > spin_lock_irqsave(&edev->lock, flags); > > if (edev->state != ((edev->state & ~mask) | (state & mask))) { > + u32 old_state; > + > if (check_mutually_exclusive(edev, (edev->state & ~mask) | > (state & mask))) { > spin_unlock_irqrestore(&edev->lock, flags); > return -EPERM; > } > > + old_state = edev->state; > + edev->state &= ~mask; > + edev->state |= state & mask; > + > for (index = 0; index < edev->max_supported; index++) { > - if (is_extcon_changed(edev->state, state, index, &attached)) > - raw_notifier_call_chain(&edev->nh[index], attached, edev); > + if (is_extcon_changed(old_state, edev->state, index, > + &attached)) > + raw_notifier_call_chain(&edev->nh[index], > + attached, edev); > } > > - edev->state &= ~mask; > - edev->state |= state & mask; > > /* This could be in interrupt handler */ > prop_buf = (char *)get_zeroed_page(GFP_ATOMIC); >