From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751774AbcGOW3n (ORCPT ); Fri, 15 Jul 2016 18:29:43 -0400 Received: from mga11.intel.com ([192.55.52.93]:39328 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751303AbcGOW3l (ORCPT ); Fri, 15 Jul 2016 18:29:41 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,370,1464678000"; d="scan'208";a="1007761619" Date: Fri, 15 Jul 2016 15:33:57 -0700 From: Bin Gao To: Oliver Neukum Cc: Heikki Krogerus , Greg Kroah-Hartman , linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Bin Gao , Chandra Sekhar Anagani Subject: Re: [PATCH 1/2] usb: typec: Add USB Power Delivery sink port support Message-ID: <20160715223357.GA159605@worksta> References: <20160715021405.GB128987@worksta> <1468564268.2195.10.camel@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1468564268.2195.10.camel@suse.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Jul 15, 2016 at 08:31:08AM +0200, Oliver Neukum wrote: > > +static void ack_message(struct pd_sink_port *port, int msg_id) > > +{ > > + struct pd_msg_header *header = kzalloc(PD_MSG_HEADER_LEN, GFP_KERNEL); > > This must be GFP_NOIO. We are in a cycle that can lead to deadlock. > > Assume we are waiting for a request for more power to process IO > which we need to ack. > > 1. memory allocation leads to laundering, blocks on freeing memory > 2. launderer decides to perform IO which needs more power > 3. more power has already been requested, wait for it to be granted > > 4. BANG - DEADLOCK Agree, I'll change the GFP flag in next revision. > > + struct pd_msg_header *header = kzalloc(PD_MSG_HEADER_LEN + > > + port->nr_ps * PD_OBJ_SIZE, GFP_KERNEL); > > Must be GFP_NOIO. For the same reason as above. We may be asked > this to resolve a mismatch due to needing more power for IO. Yes will do. > > +static void handle_soft_reset(struct pd_sink_port *port) > > +{ > > + struct pd_msg_header *header = kzalloc(PD_MSG_HEADER_LEN, GFP_KERNEL); > > + > > + if (!header) > > + return; > > + > > + flush_workqueue(port->rx_wq); > > That is problematic. We may be here precisely because something is wrong > blocking progress. In particular what happens if another soft reset > is queued? I'm going to remove the workqueue. > > + struct pd_msg_header *header = kzalloc(PD_MSG_HEADER_LEN + > > + PD_OBJ_SIZE, GFP_KERNEL); > > GFP_NOIO, same reasons Yes. > > + > > HTH > Oliver Thanks for your review.