Hey Antonio,

On Thu, Jan 10, 2013 at 04:34:47AM +0200, Antonio Quartulli wrote:
> Hello Simon,
> 
> thanks a lot for taking care of this and sorry for my very late reply..

no problem, thanks for your review!

> 
> 
> Il 31.12.2012 01:40 Simon Wunderlich ha scritto:
> >diff --git a/hard-interface.c b/hard-interface.c
> >index f1d37cd..eb3a12d 100644
> >--- a/hard-interface.c
> >+++ b/hard-interface.c
> >@@ -506,6 +506,17 @@ out:
> >     return NULL;
> > }
> >
> >+static void batadv_hardif_remove_interface_finish(struct
> >work_struct *work)
> >+{
> >+    struct batadv_hard_iface *hard_iface;
> >+
> >+    hard_iface = container_of(work, struct batadv_hard_iface,
> >+                              cleanup_work);
> >+
> >+    batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
> >+    batadv_hardif_free_ref(hard_iface);
> >+}
> >+
> > static void batadv_hardif_remove_interface(struct batadv_hard_iface
> >*hard_iface)
> > {
> >     ASSERT_RTNL();
> >@@ -518,8 +529,9 @@ static void batadv_hardif_remove_interface(struct
> >batadv_hard_iface *hard_iface)
> >             return;
> >
> >     hard_iface->if_status = BATADV_IF_TO_BE_REMOVED;
> >-    batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
> >-    batadv_hardif_free_ref(hard_iface);
> >+    INIT_WORK(&hard_iface->cleanup_work,
> >+              batadv_hardif_remove_interface_finish);
> >+    queue_work(batadv_event_workqueue, &hard_iface->cleanup_work);
> > }
> >
> 
> why do we need to postpone the invocation of
> batadv_hardif_remove_interface_finish() ? Is it also creating a
> possible
> deadlock? As far as I understood only rtnl_lock() would create the
> problem, but it
> is not invoked in batadv_hardif_remove_interface_finish(). It seems
> I am missing
> something?

batadv_hardif_remove_interface() is called by batadv_hard_if_event(),
which is protected rtnl_lock(). You can find an ASSERT_RTNL() there too.
As batadv_hardif_remove_interface() then removes sysfs, this could
be problematic.

> 
> Other than this, remember that the INIT_WORK macro does not need to
> be invoked
> each and every time you want to enqueue the work. It should be
> invoked once only
> (A patch fixing this "issue" for all the delayed works we have in
> the code has
> been recently applied). However it is not a real issue, but we want
> to keep the
> code consistent :)
> 

Well, the work item is actually only initialized once, before taking
the interface down. Then the struct is destroyed, so it can't be called
again. But you are right, for consistency I will move the INIT_WORK
macros to positions where the structs are initialized.

> > int batadv_softif_is_valid(const struct net_device *net_dev)
> >diff --git a/types.h b/types.h
> >index d8061ac..a9800ee 100644
> >--- a/types.h
> >+++ b/types.h
> >@@ -63,6 +63,7 @@ struct batadv_hard_iface {
> >     struct net_device *soft_iface;
> >     struct rcu_head rcu;
> >     struct batadv_hard_iface_bat_iv bat_iv;
> >+    struct work_struct cleanup_work;
> > };
> >
> 
> kernel doc :)
> 

The Mareks kernel doc patch wasn't applied at this time, so I didn't
bother documenting my single new variable, but will do that in the
next revision. :)

Thanks,
        Simon

Attachment: signature.asc
Description: Digital signature

Reply via email to