Re: [Patch] vmbus: Simply hv_get_next_write_location() function

2018-01-25 Thread Tianyu Lan
On Thu, Jan 25, 2018 at 12:37 AM, Stephen Hemminger
 wrote:
> On Wed, 24 Jan 2018 14:21:30 +0800
> lantianyu1...@gmail.com wrote:
>
>> From: Tianyu Lan 
>>
>> The "next" variable is redundant in hv_get_next_write_location().
>> This patch is to remove it and return write_index directly.
>>
>> Signed-off-by: Tianyu Lan 
>> ---
>>  drivers/hv/ring_buffer.c | 4 +---
>>  1 file changed, 1 insertion(+), 3 deletions(-)
>>
>> diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c
>> index 12eb8ca..71558e7 100644
>> --- a/drivers/hv/ring_buffer.c
>> +++ b/drivers/hv/ring_buffer.c
>> @@ -82,9 +82,7 @@ static void hv_signal_on_write(u32 old_write, struct 
>> vmbus_channel *channel)
>>  static inline u32
>>  hv_get_next_write_location(struct hv_ring_buffer_info *ring_info)
>>  {
>> - u32 next = ring_info->ring_buffer->write_index;
>> -
>> - return next;
>> + return ring_info->ring_buffer->write_index;
>>  }
>>
>>  /* Set the next write location for the specified ring buffer. */
>
> Looks good.
> But let's go farther since function is only used in one location in the file
> just eliminate it completely and do simple variable references.
>
> The get/set functions in this file are unnecessary.

Yes, agree and will update patch.

>
> Better still it is possible to replace the lock based ring structure
> with a compare-exchange solution.

There are several read/write operations of ring structure in the
hv_ringbuffer_write()
and these operations should be under protection. Especially for
ring_buffer->write_index,
we need to read it to calculate available write buffer, determine
write position and then update it after
writing buffer. This sequence should be under protection, right?

-- 
Best regards
Tianyu Lan
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2] vmbus/ring_buffer: remove some redundant helper function.

2018-01-25 Thread lantianyu1986
From: Tianyu Lan 

Some hv_get/set** helper functions in ring_buffer code are
only called once or not used. This patch is to clear up these codes.

Signed-off-by: Tianyu Lan 
---
Change since v1:
Clear up more hv_get/set** functions.
---
 drivers/hv/ring_buffer.c | 49 
 1 file changed, 4 insertions(+), 45 deletions(-)

diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c
index 12eb8ca..af3001f 100644
--- a/drivers/hv/ring_buffer.c
+++ b/drivers/hv/ring_buffer.c
@@ -78,46 +78,6 @@ static void hv_signal_on_write(u32 old_write, struct 
vmbus_channel *channel)
vmbus_setevent(channel);
 }
 
-/* Get the next write location for the specified ring buffer. */
-static inline u32
-hv_get_next_write_location(struct hv_ring_buffer_info *ring_info)
-{
-   u32 next = ring_info->ring_buffer->write_index;
-
-   return next;
-}
-
-/* Set the next write location for the specified ring buffer. */
-static inline void
-hv_set_next_write_location(struct hv_ring_buffer_info *ring_info,
-u32 next_write_location)
-{
-   ring_info->ring_buffer->write_index = next_write_location;
-}
-
-/* Set the next read location for the specified ring buffer. */
-static inline void
-hv_set_next_read_location(struct hv_ring_buffer_info *ring_info,
-   u32 next_read_location)
-{
-   ring_info->ring_buffer->read_index = next_read_location;
-   ring_info->priv_read_index = next_read_location;
-}
-
-/* Get the size of the ring buffer. */
-static inline u32
-hv_get_ring_buffersize(const struct hv_ring_buffer_info *ring_info)
-{
-   return ring_info->ring_datasize;
-}
-
-/* Get the read and write indices as u64 of the specified ring buffer. */
-static inline u64
-hv_get_ring_bufferindices(struct hv_ring_buffer_info *ring_info)
-{
-   return (u64)ring_info->ring_buffer->write_index << 32;
-}
-
 /*
  * Helper routine to copy from source to ring buffer.
  * Assume there is enough room. Handles wrap-around in dest case only!!
@@ -129,7 +89,7 @@ static u32 hv_copyto_ringbuffer(
u32 srclen)
 {
void *ring_buffer = hv_get_ring_buffer(ring_info);
-   u32 ring_buffer_size = hv_get_ring_buffersize(ring_info);
+   u32 ring_buffer_size = ring_info->ring_datasize;
 
memcpy(ring_buffer + start_write_offset, src, srclen);
 
@@ -252,8 +212,7 @@ int hv_ringbuffer_write(struct vmbus_channel *channel,
}
 
/* Write to the ring buffer */
-   next_write_location = hv_get_next_write_location(outring_info);
-
+   next_write_location = outring_info->ring_buffer->write_index;
old_write = next_write_location;
 
