lkml.org 
[lkml]   [2010]   [Sep]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
SubjectRe: [PATCH v3] mmc: add config and runtime option for number of mmcblk minors
From
Hi,

On Sat, Aug 21, 2010 at 6:13 AM, Olof Johansson <olof@lixom.net> wrote:
> The old limit of number of minor numbers per mmcblk device was hardcoded
> at 8. This isn't enough for some of the more elaborate partitioning
> schemes, for example those used by Chrome OS.
>
> Since there might be a bunch of systems out there with static /dev
> contents that relies on the old numbering scheme, let's make it a
> build-time option with the default set to the previous 8.
>
> Also provide a boot/modprobe-time parameter to override the config
> default: mmcblk.perdev_minors.
>
> Signed-off-by: Olof Johansson <olof@lixom.net>
> Cc: Mandeep Baines <msb@chromium.org>
>
> ---
>
> Andrew, sorry for the churn but Mandeep had a couple of good points that
> needed addressing.
>
> Changes since v1:
>        * Runtime override of config default
>        * Better help text
>        * DIV_ROUND_UP for max_devices calculation
>        * Clarify mmcblk device count limitations
>
> Changes since v2 based on feedback from Mandeep Baines:
>        * DIV_ROUND_UP is doing the wrong thing, we'll end up using
>          the last fractional range of minors which we shouldn't.
>        * Documentation/devices.txt update
>        * No need to compute max_devices twice, just do it at runtime.
>        * Permission fix for the module_param -- it's readonly.
>
>  Documentation/devices.txt |    6 ++++++
>  drivers/mmc/card/Kconfig  |   17 +++++++++++++++++
>  drivers/mmc/card/block.c  |   41 ++++++++++++++++++++++++++++++-----------
>  3 files changed, 53 insertions(+), 11 deletions(-)
>
> diff --git a/Documentation/devices.txt b/Documentation/devices.txt
> index 1d83d12..fdf3821 100644
> --- a/Documentation/devices.txt
> +++ b/Documentation/devices.txt
> @@ -2518,6 +2518,12 @@ Your cooperation is appreciated.
>                  8 = /dev/mmcblk1      Second SD/MMC card
>                    ...
>
> +               The start of next SD/MMC card can be configured with
> +               CONFIG_MMC_BLOCK_MINORS, or overridden at boot/modprobe
> +               time using the mmcblk.perdev_minors option. That would
> +               bump the offset between each card to be the configured
> +               value instead of the default 8.
> +
>  179 char       CCube DVXChip-based PCI products
>                  0 = /dev/dvxirq0      First DVX device
>                  1 = /dev/dvxirq1      Second DVX device
> diff --git a/drivers/mmc/card/Kconfig b/drivers/mmc/card/Kconfig
> index 3f2a912..57e4416 100644
> --- a/drivers/mmc/card/Kconfig
> +++ b/drivers/mmc/card/Kconfig
> @@ -14,6 +14,23 @@ config MMC_BLOCK
>          mount the filesystem. Almost everyone wishing MMC support
>          should say Y or M here.
>
> +config MMC_BLOCK_MINORS
> +       int "Number of minors per block device"
> +       range 4 256
> +       default 8
> +       help
> +         Number of minors per block device. One is needed for every
> +         partition on the disk (plus one for the whole disk).
> +
> +         Number of total MMC minors available is 256, so your number
> +         of supported block devices will be limited to 256 divided
> +         by this number.
> +
> +         Default is 8 to be backwards compatible with previous
> +         hardwired device numbering.
> +
> +         If unsure, say 8 here.
> +
>  config MMC_BLOCK_BOUNCE
>        bool "Use bounce buffer for simple hosts"
>        depends on MMC_BLOCK
> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
> index cb9fbc8..ec94f56 100644
> --- a/drivers/mmc/card/block.c
> +++ b/drivers/mmc/card/block.c
> @@ -43,14 +43,26 @@
>  #include "queue.h"
>
>  MODULE_ALIAS("mmc:block");
> +#ifdef MODULE_PARAM_PREFIX
> +#undef MODULE_PARAM_PREFIX
> +#endif
> +#define MODULE_PARAM_PREFIX "mmcblk."
> +
> +
> +/*
> + * The defaults come from config options but can be overriden by module
> + * or bootarg options.
> + */
> +static int perdev_minors = CONFIG_MMC_BLOCK_MINORS;
>
>  /*
> - * max 8 partitions per card
> + * We've only got one major, so number of mmcblk devices is
> + * limited to 256 / number of minors per device.
>  */
> -#define MMC_SHIFT      3
> -#define MMC_NUM_MINORS (256 >> MMC_SHIFT)
> +static int max_devices;
>
> -static DECLARE_BITMAP(dev_use, MMC_NUM_MINORS);
> +/* 256 minors, so at most 256 separate devices */
> +static DECLARE_BITMAP(dev_use, 256);
>
>  /*
>  * There is one mmc_blk_data per slot.
> @@ -66,6 +78,9 @@ struct mmc_blk_data {
>
>  static DEFINE_MUTEX(open_lock);
>
> +module_param(perdev_minors, int, 0444);
> +MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device");
> +
>  static struct mmc_blk_data *mmc_blk_get(struct gendisk *disk)
>  {
>        struct mmc_blk_data *md;
> @@ -87,10 +102,10 @@ static void mmc_blk_put(struct mmc_blk_data *md)
>        md->usage--;
>        if (md->usage == 0) {
>                int devmaj = MAJOR(disk_devt(md->disk));
> -               int devidx = MINOR(disk_devt(md->disk)) >> MMC_SHIFT;
> +               int devidx = MINOR(disk_devt(md->disk)) / perdev_minors;
>
>                if (!devmaj)
> -                       devidx = md->disk->first_minor >> MMC_SHIFT;
> +                       devidx = md->disk->first_minor / perdev_minors;
>
>                blk_cleanup_queue(md->queue.queue);
>
> @@ -482,8 +497,8 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)
>        struct mmc_blk_data *md;
>        int devidx, ret;
>
> -       devidx = find_first_zero_bit(dev_use, MMC_NUM_MINORS);
> -       if (devidx >= MMC_NUM_MINORS)
> +       devidx = find_first_zero_bit(dev_use, max_devices);
> +       if (devidx >= max_devices)
>                return ERR_PTR(-ENOSPC);
>        __set_bit(devidx, dev_use);
>
> @@ -500,7 +515,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)
>         */
>        md->read_only = mmc_blk_readonly(card);
>
> -       md->disk = alloc_disk(1 << MMC_SHIFT);
> +       md->disk = alloc_disk(perdev_minors);
>        if (md->disk == NULL) {
>                ret = -ENOMEM;
>                goto err_kfree;
> @@ -517,7 +532,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)
>        md->queue.data = md;
>
>        md->disk->major = MMC_BLOCK_MAJOR;
> -       md->disk->first_minor = devidx << MMC_SHIFT;
> +       md->disk->first_minor = devidx * perdev_minors;
>        md->disk->fops = &mmc_bdops;
>        md->disk->private_data = md;
>        md->disk->queue = md->queue.queue;
> @@ -593,7 +608,6 @@ static int mmc_blk_probe(struct mmc_card *card)
>  {
>        struct mmc_blk_data *md;
>        int err;
> -
>        char cap_str[10];
>
>        /*
> @@ -683,6 +697,11 @@ static int __init mmc_blk_init(void)
>  {
>        int res;
>
> +       if (perdev_minors != CONFIG_MMC_BLOCK_MINORS)
> +               pr_info("mmcblk: using %d minors per device\n", perdev_minors);
> +
> +       max_devices = 256 / perdev_minors;
> +
>        res = register_blkdev(MMC_BLOCK_MAJOR, "mmc");
>        if (res)
>                goto out;
> --
> 1.5.6.5
>

The patch's purpose is good. As modern sd&mmc is used to host the file
system, the 8 partition limitation is becoming a kind of bottleneck...
But why not just add GENHD_FL_EXT_DEVT flag to allow mmc use extended
partition numbers?

Like this modification?
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 8d2bd24..2e3eeb1 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -557,6 +557,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct
mmc_card *card)
md->disk->private_data = md;
md->disk->queue = md->queue.queue;
md->disk->driverfs_dev = &card->dev;
+ md->disk->flags |= GENHD_FL_EXT_DEVT;

/*
* As discussed on lkml, GENHD_FL_REMOVABLE should:
Best regards,
Lei
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2010-09-08 16:29    [from the cache]
©2003-2011 Jasper Spaans