Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759969AbcJ1NXZ (ORCPT ); Fri, 28 Oct 2016 09:23:25 -0400 Received: from mail-ua0-f195.google.com ([209.85.217.195]:33698 "EHLO mail-ua0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755281AbcJ1NXX (ORCPT ); Fri, 28 Oct 2016 09:23:23 -0400 MIME-Version: 1.0 X-Originating-IP: [2a02:fe0:c130:1430:7e7a:91ff:fe0e:3e2c] In-Reply-To: References: <20161026191810.12275-1-dh.herrmann@gmail.com> <20161026191810.12275-9-dh.herrmann@gmail.com> From: Tom Gundersen Date: Fri, 28 Oct 2016 15:23:02 +0200 Message-ID: Subject: Re: [RFC v1 08/14] bus1: implement peer management context To: Richard Weinberger Cc: David Herrmann , LKML , Andy Lutomirski , Jiri Kosina , Greg KH , Hannes Reinecke , Steven Rostedt , Arnd Bergmann , 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: 3646 Lines: 111 On Fri, Oct 28, 2016 at 3:05 PM, Richard Weinberger wrote: > 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. If debugfs is not enabled it will be ERR_PTR(-ENODEV). >> + 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. bus1_active_activate() changes count from BUS1_ACTIVE_NEW to 0. >> + 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? We are consistently returning the type being freed so we can do foo->bar = bar_free(bar); Just a matter of style though. >> +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