for (i = 0; i < kv_count; i++) {
@@ -264,7 +223,7 @@ int hv_ringbuffer_write(struct vmbus_channel *channel,
}
 
/* Set previous packet start */
-   prev_indices = hv_get_ring_bufferindices(outring_info);
+   prev_indices = (u64)outring_info->ring_buffer->write_index << 32;
 
next_write_location = hv_copyto_ringbuffer(outring_info,
 next_write_location,
@@ -275,7 +234,7 @@ int hv_ringbuffer_write(struct vmbus_channel *channel,
virt_mb();
 
/* Now, update the write location */
-   hv_set_next_write_location(outring_info, next_write_location);
+   outring_info->ring_buffer->write_index = next_write_location;
 
 
spin_unlock_irqrestore(&outring_info->ring_lock, flags);
-- 
2.7.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v2 char-misc 1/1] Drivers: hv: vmbus: Implement Direct Mode for stimer0

2018-01-25 Thread Greg KH
On Mon, Jan 22, 2018 at 03:29:29PM -0700, mikel...@exchange.microsoft.com wrote:
> +/*
> + * If false, we're using the old mechanism for stimer0 interrupts
> + * where it sends a VMbus message when it expires. The old
> + * mechanism is used if Direct Mode is explicitly disabled
> + * by the module parameter, or on older versions of Hyper-V
> + * that don't support Direct Mode. While Hyper-V provides
> + * four stimer's per CPU, Linux uses only stimer0.
> + */
> +static bool direct_mode_enabled = true;
> +module_param(direct_mode_enabled, bool, 0444);
> +MODULE_PARM_DESC(direct_mode_enabled,
> + "Set to N to disable stimer Direct Mode.");

Ick ick ick.  How is a distro or user supposed to know if/when to enable
this and not to enable it?  This isn't ok, can you please make this
"automatic" to always do the right thing based on what it is running on?

Module parameters are not a good idea as they are impossible to maintain
and document and use over time.  Please never add new ones to the
kernel.

thanks,

greg k-h
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: imx-media-vdic: fix inconsistent IS_ERR and PTR_ERR

2018-01-25 Thread Arnd Bergmann
On Wed, Jan 24, 2018 at 1:43 AM, Gustavo A. R. Silva
 wrote:
> Fix inconsistent IS_ERR and PTR_ERR in vdic_get_ipu_resources.
> The proper pointer to be passed as argument is ch.
>
> This issue was detected with the help of Coccinelle.
>
> Fixes: 0b2e9e7947e7 ("media: staging/imx: remove confusing IS_ERR_OR_NULL 
> usage")
> Signed-off-by: Gustavo A. R. Silva 

good catch!

Acked-by: Arnd Bergmann 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: imx-media-vdic: fix inconsistent IS_ERR and PTR_ERR

2018-01-25 Thread Gustavo A. R. Silva


Quoting Arnd Bergmann :


On Wed, Jan 24, 2018 at 1:43 AM, Gustavo A. R. Silva
 wrote:

Fix inconsistent IS_ERR and PTR_ERR in vdic_get_ipu_resources.
The proper pointer to be passed as argument is ch.

This issue was detected with the help of Coccinelle.

Fixes: 0b2e9e7947e7 ("media: staging/imx: remove confusing  
IS_ERR_OR_NULL usage")

Signed-off-by: Gustavo A. R. Silva 


good catch!



:)


Acked-by: Arnd Bergmann 


Thanks, Arnd.
--
Gustavo




___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v4] staging: lustre: separate a connection destroy from free struct kib_conn

2018-01-25 Thread Dmitry Eremin
The logic of the original commit 4d99b2581eff ("staging: lustre: avoid
intensive reconnecting for ko2iblnd") was assumed conditional free of
struct kib_conn if the second argument free_conn in function
kiblnd_destroy_conn(struct kib_conn *conn, bool free_conn) is true.
But this hunk of code was dropped from original commit. As result the logic
works wrong and current code use struct kib_conn after free.

> drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
> 3317  kiblnd_destroy_conn(conn, !peer);
>    Freed always (but should be conditionally)
> 3318
> 3319  spin_lock_irqsave(lock, flags);
> 3320  if (!peer)
> 3321  continue;
> 3322
> 3323  conn->ibc_peer = peer;
>   ^^ Use after free
> 3324  if (peer->ibp_reconnected < KIB_RECONN_HIGH_RACE)
> 3325  list_add_tail(&conn->ibc_list,
>  ^^ Use after free
> 3326&kiblnd_data.kib_reconn_list);
> 3327  else
> 3328  list_add_tail(&conn->ibc_list,
>  ^^ Use after free
> 3329&kiblnd_data.kib_reconn_wait);

To avoid confusion this fix moved the freeing a struct kib_conn outside of
the function kiblnd_destroy_conn() and free as it was intended in original
commit.

Cc:  # v4.6
Fixes: 4d99b2581eff ("staging: lustre: avoid intensive reconnecting for 
ko2iblnd")
Signed-off-by: Dmitry Eremin 
---
Changes in v4:
- fixed the issue with use after free by moving the freeing a struct
  kib_conn outside of the function kiblnd_destroy_conn()

 drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c| 7 +++
 drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h| 2 +-
 drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c | 6 --
 3 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c 
b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
index 2ebc484385b3..ec84edfda271 100644
--- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
+++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
@@ -824,14 +824,15 @@ struct kib_conn *kiblnd_create_conn(struct kib_peer 
*peer, struct rdma_cm_id *cm
return conn;
 
  failed_2:
-   kiblnd_destroy_conn(conn, true);
+   kiblnd_destroy_conn(conn);
+   kfree(conn);
  failed_1:
kfree(init_qp_attr);
  failed_0:
return NULL;
 }
 
-void kiblnd_destroy_conn(struct kib_conn *conn, bool free_conn)
+void kiblnd_destroy_conn(struct kib_conn *conn)
 {
struct rdma_cm_id *cmid = conn->ibc_cmid;
struct kib_peer *peer = conn->ibc_peer;
@@ -889,8 +890,6 @@ void kiblnd_destroy_conn(struct kib_conn *conn, bool 
free_conn)
rdma_destroy_id(cmid);
atomic_dec(&net->ibn_nconns);
}
-
-   kfree(conn);
 }
 
 int kiblnd_close_peer_conns_locked(struct kib_peer *peer, int why)
diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h 
b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h
index 171eced213f8..b18911d09e9a 100644
--- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h
+++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h
@@ -1016,7 +1016,7 @@ int  kiblnd_close_stale_conns_locked(struct kib_peer 
*peer,
 struct kib_conn *kiblnd_create_conn(struct kib_peer *peer,
struct rdma_cm_id *cmid,
int state, int version);
-void kiblnd_destroy_conn(struct kib_conn *conn, bool free_conn);
+void kiblnd_destroy_conn(struct kib_conn *conn);
 void kiblnd_close_conn(struct kib_conn *conn, int error);
 void kiblnd_close_conn_locked(struct kib_conn *conn, int error);
 
diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c 
b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
index 9b3328c5d1e7..b3e7f28eb978 100644
--- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
+++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
@@ -3314,11 +3314,13 @@ static int kiblnd_resolve_addr(struct rdma_cm_id *cmid,
spin_unlock_irqrestore(lock, flags);
dropped_lock = 1;
 
-   kiblnd_destroy_conn(conn, !peer);
+   kiblnd_destroy_conn(conn);
 
spin_lock_irqsave(lock, flags);
-   if (!peer)
+   if (!peer) {
+   kfree(conn);
continue;
+   }
 
conn->ibc_peer = peer;
if (peer->ibp_reconnected < KIB_RECONN_HIGH_RACE)
-- 
1.8.3.1



Joint Stock Company Intel A/O
Registered legal address: Krylatsky Hills Business Park,
17 Krylatskaya Str., Bldg 4, Moscow 121614,
Russian Federation

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or dis

[PATCH v2] Staging: iio: ade7758: expand buf_lock to cover both buffer and state protection

2018-01-25 Thread Shreeya Patel
iio_dev->mlock is to be used only by the IIO core for protecting
device mode changes between INDIO_DIRECT and INDIO_BUFFER.

This patch replaces the use of mlock with the already established
buf_lock mutex.

Introducing 'unlocked' __ade7758_spi_write_reg_8 and
__ade7758_spi_read_reg_8 functions to be used by ade7758_write_samp_freq
and ade7758_read_samp_freq which avoids nested locks and maintains
atomicity between bus and device frequency changes.

Signed-off-by: Shreeya Patel 
---

Changes in v2
  -Add static keyword to newly introduced functions and remove some
added comments which are not required.


 drivers/staging/iio/meter/ade7758.h  |  2 +-
 drivers/staging/iio/meter/ade7758_core.c | 47 +++-
 2 files changed, 35 insertions(+), 14 deletions(-)

diff --git a/drivers/staging/iio/meter/ade7758.h 
b/drivers/staging/iio/meter/ade7758.h
index 6ae78d8..2de81b5 100644
--- a/drivers/staging/iio/meter/ade7758.h
+++ b/drivers/staging/iio/meter/ade7758.h
@@ -111,7 +111,7 @@
  * @trig:  data ready trigger registered with iio
  * @tx:transmit buffer
  * @rx:receive buffer
- * @buf_lock:  mutex to protect tx and rx
+ * @buf_lock:  mutex to protect tx, rx, read and write frequency
  **/
 struct ade7758_state {
struct spi_device   *us;
diff --git a/drivers/staging/iio/meter/ade7758_core.c 
b/drivers/staging/iio/meter/ade7758_core.c
index 7b7ffe5..fed4684 100644
--- a/drivers/staging/iio/meter/ade7758_core.c
+++ b/drivers/staging/iio/meter/ade7758_core.c
@@ -24,17 +24,25 @@
 #include "meter.h"
 #include "ade7758.h"
 
-int ade7758_spi_write_reg_8(struct device *dev, u8 reg_address, u8 val)
+static int __ade7758_spi_write_reg_8(struct device *dev, u8 reg_address, u8 
val)
 {
-   int ret;
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
struct ade7758_state *st = iio_priv(indio_dev);
 
-   mutex_lock(&st->buf_lock);
st->tx[0] = ADE7758_WRITE_REG(reg_address);
st->tx[1] = val;
 
-   ret = spi_write(st->us, st->tx, 2);
+   return spi_write(st->us, st->tx, 2);
+}
+
+int ade7758_spi_write_reg_8(struct device *dev, u8 reg_address, u8 val)
+{
+   int ret;
+   struct iio_dev *indio_dev = dev_to_iio_dev(dev);
+   struct ade7758_state *st = iio_priv(indio_dev);
+
+   mutex_lock(&st->buf_lock);
+   ret = __ade7758_spi_write_reg_8(dev, reg_address, val);
mutex_unlock(&st->buf_lock);
 
return ret;
@@ -91,7 +99,7 @@ static int ade7758_spi_write_reg_24(struct device *dev, u8 
reg_address,
return ret;
 }
 
-int ade7758_spi_read_reg_8(struct device *dev, u8 reg_address, u8 *val)
+static int __ade7758_spi_read_reg_8(struct device *dev, u8 reg_address, u8 
*val)
 {
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
struct ade7758_state *st = iio_priv(indio_dev);
@@ -111,7 +119,6 @@ int ade7758_spi_read_reg_8(struct device *dev, u8 
reg_address, u8 *val)
},
};
 
-   mutex_lock(&st->buf_lock);
st->tx[0] = ADE7758_READ_REG(reg_address);
st->tx[1] = 0;
 
@@ -124,7 +131,19 @@ int ade7758_spi_read_reg_8(struct device *dev, u8 
reg_address, u8 *val)
*val = st->rx[0];
 
 error_ret:
+   return ret;
+}
+
+int ade7758_spi_read_reg_8(struct device *dev, u8 reg_address, u8 *val)
+{
+   struct iio_dev *indio_dev = dev_to_iio_dev(dev);
+   struct ade7758_state *st = iio_priv(indio_dev);
+   int ret;
+
+   mutex_lock(&st->buf_lock);
+   ret = __ade7758_spi_read_reg_8(dev, reg_address, val);
mutex_unlock(&st->buf_lock);
+
return ret;
 }
 
@@ -470,7 +489,7 @@ static int ade7758_read_samp_freq(struct device *dev, int 
*val)
int ret;
u8 t;
 
-   ret = ade7758_spi_read_reg_8(dev, ADE7758_WAVMODE, &t);
+   ret = __ade7758_spi_read_reg_8(dev, ADE7758_WAVMODE, &t);
if (ret)
return ret;
 
@@ -503,14 +522,14 @@ static int ade7758_write_samp_freq(struct device *dev, 
int val)
goto out;
}
 
-   ret = ade7758_spi_read_reg_8(dev, ADE7758_WAVMODE, ®);
+   ret = __ade7758_spi_read_reg_8(dev, ADE7758_WAVMODE, ®);
if (ret)
goto out;
 
reg &= ~(5 << 3);
reg |= t << 5;
 
-   ret = ade7758_spi_write_reg_8(dev, ADE7758_WAVMODE, reg);
+   ret = __ade7758_spi_write_reg_8(dev, ADE7758_WAVMODE, reg);
 
 out:
return ret;
@@ -523,12 +542,13 @@ static int ade7758_read_raw(struct iio_dev *indio_dev,
long mask)
 {
int ret;
+   struct ade7758_state *st = iio_priv(indio_dev);
 
switch (mask) {
case IIO_CHAN_INFO_SAMP_FREQ:
-   mutex_lock(&indio_dev->mlock);
+   mutex_lock(&st->buf_lock);
ret = ade7758_read_samp_freq(&indio_dev->dev, val);
-   mutex_unlock(&indio_dev->mlock);
+   mutex_unlock(&st->buf_lock);
  

[PATCH] staging: comedi: reformat lines to 80 chars or less

2018-01-25 Thread Eujon Sellers
This is a cleanup patch to fix line length issue found
by checkpatch.pl script.

In this patch, lines 186, 192 and 199 have been wrapped.

Signed-off-by: Eujon Sellers 
Cc: Ian Abbott 
Cc: H Hartley Sweeten 
Cc: Greg Kroah-Hartman 
---
 drivers/staging/comedi/comedidev.h | 12 
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/comedi/comedidev.h 
b/drivers/staging/comedi/comedidev.h
index 8f6d160..f3474a4 100644
--- a/drivers/staging/comedi/comedidev.h
+++ b/drivers/staging/comedi/comedidev.h
@@ -183,17 +183,21 @@ struct comedi_subdevice {
  struct comedi_insn *insn, unsigned int *data);
int (*insn_bits)(struct comedi_device *dev, struct comedi_subdevice *s,
 struct comedi_insn *insn, unsigned int *data);
-   int (*insn_config)(struct comedi_device *dev, struct comedi_subdevice 
*s,
-  struct comedi_insn *insn, unsigned int *data);
+   int (*insn_config)(struct comedi_device *dev,
+  struct comedi_subdevice *s,
+  struct comedi_insn *insn,
+  unsigned int *data);
 
int (*do_cmd)(struct comedi_device *dev, struct comedi_subdevice *s);
-   int (*do_cmdtest)(struct comedi_device *dev, struct comedi_subdevice *s,
+   int (*do_cmdtest)(struct comedi_device *dev,
+ struct comedi_subdevice *s,
  struct comedi_cmd *cmd);
int (*poll)(struct comedi_device *dev, struct comedi_subdevice *s);
int (*cancel)(struct comedi_device *dev, struct comedi_subdevice *s);
 
/* called when the buffer changes */
-   int (*buf_change)(struct comedi_device *dev, struct comedi_subdevice 
*s);
+   int (*buf_change)(struct comedi_device *dev,
+ struct comedi_subdevice *s);
 
void (*munge)(struct comedi_device *dev, struct comedi_subdevice *s,
  void *data, unsigned int num_bytes,
-- 
2.7.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v4] staging: lustre: separate a connection destroy from free struct kib_conn

2018-01-25 Thread Dilger, Andreas
On Jan 25, 2018, at 06:51, Eremin, Dmitry  wrote:
> 
> The logic of the original commit 4d99b2581eff ("staging: lustre: avoid
> intensive reconnecting for ko2iblnd") was assumed conditional free of
> struct kib_conn if the second argument free_conn in function
> kiblnd_destroy_conn(struct kib_conn *conn, bool free_conn) is true.
> But this hunk of code was dropped from original commit. As result the logic
> works wrong and current code use struct kib_conn after free.
> 
>> drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
>> 3317  kiblnd_destroy_conn(conn, !peer);
>>   Freed always (but should be conditionally)
>> 3318
>> 3319  spin_lock_irqsave(lock, flags);
>> 3320  if (!peer)
>> 3321  continue;
>> 3322
>> 3323  conn->ibc_peer = peer;
>>  ^^ Use after free
>> 3324  if (peer->ibp_reconnected < KIB_RECONN_HIGH_RACE)
>> 3325  list_add_tail(&conn->ibc_list,
>> ^^ Use after free
>> 3326&kiblnd_data.kib_reconn_list);
>> 3327  else
>> 3328  list_add_tail(&conn->ibc_list,
>> ^^ Use after free
>> 3329&kiblnd_data.kib_reconn_wait);
> 
> To avoid confusion this fix moved the freeing a struct kib_conn outside of
> the function kiblnd_destroy_conn() and free as it was intended in original
> commit.
> 
> Cc:  # v4.6
> Fixes: 4d99b2581eff ("staging: lustre: avoid intensive reconnecting for 
> ko2iblnd")
> Signed-off-by: Dmitry Eremin 

Reviewed-by: Andreas Dilger 

> ---
> Changes in v4:
>- fixed the issue with use after free by moving the freeing a struct
>  kib_conn outside of the function kiblnd_destroy_conn()
> 
> drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c| 7 +++
> drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h| 2 +-
> drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c | 6 --
> 3 files changed, 8 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c 
> b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
> index 2ebc484385b3..ec84edfda271 100644
> --- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
> +++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
> @@ -824,14 +824,15 @@ struct kib_conn *kiblnd_create_conn(struct kib_peer 
> *peer, struct rdma_cm_id *cm
>   return conn;
> 
>  failed_2:
> - kiblnd_destroy_conn(conn, true);
> + kiblnd_destroy_conn(conn);
> + kfree(conn);
>  failed_1:
>   kfree(init_qp_attr);
>  failed_0:
>   return NULL;
> }
> 
> -void kiblnd_destroy_conn(struct kib_conn *conn, bool free_conn)
> +void kiblnd_destroy_conn(struct kib_conn *conn)
> {
>   struct rdma_cm_id *cmid = conn->ibc_cmid;
>   struct kib_peer *peer = conn->ibc_peer;
> @@ -889,8 +890,6 @@ void kiblnd_destroy_conn(struct kib_conn *conn, bool 
> free_conn)
>   rdma_destroy_id(cmid);
>   atomic_dec(&net->ibn_nconns);
>   }
> -
> - kfree(conn);
> }
> 
> int kiblnd_close_peer_conns_locked(struct kib_peer *peer, int why)
> diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h 
> b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h
> index 171eced213f8..b18911d09e9a 100644
> --- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h
> +++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h
> @@ -1016,7 +1016,7 @@ int  kiblnd_close_stale_conns_locked(struct kib_peer 
> *peer,
> struct kib_conn *kiblnd_create_conn(struct kib_peer *peer,
>   struct rdma_cm_id *cmid,
>   int state, int version);
> -void kiblnd_destroy_conn(struct kib_conn *conn, bool free_conn);
> +void kiblnd_destroy_conn(struct kib_conn *conn);
> void kiblnd_close_conn(struct kib_conn *conn, int error);
> void kiblnd_close_conn_locked(struct kib_conn *conn, int error);
> 
> diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c 
> b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
> index 9b3328c5d1e7..b3e7f28eb978 100644
> --- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
> +++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
> @@ -3314,11 +3314,13 @@ static int kiblnd_resolve_addr(struct rdma_cm_id 
> *cmid,
>   spin_unlock_irqrestore(lock, flags);
>   dropped_lock = 1;
> 
> - kiblnd_destroy_conn(conn, !peer);
> + kiblnd_destroy_conn(conn);
> 
>   spin_lock_irqsave(lock, flags);
> - if (!peer)
> + if (!peer) {
> + kfree(conn);
>   continue;
> + }
> 
>   conn->ibc_peer = peer;
>   if (peer->ibp_reconnected < KIB_RECONN_HIGH_RACE)
> -- 
> 1.8.3.1
> 

Cheers, Andreas
--
Andreas Dilger
Lustre Principal Architect
Intel Corporation








Darlehensangebot

2018-01-25 Thread info
Bist du verschuldet? Willst du deine Schulden bezahlen? Haben Sie Pläne, Ihr 
Geschäft zu erweitern? Möchten Sie sich finanziell ausgestattet machen? Wenn 
ja, dann kontaktieren Sie uns und Sie erhalten das beste finanzielle 
Unterstützung.
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Darlehen Geld für Einzelpersonen und Fachleute in weniger als 72 Stunden

2018-01-25 Thread Klaus Peter
Hallo,

Sind Sie in einer schwierigen Situation, für die Sie sich für ein
Darlehen suchen? Benötigen Sie eine Finanzierung, um eine Schuld zu
begleichen oder eine Aktivität zu finanzieren? Haben Sie einen
Verbraucherkredit, eine Hypothek, einen persönlichen Kredit, eine
Hypothek, Investition Darlehen, Schuldenkonsolidierung Darlehen oder
andere braucht?

Ich bin ein einzelner Investor. I zur Verfügung stellen die Kredit
kurz-, mittel- und langfristige. Ihr Finanzierungsbedingungen sind
sehr einfach und meine Zinssatz beträgt 3% pro Jahr.

Für alle Anfragen, bleibe ich zur Verfügung, um Ihre Fragen zu beantworten.

Danke, dass Sie mir per E-Mail an Sie von  :   klaus.peterschus...@outlook.de

Mit freundlichen Grüßen.

Peter Schuster

Financial Bank
https://firstfinancialsa.com/de
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel