#define MACVLAN_HASH_BITS      8
 #define MACVLAN_HASH_SIZE      (1<<MACVLAN_HASH_BITS)
-#define MACVLAN_BC_QUEUE_LEN   1000
+#define MACVLAN_DEFAULT_BC_QUEUE_LEN   1000
 
 #define MACVLAN_F_PASSTHRU     1
 #define MACVLAN_F_ADDRCHANGE   2
        struct list_head        vlans;
        struct sk_buff_head     bc_queue;
        struct work_struct      bc_work;
+       u32                     bc_queue_len_used;
        u32                     flags;
        int                     count;
        struct hlist_head       vlan_source_hash[MACVLAN_HASH_SIZE];
 #define MACVLAN_SKB_CB(__skb) ((struct macvlan_skb_cb *)&((__skb)->cb[0]))
 
 static void macvlan_port_destroy(struct net_device *dev);
+static void update_port_bc_queue_len(struct macvlan_port *port);
 
 static inline bool macvlan_passthru(const struct macvlan_port *port)
 {
        MACVLAN_SKB_CB(nskb)->src = src;
 
        spin_lock(&port->bc_queue.lock);
-       if (skb_queue_len(&port->bc_queue) < MACVLAN_BC_QUEUE_LEN) {
+       if (skb_queue_len(&port->bc_queue) < port->bc_queue_len_used) {
                if (src)
                        dev_hold(src->dev);
                __skb_queue_tail(&port->bc_queue, nskb);
        for (i = 0; i < MACVLAN_HASH_SIZE; i++)
                INIT_HLIST_HEAD(&port->vlan_source_hash[i]);
 
+       port->bc_queue_len_used = 0;
        skb_queue_head_init(&port->bc_queue);
        INIT_WORK(&port->bc_work, macvlan_process_broadcast);
 
                        goto destroy_macvlan_port;
        }
 
+       vlan->bc_queue_len_req = MACVLAN_DEFAULT_BC_QUEUE_LEN;
+       if (data && data[IFLA_MACVLAN_BC_QUEUE_LEN])
+               vlan->bc_queue_len_req = nla_get_u32(data[IFLA_MACVLAN_BC_QUEUE_LEN]);
+
        err = register_netdevice(dev);
        if (err < 0)
                goto destroy_macvlan_port;
                goto unregister_netdev;
 
        list_add_tail_rcu(&vlan->list, &port->vlans);
+       update_port_bc_queue_len(vlan->port);
        netif_stacked_transfer_operstate(lowerdev, dev);
        linkwatch_fire_event(dev);
 
        if (vlan->mode == MACVLAN_MODE_SOURCE)
                macvlan_flush_sources(vlan->port, vlan);
        list_del_rcu(&vlan->list);
+       update_port_bc_queue_len(vlan->port);
        unregister_netdevice_queue(dev, head);
        netdev_upper_dev_unlink(vlan->lowerdev, dev);
 }
                }
                vlan->flags = flags;
        }
+
+       if (data && data[IFLA_MACVLAN_BC_QUEUE_LEN]) {
+               vlan->bc_queue_len_req = nla_get_u32(data[IFLA_MACVLAN_BC_QUEUE_LEN]);
+               update_port_bc_queue_len(vlan->port);
+       }
+
        if (set_mode)
                vlan->mode = mode;
        if (data && data[IFLA_MACVLAN_MACADDR_MODE]) {
                + nla_total_size(2) /* IFLA_MACVLAN_FLAGS */
                + nla_total_size(4) /* IFLA_MACVLAN_MACADDR_COUNT */
                + macvlan_get_size_mac(vlan) /* IFLA_MACVLAN_MACADDR */
+               + nla_total_size(4) /* IFLA_MACVLAN_BC_QUEUE_LEN */
+               + nla_total_size(4) /* IFLA_MACVLAN_BC_QUEUE_LEN_USED */
                );
 }
 
                                const struct net_device *dev)
 {
        struct macvlan_dev *vlan = netdev_priv(dev);
+       struct macvlan_port *port = vlan->port;
        int i;
        struct nlattr *nest;
 
                }
                nla_nest_end(skb, nest);
        }
+       if (nla_put_u32(skb, IFLA_MACVLAN_BC_QUEUE_LEN, vlan->bc_queue_len_req))
+               goto nla_put_failure;
+       if (nla_put_u32(skb, IFLA_MACVLAN_BC_QUEUE_LEN_USED, port->bc_queue_len_used))
+               goto nla_put_failure;
        return 0;
 
 nla_put_failure:
        [IFLA_MACVLAN_MACADDR] = { .type = NLA_BINARY, .len = MAX_ADDR_LEN },
        [IFLA_MACVLAN_MACADDR_DATA] = { .type = NLA_NESTED },
        [IFLA_MACVLAN_MACADDR_COUNT] = { .type = NLA_U32 },
+       [IFLA_MACVLAN_BC_QUEUE_LEN] = { .type = NLA_U32 },
+       [IFLA_MACVLAN_BC_QUEUE_LEN_USED] = { .type = NLA_REJECT },
 };
 
 int macvlan_link_register(struct rtnl_link_ops *ops)
        .priv_size      = sizeof(struct macvlan_dev),
 };
 
+static void update_port_bc_queue_len(struct macvlan_port *port)
+{
+       u32 max_bc_queue_len_req = 0;
+       struct macvlan_dev *vlan;
+
+       list_for_each_entry(vlan, &port->vlans, list) {
+               if (vlan->bc_queue_len_req > max_bc_queue_len_req)
+                       max_bc_queue_len_req = vlan->bc_queue_len_req;
+       }
+       port->bc_queue_len_used = max_bc_queue_len_req;
+}
+
 static int macvlan_device_event(struct notifier_block *unused,
                                unsigned long event, void *ptr)
 {