All of lore.kernel.org
 help / color / mirror / Atom feed
From: Minchan Kim <minchan@kernel.org>
To: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Nitin Gupta <ngupta@vflare.org>,
	linux-kernel@vger.kernel.org,
	Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
Subject: Re: [PATCH 3/8] zram: factor out device reset from reset_store()
Date: Thu, 5 Mar 2015 11:28:09 +0900	[thread overview]
Message-ID: <20150305022809.GC5041@blaptop> (raw)
In-Reply-To: <1425386990-6339-4-git-send-email-sergey.senozhatsky@gmail.com>

On Tue, Mar 03, 2015 at 09:49:45PM +0900, Sergey Senozhatsky wrote:
> Device reset currently consists of two steps:
> a) holding ->bd_mutex we ensure that there are no device users
> (bdev->bd_openers)
> 
> b) and internal part (executed under bdev->bd_mutex and partially
> under zram->init_lock) that resets the device - frees allocated
> memory and returns the device back to its initial (un-init) state.
> 
> Dynamic device removal requires the same amount of work and checks.
> We can reuse internal cleanup part (b) zram_reset_device(), but step (a)
> is done in sysfs ATTR reset_store() handler.
> 
> Rename step (b) from zram_reset_device() to zram_reset_device_internal()

Nitpick:
Usually, we have used double underbar for internal functions(ie, __zram_reset_device).


> and factor out step (a) to zram_reset_device(). Both reset_store() and
> dynamic device removal will use zram_reset_device().
> 
> For readability let's keep them separated.
> 
> Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
> ---
>  drivers/block/zram/zram_drv.c | 135 +++++++++++++++++++++---------------------
>  1 file changed, 67 insertions(+), 68 deletions(-)
> 
> diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
> index 6707b7b..59662dc 100644
> --- a/drivers/block/zram/zram_drv.c
> +++ b/drivers/block/zram/zram_drv.c
> @@ -729,48 +729,6 @@ static void zram_bio_discard(struct zram *zram, u32 index,
>  	}
>  }
>  
> -static void zram_reset_device(struct zram *zram)
> -{
> -	struct zram_meta *meta;
> -	struct zcomp *comp;
> -	u64 disksize;
> -
> -	down_write(&zram->init_lock);
> -
> -	zram->limit_pages = 0;
> -
> -	if (!init_done(zram)) {
> -		up_write(&zram->init_lock);
> -		return;
> -	}
> -
> -	meta = zram->meta;
> -	comp = zram->comp;
> -	disksize = zram->disksize;
> -	/*
> -	 * Refcount will go down to 0 eventually and r/w handler
> -	 * cannot handle further I/O so it will bail out by
> -	 * check zram_meta_get.
> -	 */
> -	zram_meta_put(zram);
> -	/*
> -	 * We want to free zram_meta in process context to avoid
> -	 * deadlock between reclaim path and any other locks.
> -	 */
> -	wait_event(zram->io_done, atomic_read(&zram->refcount) == 0);
> -
> -	/* Reset stats */
> -	memset(&zram->stats, 0, sizeof(zram->stats));
> -	zram->disksize = 0;
> -	zram->max_comp_streams = 1;
> -	set_capacity(zram->disk, 0);
> -
> -	up_write(&zram->init_lock);
> -	/* I/O operation under all of CPU are done so let's free */
> -	zram_meta_free(meta, disksize);
> -	zcomp_destroy(comp);
> -}
> -
>  static ssize_t disksize_store(struct device *dev,
>  		struct device_attribute *attr, const char *buf, size_t len)
>  {
> @@ -829,16 +787,54 @@ out_free_meta:
>  	return err;
>  }
>  
> -static ssize_t reset_store(struct device *dev,
> -		struct device_attribute *attr, const char *buf, size_t len)
> +/* internal device reset part -- cleanup allocated memory and
> + * return back to initial state */
> +static void zram_reset_device_internal(struct zram *zram)
>  {
> -	int ret;
> -	unsigned short do_reset;
> -	struct zram *zram;
> -	struct block_device *bdev;
> +	struct zram_meta *meta;
> +	struct zcomp *comp;
> +	u64 disksize;
>  
> -	zram = dev_to_zram(dev);
> -	bdev = bdget_disk(zram->disk, 0);
> +	down_write(&zram->init_lock);
> +
> +	zram->limit_pages = 0;
> +
> +	if (!init_done(zram)) {
> +		up_write(&zram->init_lock);
> +		return;
> +	}
> +
> +	meta = zram->meta;
> +	comp = zram->comp;
> +	disksize = zram->disksize;
> +	/*
> +	 * Refcount will go down to 0 eventually and r/w handler
> +	 * cannot handle further I/O so it will bail out by
> +	 * check zram_meta_get.
> +	 */
> +	zram_meta_put(zram);
> +	/*
> +	 * We want to free zram_meta in process context to avoid
> +	 * deadlock between reclaim path and any other locks.
> +	 */
> +	wait_event(zram->io_done, atomic_read(&zram->refcount) == 0);
> +
> +	/* Reset stats */
> +	memset(&zram->stats, 0, sizeof(zram->stats));
> +	zram->disksize = 0;
> +	zram->max_comp_streams = 1;
> +	set_capacity(zram->disk, 0);
> +
> +	up_write(&zram->init_lock);
> +	/* I/O operation under all of CPU are done so let's free */
> +	zram_meta_free(meta, disksize);
> +	zcomp_destroy(comp);
> +}
> +
> +static int zram_reset_device(struct zram *zram)
> +{
> +	int ret = 0;
> +	struct block_device *bdev = bdget_disk(zram->disk, 0);
>  
>  	if (!bdev)
>  		return -ENOMEM;
> @@ -850,31 +846,34 @@ static ssize_t reset_store(struct device *dev,
>  		goto out;
>  	}
>  
> -	ret = kstrtou16(buf, 10, &do_reset);
> -	if (ret)
> -		goto out;
> -
> -	if (!do_reset) {
> -		ret = -EINVAL;
> -		goto out;
> -	}
> -
>  	/* Make sure all pending I/O is finished */
>  	fsync_bdev(bdev);
> -	zram_reset_device(zram);
> -
> -	mutex_unlock(&bdev->bd_mutex);
> -	revalidate_disk(zram->disk);
> -	bdput(bdev);
> -
> -	return len;
> -
> +	zram_reset_device_internal(zram);
>  out:
>  	mutex_unlock(&bdev->bd_mutex);
>  	bdput(bdev);
>  	return ret;
>  }
>  
> +static ssize_t reset_store(struct device *dev,
> +		struct device_attribute *attr, const char *buf, size_t len)
> +{
> +	int ret;
> +	unsigned short do_reset;
> +	struct zram *zram;
> +
> +	zram = dev_to_zram(dev);
> +	ret = kstrtou16(buf, 10, &do_reset);
> +	if (ret)
> +		return ret;
> +
> +	if (!do_reset)
> +		return -EINVAL;
> +
> +	ret = zram_reset_device(zram);
> +	return ret ? ret : len;
> +}
> +
>  static void __zram_make_request(struct zram *zram, struct bio *bio)
>  {
>  	int offset, rw;
> @@ -1167,7 +1166,7 @@ static void zram_remove(struct zram *zram)
>  	sysfs_remove_group(&disk_to_dev(zram->disk)->kobj,
>  			&zram_disk_attr_group);
>  
> -	zram_reset_device(zram);
> +	zram_reset_device_internal(zram);
>  	idr_remove(&zram_index_idr, zram->disk->first_minor);
>  	blk_cleanup_queue(zram->disk->queue);
>  	del_gendisk(zram->disk);
> -- 
> 2.3.1.167.g7f4ba4b
> 

-- 
Kind regards,
Minchan Kim

  reply	other threads:[~2015-03-05  2:28 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-03 12:49 [PATCHv3 0/8] introduce dynamic device creation/removal Sergey Senozhatsky
2015-03-03 12:49 ` [PATCH 1/8] zram: cosmetic ZRAM_ATTR_RO code formatting tweak Sergey Senozhatsky
2015-03-03 12:49 ` [PATCH 2/8] zram: use idr instead of `zram_devices' array Sergey Senozhatsky
2015-03-03 22:01   ` Andrew Morton
2015-03-04  0:21     ` Sergey Senozhatsky
2015-03-04  7:06   ` Minchan Kim
2015-03-04  7:34     ` Sergey Senozhatsky
2015-03-04  7:49     ` Sergey Senozhatsky
2015-03-05  0:59       ` Minchan Kim
2015-03-03 12:49 ` [PATCH 3/8] zram: factor out device reset from reset_store() Sergey Senozhatsky
2015-03-05  2:28   ` Minchan Kim [this message]
2015-03-03 12:49 ` [PATCH 4/8] zram: reorganize code layout Sergey Senozhatsky
2015-03-03 12:49 ` [PATCH 5/8] zram: add dynamic device add/remove functionality Sergey Senozhatsky
2015-03-03 22:01   ` Andrew Morton
2015-03-04  0:18     ` Sergey Senozhatsky
2015-03-04  7:10   ` Minchan Kim
2015-03-04  7:29     ` Sergey Senozhatsky
2015-03-04  8:19       ` Sergey Senozhatsky
2015-03-04  8:36         ` Sergey Senozhatsky
2015-03-03 12:49 ` [PATCH 6/8] zram: remove max_num_devices limitation Sergey Senozhatsky
2015-03-03 12:49 ` [PATCH 7/8] zram: report every added and removed device Sergey Senozhatsky
2015-03-03 12:49 ` [PATCH 8/8] zram: trivial: correct flag operations comment Sergey Senozhatsky
2015-04-15 21:37 ` [PATCHv3 0/8] introduce dynamic device creation/removal Andrew Morton
2015-04-15 23:40   ` Minchan Kim
2015-04-16  0:30     ` Sergey Senozhatsky
2015-04-16  0:47   ` Sergey Senozhatsky
  -- strict thread matches above, loose matches on Subject: below --
2015-02-26 14:10 [PATCH " Sergey Senozhatsky
2015-02-26 14:10 ` [PATCH 3/8] zram: factor out device reset from reset_store() Sergey Senozhatsky

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150305022809.GC5041@blaptop \
    --to=minchan@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ngupta@vflare.org \
    --cc=sergey.senozhatsky.work@gmail.com \
    --cc=sergey.senozhatsky@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.