linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints
@ 2023-02-09 12:53 Jon Hunter
  2023-02-09 12:53 ` [PATCH V3 2/2] usb: gadget: u_ether: Don't warn in gether_setup_name_default() Jon Hunter
  2023-02-13 13:49 ` [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints Andrzej Pietrasiewicz
  0 siblings, 2 replies; 7+ messages in thread
From: Jon Hunter @ 2023-02-09 12:53 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: linux-usb, linux-kernel, linux-tegra, Andrzej Pietrasiewicz, Jon Hunter

The USB ethernet gadget driver implements its own print macros which
call printk. Device drivers should use the device prints that print the
device name. Fortunately, the same macro names are defined in the header
file 'linux/usb/composite.h' and these use the device prints. Therefore,
remove the local definitions in the USB ethernet gadget driver and use
those in 'linux/usb/composite.h'. The only difference is that now the
device name is printed instead of the ethernet interface name.

Tested using ethernet gadget on Jetson AGX Orin.

Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Tested-by: Jon Hunter <jonathanh@nvidia.com>
---
V3: Added this patch and dropped the patch in V2 that improved some of
    the prints.

 drivers/usb/gadget/function/u_ether.c | 36 +--------------------------
 1 file changed, 1 insertion(+), 35 deletions(-)

diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
index 8f12f3f8f6ee..740331882e8d 100644
--- a/drivers/usb/gadget/function/u_ether.c
+++ b/drivers/usb/gadget/function/u_ether.c
@@ -17,6 +17,7 @@
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
 #include <linux/if_vlan.h>
+#include <linux/usb/composite.h>
 
 #include "u_ether.h"
 
@@ -103,41 +104,6 @@ static inline int qlen(struct usb_gadget *gadget, unsigned qmult)
 
 /*-------------------------------------------------------------------------*/
 
-/* REVISIT there must be a better way than having two sets
- * of debug calls ...
- */
-
-#undef DBG
-#undef VDBG
-#undef ERROR
-#undef INFO
-
-#define xprintk(d, level, fmt, args...) \
-	printk(level "%s: " fmt , (d)->net->name , ## args)
-
-#ifdef DEBUG
-#undef DEBUG
-#define DBG(dev, fmt, args...) \
-	xprintk(dev , KERN_DEBUG , fmt , ## args)
-#else
-#define DBG(dev, fmt, args...) \
-	do { } while (0)
-#endif /* DEBUG */
-
-#ifdef VERBOSE_DEBUG
-#define VDBG	DBG
-#else
-#define VDBG(dev, fmt, args...) \
-	do { } while (0)
-#endif /* DEBUG */
-
-#define ERROR(dev, fmt, args...) \
-	xprintk(dev , KERN_ERR , fmt , ## args)
-#define INFO(dev, fmt, args...) \
-	xprintk(dev , KERN_INFO , fmt , ## args)
-
-/*-------------------------------------------------------------------------*/
-
 /* NETWORK DRIVER HOOKUP (to the layer above this driver) */
 
 static void eth_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *p)
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH V3 2/2] usb: gadget: u_ether: Don't warn in gether_setup_name_default()
  2023-02-09 12:53 [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints Jon Hunter
@ 2023-02-09 12:53 ` Jon Hunter
  2023-02-13 13:16   ` Andrzej Pietrasiewicz
  2023-02-13 13:49 ` [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints Andrzej Pietrasiewicz
  1 sibling, 1 reply; 7+ messages in thread
From: Jon Hunter @ 2023-02-09 12:53 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: linux-usb, linux-kernel, linux-tegra, Andrzej Pietrasiewicz, Jon Hunter

The function gether_setup_name_default() is called by various USB
ethernet gadget drivers. Calling this function will select a random
host and device MAC addresses. A properly working driver should be
silent and not warn the user about default MAC addresses selection.
Given that the MAC addresses are also printed when the function
gether_register_netdev() is called, remove these unnecessary warnings.

Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
---
V3: Updated patch to remove the prints completely.
V2: Changed print to debug instead of info.

 drivers/usb/gadget/function/u_ether.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
index 740331882e8d..953d936fbae6 100644
--- a/drivers/usb/gadget/function/u_ether.c
+++ b/drivers/usb/gadget/function/u_ether.c
@@ -811,13 +811,11 @@ struct net_device *gether_setup_name_default(const char *netname)
 	snprintf(net->name, sizeof(net->name), "%s%%d", netname);
 
 	eth_random_addr(dev->dev_mac);
-	pr_warn("using random %s ethernet address\n", "self");
 
 	/* by default we always have a random MAC address */
 	net->addr_assign_type = NET_ADDR_RANDOM;
 
 	eth_random_addr(dev->host_mac);
-	pr_warn("using random %s ethernet address\n", "host");
 
 	net->netdev_ops = &eth_netdev_ops;
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH V3 2/2] usb: gadget: u_ether: Don't warn in gether_setup_name_default()
  2023-02-09 12:53 ` [PATCH V3 2/2] usb: gadget: u_ether: Don't warn in gether_setup_name_default() Jon Hunter
@ 2023-02-13 13:16   ` Andrzej Pietrasiewicz
  0 siblings, 0 replies; 7+ messages in thread
From: Andrzej Pietrasiewicz @ 2023-02-13 13:16 UTC (permalink / raw)
  To: Jon Hunter, Greg Kroah-Hartman; +Cc: linux-usb, linux-kernel, linux-tegra

W dniu 9.02.2023 o 13:53, Jon Hunter pisze:
> The function gether_setup_name_default() is called by various USB
> ethernet gadget drivers. Calling this function will select a random
> host and device MAC addresses. A properly working driver should be
> silent and not warn the user about default MAC addresses selection.
> Given that the MAC addresses are also printed when the function
> gether_register_netdev() is called, remove these unnecessary warnings.
> 
> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>

Reviewed-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>

> ---
> V3: Updated patch to remove the prints completely.
> V2: Changed print to debug instead of info.
> 
>   drivers/usb/gadget/function/u_ether.c | 2 --
>   1 file changed, 2 deletions(-)
> 
> diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
> index 740331882e8d..953d936fbae6 100644
> --- a/drivers/usb/gadget/function/u_ether.c
> +++ b/drivers/usb/gadget/function/u_ether.c
> @@ -811,13 +811,11 @@ struct net_device *gether_setup_name_default(const char *netname)
>   	snprintf(net->name, sizeof(net->name), "%s%%d", netname);
>   
>   	eth_random_addr(dev->dev_mac);
> -	pr_warn("using random %s ethernet address\n", "self");
>   
>   	/* by default we always have a random MAC address */
>   	net->addr_assign_type = NET_ADDR_RANDOM;
>   
>   	eth_random_addr(dev->host_mac);
> -	pr_warn("using random %s ethernet address\n", "host");
>   
>   	net->netdev_ops = &eth_netdev_ops;
>   


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints
  2023-02-09 12:53 [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints Jon Hunter
  2023-02-09 12:53 ` [PATCH V3 2/2] usb: gadget: u_ether: Don't warn in gether_setup_name_default() Jon Hunter
@ 2023-02-13 13:49 ` Andrzej Pietrasiewicz
  2023-02-14 11:55   ` Jon Hunter
  2023-02-14 13:20   ` Greg Kroah-Hartman
  1 sibling, 2 replies; 7+ messages in thread
From: Andrzej Pietrasiewicz @ 2023-02-13 13:49 UTC (permalink / raw)
  To: Jon Hunter, Greg Kroah-Hartman; +Cc: linux-usb, linux-kernel, linux-tegra

Hi Jon,

W dniu 9.02.2023 o 13:53, Jon Hunter pisze:
> The USB ethernet gadget driver implements its own print macros which
> call printk. Device drivers should use the device prints that print the
> device name. Fortunately, the same macro names are defined in the header
> file 'linux/usb/composite.h' and these use the device prints. Therefore,
> remove the local definitions in the USB ethernet gadget driver and use
> those in 'linux/usb/composite.h'. The only difference is that now the
> device name is printed instead of the ethernet interface name.
> 
> Tested using ethernet gadget on Jetson AGX Orin.
> 
> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
> Tested-by: Jon Hunter <jonathanh@nvidia.com>
> ---
> V3: Added this patch and dropped the patch in V2 that improved some of
>      the prints.
> 
>   drivers/usb/gadget/function/u_ether.c | 36 +--------------------------
>   1 file changed, 1 insertion(+), 35 deletions(-)
> 
> diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
> index 8f12f3f8f6ee..740331882e8d 100644
> --- a/drivers/usb/gadget/function/u_ether.c
> +++ b/drivers/usb/gadget/function/u_ether.c
> @@ -17,6 +17,7 @@
>   #include <linux/etherdevice.h>
>   #include <linux/ethtool.h>
>   #include <linux/if_vlan.h>
> +#include <linux/usb/composite.h>
>   
>   #include "u_ether.h"
>   
> @@ -103,41 +104,6 @@ static inline int qlen(struct usb_gadget *gadget, unsigned qmult)
>   
>   /*-------------------------------------------------------------------------*/
>   
> -/* REVISIT there must be a better way than having two sets
> - * of debug calls ...
> - */
> -
> -#undef DBG
> -#undef VDBG
> -#undef ERROR
> -#undef INFO
> -
> -#define xprintk(d, level, fmt, args...) \
> -	printk(level "%s: " fmt , (d)->net->name , ## args)
> -
> -#ifdef DEBUG
> -#undef DEBUG
> -#define DBG(dev, fmt, args...) \
> -	xprintk(dev , KERN_DEBUG , fmt , ## args)
> -#else
> -#define DBG(dev, fmt, args...) \
> -	do { } while (0)
> -#endif /* DEBUG */

Actually there are more (at least hypothetical) changes than the declared
change of printed device name.

If DEBUG is not set there can be _more_ messages printed
when your patch is applied as-is (i.e. all DBG() invocations will
expand into some dev_dbg(), whereas before the patch is applied
they compile into nothing).

> -
> -#ifdef VERBOSE_DEBUG
> -#define VDBG	DBG
> -#else
> -#define VDBG(dev, fmt, args...) \
> -	do { } while (0)
> -#endif /* DEBUG */

In the same spirit, the above block could be considered valid.

Not sure, how much of an issue it is, though.

Regards,

Andrzej

> -
> -#define ERROR(dev, fmt, args...) \
> -	xprintk(dev , KERN_ERR , fmt , ## args)
> -#define INFO(dev, fmt, args...) \
> -	xprintk(dev , KERN_INFO , fmt , ## args)
> -
> -/*-------------------------------------------------------------------------*/
> -
>   /* NETWORK DRIVER HOOKUP (to the layer above this driver) */
>   
>   static void eth_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *p)


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints
  2023-02-13 13:49 ` [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints Andrzej Pietrasiewicz
@ 2023-02-14 11:55   ` Jon Hunter
  2023-02-14 13:20     ` Greg Kroah-Hartman
  2023-02-14 13:20   ` Greg Kroah-Hartman
  1 sibling, 1 reply; 7+ messages in thread
From: Jon Hunter @ 2023-02-14 11:55 UTC (permalink / raw)
  To: Andrzej Pietrasiewicz, Greg Kroah-Hartman
  Cc: linux-usb, linux-kernel, linux-tegra


On 13/02/2023 13:49, Andrzej Pietrasiewicz wrote:
> Hi Jon,
> 
> W dniu 9.02.2023 o 13:53, Jon Hunter pisze:
>> The USB ethernet gadget driver implements its own print macros which
>> call printk. Device drivers should use the device prints that print the
>> device name. Fortunately, the same macro names are defined in the header
>> file 'linux/usb/composite.h' and these use the device prints. Therefore,
>> remove the local definitions in the USB ethernet gadget driver and use
>> those in 'linux/usb/composite.h'. The only difference is that now the
>> device name is printed instead of the ethernet interface name.
>>
>> Tested using ethernet gadget on Jetson AGX Orin.
>>
>> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
>> Tested-by: Jon Hunter <jonathanh@nvidia.com>
>> ---
>> V3: Added this patch and dropped the patch in V2 that improved some of
>>      the prints.
>>
>>   drivers/usb/gadget/function/u_ether.c | 36 +--------------------------
>>   1 file changed, 1 insertion(+), 35 deletions(-)
>>
>> diff --git a/drivers/usb/gadget/function/u_ether.c 
>> b/drivers/usb/gadget/function/u_ether.c
>> index 8f12f3f8f6ee..740331882e8d 100644
>> --- a/drivers/usb/gadget/function/u_ether.c
>> +++ b/drivers/usb/gadget/function/u_ether.c
>> @@ -17,6 +17,7 @@
>>   #include <linux/etherdevice.h>
>>   #include <linux/ethtool.h>
>>   #include <linux/if_vlan.h>
>> +#include <linux/usb/composite.h>
>>   #include "u_ether.h"
>> @@ -103,41 +104,6 @@ static inline int qlen(struct usb_gadget *gadget, 
>> unsigned qmult)
>>   
>> /*-------------------------------------------------------------------------*/
>> -/* REVISIT there must be a better way than having two sets
>> - * of debug calls ...
>> - */
>> -
>> -#undef DBG
>> -#undef VDBG
>> -#undef ERROR
>> -#undef INFO
>> -
>> -#define xprintk(d, level, fmt, args...) \
>> -    printk(level "%s: " fmt , (d)->net->name , ## args)
>> -
>> -#ifdef DEBUG
>> -#undef DEBUG
>> -#define DBG(dev, fmt, args...) \
>> -    xprintk(dev , KERN_DEBUG , fmt , ## args)
>> -#else
>> -#define DBG(dev, fmt, args...) \
>> -    do { } while (0)
>> -#endif /* DEBUG */
> 
> Actually there are more (at least hypothetical) changes than the declared
> change of printed device name.
> 
> If DEBUG is not set there can be _more_ messages printed
> when your patch is applied as-is (i.e. all DBG() invocations will
> expand into some dev_dbg(), whereas before the patch is applied
> they compile into nothing).

So dev_dbg() messages will only be printed if DEBUG is defined or if 
dynamic debug is enabled and the prints are enabled.

Greg, let me know what your thoughts on this version are?

Thanks
Jon

-- 
nvpublic

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints
  2023-02-13 13:49 ` [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints Andrzej Pietrasiewicz
  2023-02-14 11:55   ` Jon Hunter
@ 2023-02-14 13:20   ` Greg Kroah-Hartman
  1 sibling, 0 replies; 7+ messages in thread
From: Greg Kroah-Hartman @ 2023-02-14 13:20 UTC (permalink / raw)
  To: Andrzej Pietrasiewicz; +Cc: Jon Hunter, linux-usb, linux-kernel, linux-tegra

On Mon, Feb 13, 2023 at 02:49:46PM +0100, Andrzej Pietrasiewicz wrote:
> Hi Jon,
> 
> W dniu 9.02.2023 o 13:53, Jon Hunter pisze:
> > The USB ethernet gadget driver implements its own print macros which
> > call printk. Device drivers should use the device prints that print the
> > device name. Fortunately, the same macro names are defined in the header
> > file 'linux/usb/composite.h' and these use the device prints. Therefore,
> > remove the local definitions in the USB ethernet gadget driver and use
> > those in 'linux/usb/composite.h'. The only difference is that now the
> > device name is printed instead of the ethernet interface name.
> > 
> > Tested using ethernet gadget on Jetson AGX Orin.
> > 
> > Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
> > Tested-by: Jon Hunter <jonathanh@nvidia.com>
> > ---
> > V3: Added this patch and dropped the patch in V2 that improved some of
> >      the prints.
> > 
> >   drivers/usb/gadget/function/u_ether.c | 36 +--------------------------
> >   1 file changed, 1 insertion(+), 35 deletions(-)
> > 
> > diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
> > index 8f12f3f8f6ee..740331882e8d 100644
> > --- a/drivers/usb/gadget/function/u_ether.c
> > +++ b/drivers/usb/gadget/function/u_ether.c
> > @@ -17,6 +17,7 @@
> >   #include <linux/etherdevice.h>
> >   #include <linux/ethtool.h>
> >   #include <linux/if_vlan.h>
> > +#include <linux/usb/composite.h>
> >   #include "u_ether.h"
> > @@ -103,41 +104,6 @@ static inline int qlen(struct usb_gadget *gadget, unsigned qmult)
> >   /*-------------------------------------------------------------------------*/
> > -/* REVISIT there must be a better way than having two sets
> > - * of debug calls ...
> > - */
> > -
> > -#undef DBG
> > -#undef VDBG
> > -#undef ERROR
> > -#undef INFO
> > -
> > -#define xprintk(d, level, fmt, args...) \
> > -	printk(level "%s: " fmt , (d)->net->name , ## args)
> > -
> > -#ifdef DEBUG
> > -#undef DEBUG
> > -#define DBG(dev, fmt, args...) \
> > -	xprintk(dev , KERN_DEBUG , fmt , ## args)
> > -#else
> > -#define DBG(dev, fmt, args...) \
> > -	do { } while (0)
> > -#endif /* DEBUG */
> 
> Actually there are more (at least hypothetical) changes than the declared
> change of printed device name.
> 
> If DEBUG is not set there can be _more_ messages printed
> when your patch is applied as-is (i.e. all DBG() invocations will
> expand into some dev_dbg(), whereas before the patch is applied
> they compile into nothing).

But if you do not manually set the call to dev_dbg() to be printed out,
it will not, so there should not be any functional change here.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints
  2023-02-14 11:55   ` Jon Hunter
@ 2023-02-14 13:20     ` Greg Kroah-Hartman
  0 siblings, 0 replies; 7+ messages in thread
From: Greg Kroah-Hartman @ 2023-02-14 13:20 UTC (permalink / raw)
  To: Jon Hunter; +Cc: Andrzej Pietrasiewicz, linux-usb, linux-kernel, linux-tegra

On Tue, Feb 14, 2023 at 11:55:56AM +0000, Jon Hunter wrote:
> 
> On 13/02/2023 13:49, Andrzej Pietrasiewicz wrote:
> > Hi Jon,
> > 
> > W dniu 9.02.2023 o 13:53, Jon Hunter pisze:
> > > The USB ethernet gadget driver implements its own print macros which
> > > call printk. Device drivers should use the device prints that print the
> > > device name. Fortunately, the same macro names are defined in the header
> > > file 'linux/usb/composite.h' and these use the device prints. Therefore,
> > > remove the local definitions in the USB ethernet gadget driver and use
> > > those in 'linux/usb/composite.h'. The only difference is that now the
> > > device name is printed instead of the ethernet interface name.
> > > 
> > > Tested using ethernet gadget on Jetson AGX Orin.
> > > 
> > > Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
> > > Tested-by: Jon Hunter <jonathanh@nvidia.com>
> > > ---
> > > V3: Added this patch and dropped the patch in V2 that improved some of
> > >      the prints.
> > > 
> > >   drivers/usb/gadget/function/u_ether.c | 36 +--------------------------
> > >   1 file changed, 1 insertion(+), 35 deletions(-)
> > > 
> > > diff --git a/drivers/usb/gadget/function/u_ether.c
> > > b/drivers/usb/gadget/function/u_ether.c
> > > index 8f12f3f8f6ee..740331882e8d 100644
> > > --- a/drivers/usb/gadget/function/u_ether.c
> > > +++ b/drivers/usb/gadget/function/u_ether.c
> > > @@ -17,6 +17,7 @@
> > >   #include <linux/etherdevice.h>
> > >   #include <linux/ethtool.h>
> > >   #include <linux/if_vlan.h>
> > > +#include <linux/usb/composite.h>
> > >   #include "u_ether.h"
> > > @@ -103,41 +104,6 @@ static inline int qlen(struct usb_gadget
> > > *gadget, unsigned qmult)
> > > /*-------------------------------------------------------------------------*/
> > > -/* REVISIT there must be a better way than having two sets
> > > - * of debug calls ...
> > > - */
> > > -
> > > -#undef DBG
> > > -#undef VDBG
> > > -#undef ERROR
> > > -#undef INFO
> > > -
> > > -#define xprintk(d, level, fmt, args...) \
> > > -    printk(level "%s: " fmt , (d)->net->name , ## args)
> > > -
> > > -#ifdef DEBUG
> > > -#undef DEBUG
> > > -#define DBG(dev, fmt, args...) \
> > > -    xprintk(dev , KERN_DEBUG , fmt , ## args)
> > > -#else
> > > -#define DBG(dev, fmt, args...) \
> > > -    do { } while (0)
> > > -#endif /* DEBUG */
> > 
> > Actually there are more (at least hypothetical) changes than the declared
> > change of printed device name.
> > 
> > If DEBUG is not set there can be _more_ messages printed
> > when your patch is applied as-is (i.e. all DBG() invocations will
> > expand into some dev_dbg(), whereas before the patch is applied
> > they compile into nothing).
> 
> So dev_dbg() messages will only be printed if DEBUG is defined or if dynamic
> debug is enabled and the prints are enabled.
> 
> Greg, let me know what your thoughts on this version are?

Looks good to me, let me queue it up now.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-02-14 13:20 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-09 12:53 [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints Jon Hunter
2023-02-09 12:53 ` [PATCH V3 2/2] usb: gadget: u_ether: Don't warn in gether_setup_name_default() Jon Hunter
2023-02-13 13:16   ` Andrzej Pietrasiewicz
2023-02-13 13:49 ` [PATCH V3 1/2] usb: gadget: u_ether: Convert prints to device prints Andrzej Pietrasiewicz
2023-02-14 11:55   ` Jon Hunter
2023-02-14 13:20     ` Greg Kroah-Hartman
2023-02-14 13:20   ` Greg Kroah-Hartman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).