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    [W:0.041 / U:3.168 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site