Commit c0b59523 authored by Marc Kleine-Budde's avatar Marc Kleine-Budde
Browse files

Merge patch series "can: raw: optimize the sizes of struct uniqframe and struct raw_sock"

Vincent Mailhol <mailhol@kernel.org> says:

A few bytes can be shaved out of can raw's struct uniqframe and struct
raw_sock.

Patch #1 reorders struct uniqframe fields to save 8 bytes.

Patch #2 and #3 modify struct raw_sock to use bitfields and to reorder
its fields to save 24 bytes in total.

Link: https://patch.msgid.link/20250917-can-raw-repack-v2-0-395e8b3a4437@kernel.org


Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parents 2c9684bf a146cfaa
Loading
Loading
Loading
Loading
+38 −27
Original line number Diff line number Diff line
@@ -75,31 +75,31 @@ MODULE_ALIAS("can-proto-1");
 */

struct uniqframe {
	int skbcnt;
	const struct sk_buff *skb;
	int skbcnt;
	unsigned int join_rx_count;
};

struct raw_sock {
	struct sock sk;
	int bound;
	int ifindex;
	struct net_device *dev;
	netdevice_tracker dev_tracker;
	struct list_head notifier;
	int loopback;
	int recv_own_msgs;
	int fd_frames;
	int xl_frames;
	int ifindex;
	unsigned int bound:1;
	unsigned int loopback:1;
	unsigned int recv_own_msgs:1;
	unsigned int fd_frames:1;
	unsigned int xl_frames:1;
	unsigned int join_filters:1;
	struct can_raw_vcid_options raw_vcid_opts;
	canid_t tx_vcid_shifted;
	canid_t rx_vcid_shifted;
	canid_t rx_vcid_mask_shifted;
	int join_filters;
	can_err_mask_t err_mask;
	int count;                 /* number of active filters */
	struct can_filter dfilter; /* default/single filter */
	struct can_filter *filter; /* pointer to filter(s) */
	can_err_mask_t err_mask;
	struct uniqframe __percpu *uniq;
};

@@ -560,8 +560,8 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
	struct can_filter sfilter;         /* single filter */
	struct net_device *dev = NULL;
	can_err_mask_t err_mask = 0;
	int fd_frames;
	int count = 0;
	int flag;
	int err = 0;

	if (level != SOL_CAN_RAW)
@@ -682,44 +682,48 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
		break;

	case CAN_RAW_LOOPBACK:
		if (optlen != sizeof(ro->loopback))
		if (optlen != sizeof(flag))
			return -EINVAL;

		if (copy_from_sockptr(&ro->loopback, optval, optlen))
		if (copy_from_sockptr(&flag, optval, optlen))
			return -EFAULT;

		ro->loopback = !!flag;
		break;

	case CAN_RAW_RECV_OWN_MSGS:
		if (optlen != sizeof(ro->recv_own_msgs))
		if (optlen != sizeof(flag))
			return -EINVAL;

		if (copy_from_sockptr(&ro->recv_own_msgs, optval, optlen))
		if (copy_from_sockptr(&flag, optval, optlen))
			return -EFAULT;

		ro->recv_own_msgs = !!flag;
		break;

	case CAN_RAW_FD_FRAMES:
		if (optlen != sizeof(fd_frames))
		if (optlen != sizeof(flag))
			return -EINVAL;

		if (copy_from_sockptr(&fd_frames, optval, optlen))
		if (copy_from_sockptr(&flag, optval, optlen))
			return -EFAULT;

		/* Enabling CAN XL includes CAN FD */
		if (ro->xl_frames && !fd_frames)
		if (ro->xl_frames && !flag)
			return -EINVAL;

		ro->fd_frames = fd_frames;
		ro->fd_frames = !!flag;
		break;

	case CAN_RAW_XL_FRAMES:
		if (optlen != sizeof(ro->xl_frames))
		if (optlen != sizeof(flag))
			return -EINVAL;

		if (copy_from_sockptr(&ro->xl_frames, optval, optlen))
		if (copy_from_sockptr(&flag, optval, optlen))
			return -EFAULT;

		ro->xl_frames = !!flag;

		/* Enabling CAN XL includes CAN FD */
		if (ro->xl_frames)
			ro->fd_frames = ro->xl_frames;
@@ -739,12 +743,13 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
		break;

	case CAN_RAW_JOIN_FILTERS:
		if (optlen != sizeof(ro->join_filters))
		if (optlen != sizeof(flag))
			return -EINVAL;

		if (copy_from_sockptr(&ro->join_filters, optval, optlen))
		if (copy_from_sockptr(&flag, optval, optlen))
			return -EFAULT;

		ro->join_filters = !!flag;
		break;

	default:
@@ -758,6 +763,7 @@ static int raw_getsockopt(struct socket *sock, int level, int optname,
{
	struct sock *sk = sock->sk;
	struct raw_sock *ro = raw_sk(sk);
	int flag;
	int len;
	void *val;

@@ -806,25 +812,29 @@ static int raw_getsockopt(struct socket *sock, int level, int optname,
	case CAN_RAW_LOOPBACK:
		if (len > sizeof(int))
			len = sizeof(int);
		val = &ro->loopback;
		flag = ro->loopback;
		val = &flag;
		break;

	case CAN_RAW_RECV_OWN_MSGS:
		if (len > sizeof(int))
			len = sizeof(int);
		val = &ro->recv_own_msgs;
		flag = ro->recv_own_msgs;
		val = &flag;
		break;

	case CAN_RAW_FD_FRAMES:
		if (len > sizeof(int))
			len = sizeof(int);
		val = &ro->fd_frames;
		flag = ro->fd_frames;
		val = &flag;
		break;

	case CAN_RAW_XL_FRAMES:
		if (len > sizeof(int))
			len = sizeof(int);
		val = &ro->xl_frames;
		flag = ro->xl_frames;
		val = &flag;
		break;

	case CAN_RAW_XL_VCID_OPTS: {
@@ -849,7 +859,8 @@ static int raw_getsockopt(struct socket *sock, int level, int optname,
	case CAN_RAW_JOIN_FILTERS:
		if (len > sizeof(int))
			len = sizeof(int);
		val = &ro->join_filters;
		flag = ro->join_filters;
		val = &flag;
		break;

	default: