On Thu, Jul 6, 2017 at 1:24 AM, Eric Dumazet <eric.duma...@gmail.com> wrote: > On Wed, 2017-07-05 at 13:50 -0700, Cong Wang wrote: >> We are not allowed to block on the RCU reader side, so can't >> just hold the mutex as before. As a quick fix, convert it to >> a spinlock. >> >> Fixes: d9f1f61c0801 ("tap: Extending tap device create/destroy APIs") >> Reported-by: Christian Borntraeger <borntrae...@de.ibm.com> >> Cc: Sainath Grandhi <sainath.gran...@intel.com> >> Signed-off-by: Cong Wang <xiyou.wangc...@gmail.com> >> --- >> drivers/net/tap.c | 18 +++++++++--------- >> 1 file changed, 9 insertions(+), 9 deletions(-) >> >> diff --git a/drivers/net/tap.c b/drivers/net/tap.c >> index 4d4173d..d88ae3c 100644 >> --- a/drivers/net/tap.c >> +++ b/drivers/net/tap.c >> @@ -106,7 +106,7 @@ struct major_info { >> struct rcu_head rcu; >> dev_t major; >> struct idr minor_idr; >> - struct mutex minor_lock; >> + spinlock_t minor_lock; >> const char *device_name; >> struct list_head next; >> }; >> @@ -416,15 +416,15 @@ int tap_get_minor(dev_t major, struct tap_dev *tap) >> goto unlock; >> } >> >> - mutex_lock(&tap_major->minor_lock); >> - retval = idr_alloc(&tap_major->minor_idr, tap, 1, TAP_NUM_DEVS, >> GFP_KERNEL); > > idr_preload(GFP_KERNEL);
Are you sure we can use GFP_KERNEL? RCU read lock is already taken at this point, so I am afraid we can't do preload here.