Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760324AbcJ1NFL (ORCPT ); Fri, 28 Oct 2016 09:05:11 -0400 Received: from mail-oi0-f65.google.com ([209.85.218.65]:32816 "EHLO mail-oi0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756407AbcJ1NFK (ORCPT ); Fri, 28 Oct 2016 09:05:10 -0400 MIME-Version: 1.0 In-Reply-To: <20161026191810.12275-9-dh.herrmann@gmail.com> References: <20161026191810.12275-1-dh.herrmann@gmail.com> <20161026191810.12275-9-dh.herrmann@gmail.com> From: Richard Weinberger Date: Fri, 28 Oct 2016 15:05:09 +0200 Message-ID: Subject: Re: [RFC v1 08/14] bus1: implement peer management context To: David Herrmann Cc: LKML , Andy Lutomirski , Jiri Kosina , Greg KH , Hannes Reinecke , Steven Rostedt , Arnd Bergmann , Tom Gundersen , Josh Triplett , Linus Torvalds , Andrew Morton Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3208 Lines: 99 On Wed, Oct 26, 2016 at 9:18 PM, David Herrmann wrote: > + /* initialize constant fields */ > + peer->id = atomic64_inc_return(&peer_ids); > + peer->flags = 0; > + peer->cred = get_cred(current_cred()); > + peer->pid_ns = get_pid_ns(task_active_pid_ns(current)); > + peer->user = user; > + peer->debugdir = NULL; > + init_waitqueue_head(&peer->waitq); > + bus1_active_init(&peer->active); > + > + /* initialize data section */ > + mutex_init(&peer->data.lock); > + > + /* initialize peer-private section */ > + mutex_init(&peer->local.lock); > + > + if (!IS_ERR_OR_NULL(bus1_debugdir)) { How can bus1_debugdir contain an error code? AFACT it is either a valid dentry or NULL. > + char idstr[22]; > + > + snprintf(idstr, sizeof(idstr), "peer-%llx", peer->id); > + > + peer->debugdir = debugfs_create_dir(idstr, bus1_debugdir); > + if (!peer->debugdir) { > + pr_err("cannot create debugfs dir for peer %llx\n", > + peer->id); > + } else if (!IS_ERR_OR_NULL(peer->debugdir)) { > + bus1_debugfs_create_atomic_x("active", S_IRUGO, > + peer->debugdir, > + &peer->active.count); > + } > + } > + > + bus1_active_activate(&peer->active); This is a no-nop since bus1_active_init() set ->count to BUS1_ACTIVE_NEW. > + return peer; > +} > + > +static int bus1_peer_disconnect(struct bus1_peer *peer) > +{ > + bus1_active_deactivate(&peer->active); > + bus1_active_drain(&peer->active, &peer->waitq); > + > + if (!bus1_active_cleanup(&peer->active, &peer->waitq, > + NULL, NULL)) > + return -ESHUTDOWN; > + > + return 0; > +} > + > +/** > + * bus1_peer_free() - destroy peer > + * @peer: peer to destroy, or NULL > + * > + * Destroy a peer object that was previously allocated via bus1_peer_new(). > + * This synchronously waits for any outstanding operations on this peer to > + * finish, then releases all linked resources and deallocates the peer in an > + * rcu-delayed manner. > + * > + * If NULL is passed, this is a no-op. > + * > + * Return: NULL is returned. What about making the function of type void? > +struct bus1_peer *bus1_peer_free(struct bus1_peer *peer) > +{ > + if (!peer) > + return NULL; > + > + /* disconnect from environment */ > + bus1_peer_disconnect(peer); > + > + /* deinitialize peer-private section */ > + mutex_destroy(&peer->local.lock); > + > + /* deinitialize data section */ > + mutex_destroy(&peer->data.lock); > + > + /* deinitialize constant fields */ > + debugfs_remove_recursive(peer->debugdir); > + bus1_active_deinit(&peer->active); > + peer->user = bus1_user_unref(peer->user); > + put_pid_ns(peer->pid_ns); > + put_cred(peer->cred); > + kfree_rcu(peer, rcu); > + > + return NULL; > +} -- Thanks, //richard